From 635efe54c3c74ceb79bfbfb1873bd300b1b11ec5 Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:23:02 +0000 Subject: [PATCH 001/371] CI/CD tests: - Disable all unitary tests - Disable all end-to-end tests but RyuOpenFlow --- .gitlab-ci.yml | 66 ++++++------ src/tests/.gitlab-ci.yml | 24 ++--- src/tests/ryu-openflow/.gitlab-ci.yml | 142 +++++++++----------------- 3 files changed, 93 insertions(+), 139 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1aa5e597d..cc85679d0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,39 +21,39 @@ stages: # include the individual .gitlab-ci.yml of each micro-service and tests include: - #- local: '/manifests/.gitlab-ci.yml' - - local: '/src/monitoring/.gitlab-ci.yml' - - local: '/src/nbi/.gitlab-ci.yml' - - local: '/src/context/.gitlab-ci.yml' - - local: '/src/device/.gitlab-ci.yml' - - local: '/src/service/.gitlab-ci.yml' - - local: '/src/dbscanserving/.gitlab-ci.yml' - - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - - local: '/src/opticalattackdetector/.gitlab-ci.yml' - - local: '/src/opticalattackmanager/.gitlab-ci.yml' - - local: '/src/opticalcontroller/.gitlab-ci.yml' - - local: '/src/ztp/.gitlab-ci.yml' - - local: '/src/policy/.gitlab-ci.yml' - - local: '/src/automation/.gitlab-ci.yml' - - local: '/src/forecaster/.gitlab-ci.yml' - #- local: '/src/webui/.gitlab-ci.yml' - #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - - local: '/src/slice/.gitlab-ci.yml' - #- local: '/src/interdomain/.gitlab-ci.yml' - - local: '/src/pathcomp/.gitlab-ci.yml' - #- local: '/src/dlt/.gitlab-ci.yml' - - local: '/src/load_generator/.gitlab-ci.yml' - - local: '/src/bgpls_speaker/.gitlab-ci.yml' - - local: '/src/kpi_manager/.gitlab-ci.yml' - - local: '/src/kpi_value_api/.gitlab-ci.yml' - #- local: '/src/kpi_value_writer/.gitlab-ci.yml' - #- local: '/src/telemetry/.gitlab-ci.yml' - - local: '/src/analytics/.gitlab-ci.yml' - - local: '/src/qos_profile/.gitlab-ci.yml' - - local: '/src/vnt_manager/.gitlab-ci.yml' - - local: '/src/e2e_orchestrator/.gitlab-ci.yml' +# #- local: '/manifests/.gitlab-ci.yml' +# - local: '/src/monitoring/.gitlab-ci.yml' +# - local: '/src/nbi/.gitlab-ci.yml' +# - local: '/src/context/.gitlab-ci.yml' +# - local: '/src/device/.gitlab-ci.yml' +# - local: '/src/service/.gitlab-ci.yml' +# - local: '/src/dbscanserving/.gitlab-ci.yml' +# - local: '/src/opticalattackmitigator/.gitlab-ci.yml' +# - local: '/src/opticalattackdetector/.gitlab-ci.yml' +# - local: '/src/opticalattackmanager/.gitlab-ci.yml' +# - local: '/src/opticalcontroller/.gitlab-ci.yml' +# - local: '/src/ztp/.gitlab-ci.yml' +# - local: '/src/policy/.gitlab-ci.yml' +# - local: '/src/automation/.gitlab-ci.yml' +# - local: '/src/forecaster/.gitlab-ci.yml' +# #- local: '/src/webui/.gitlab-ci.yml' +# #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' +# - local: '/src/slice/.gitlab-ci.yml' +# #- local: '/src/interdomain/.gitlab-ci.yml' +# - local: '/src/pathcomp/.gitlab-ci.yml' +# #- local: '/src/dlt/.gitlab-ci.yml' +# - local: '/src/load_generator/.gitlab-ci.yml' +# - local: '/src/bgpls_speaker/.gitlab-ci.yml' +# - local: '/src/kpi_manager/.gitlab-ci.yml' +# - local: '/src/kpi_value_api/.gitlab-ci.yml' +# #- local: '/src/kpi_value_writer/.gitlab-ci.yml' +# #- local: '/src/telemetry/.gitlab-ci.yml' +# - local: '/src/analytics/.gitlab-ci.yml' +# - local: '/src/qos_profile/.gitlab-ci.yml' +# - local: '/src/vnt_manager/.gitlab-ci.yml' +# - local: '/src/e2e_orchestrator/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index dfccc4726..775bf2167 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -14,16 +14,16 @@ # include the individual .gitlab-ci.yml of each end-to-end integration test include: - - local: '/src/tests/ofc22/.gitlab-ci.yml' - #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' - - local: '/src/tests/ecoc22/.gitlab-ci.yml' - #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' - #- local: '/src/tests/ofc23/.gitlab-ci.yml' - - local: '/src/tests/ofc24/.gitlab-ci.yml' - - local: '/src/tests/eucnc24/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25/.gitlab-ci.yml' - #- local: '/src/tests/ryu-openflow/.gitlab-ci.yml' +# - local: '/src/tests/ofc22/.gitlab-ci.yml' +# #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' +# - local: '/src/tests/ecoc22/.gitlab-ci.yml' +# #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' +# #- local: '/src/tests/ofc23/.gitlab-ci.yml' +# - local: '/src/tests/ofc24/.gitlab-ci.yml' +# - local: '/src/tests/eucnc24/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' +# #- local: '/src/tests/ofc25/.gitlab-ci.yml' + - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' - - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' +# - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 42d595384..112d3b68e 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -56,27 +56,29 @@ build ryu-openflow: # asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh -## Deploy TeraFlowSDN and Execute end-2-end test -#end2end_test ryu-openflow: -# timeout: 90m -# variables: -# TEST_NAME: 'ryu-openflow' -# stage: end2end_test -# # Disable to force running it after all other tasks -# #needs: -# # - build ryu-openflow -# before_script: -# - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY -# - docker ps -aq | xargs -r docker rm -f -# - containerlab destroy --all --cleanup || true -# script: -# # Download Docker image to run the test -# - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" -# -# # Check MicroK8s is ready -# - microk8s status --wait-ready -# - kubectl get pods --all-namespaces -# +# Deploy TeraFlowSDN and Execute end-2-end test +end2end_test ryu-openflow: + timeout: 90m + variables: + TEST_NAME: 'ryu-openflow' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + stage: end2end_test + # Disable to force running it after all other tasks + #needs: + # - build ryu-openflow + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - docker ps -aq | xargs -r docker rm -f + #- containerlab destroy --all --cleanup || true + # cleanup mininet + script: + # Download Docker image to run the test + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" + + # Check MicroK8s is ready + - microk8s status --wait-ready + - kubectl get pods --all-namespaces + # # Deploy ContainerLab Scenario # - RUNNER_PATH=`pwd` # #- cd $PWD/src/tests/${TEST_NAME} @@ -86,16 +88,15 @@ build ryu-openflow: # - cd /tmp/clab/${TEST_NAME} # - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml # - cd $RUNNER_PATH -# + +# deploy ryu + +# deploy mininet + # # Wait for initialization of Device NOSes # - sleep 3 # - docker ps -a # -# # Dump configuration of the routers (before any configuration) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# # # Configure TeraFlowSDN deployment # # Uncomment if DEBUG log level is needed for the components # #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml @@ -145,49 +146,7 @@ build ryu-openflow: # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" # $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh # -# # Run end-to-end test: configure service TFS -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-create.sh -# -# # Dump configuration of the routers (after configure TFS service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# -# # Run end-to-end test: test connectivity with ping -# - export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) -# - echo $TEST1_10 -# - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST1_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json) -# - echo $TEST1_1 -# - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json) -# - echo $TEST2_1 -# - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST2_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json) -# - echo $TEST2_10 -# - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss' -# - export TEST3_1=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json) -# - echo $TEST3_1 -# - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# - export TEST3_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json) -# - echo $TEST3_10 -# - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss' -# -# # Run end-to-end test: deconfigure service TFS -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-remove.sh -# -# # Dump configuration of the routers (after deconfigure TFS service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" +# # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) # # # Run end-to-end test: configure service IETF # - > @@ -196,10 +155,7 @@ build ryu-openflow: # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" # $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh # -# # Dump configuration of the routers (after configure IETF service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" +# # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) # # # Run end-to-end test: test connectivity with ping # - export TEST1_10=$(containerlab exec --name ryu-openflow --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json) @@ -228,10 +184,7 @@ build ryu-openflow: # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" # $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-remove.sh # -# # Dump configuration of the routers (after deconfigure IETF service) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" +# # Dump configuration of the switches (OpenFlow rules configured) (after deconfigure IETF service) # # # Run end-to-end test: cleanup scenario # - > @@ -241,10 +194,7 @@ build ryu-openflow: # $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh # # after_script: -# # Dump configuration of the routers (on after_script) -# - containerlab exec --name ryu-openflow --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" -# - containerlab exec --name ryu-openflow --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" +# # Dump configuration of the switches (OpenFlow rules configured) (on after_script) # # # Dump TeraFlowSDN component logs # - source src/tests/${TEST_NAME}/deploy_specs.sh @@ -262,17 +212,21 @@ build ryu-openflow: # - cd /tmp/clab/${TEST_NAME} # - containerlab destroy --topo ryu-openflow.clab.yml --cleanup || true # - sudo rm -rf clab-ryu-openflow/ .ryu-openflow.clab.yml.bak || true + +# destroy ryu +# destroy mininet + # - cd $RUNNER_PATH # - kubectl delete namespaces tfs || true -# -# # Clean old docker images -# - docker images --filter="dangling=true" --quiet | xargs -r docker rmi -# -# #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' -# rules: -# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' -# artifacts: -# when: always -# reports: -# junit: ./src/tests/${TEST_NAME}/report_*.xml + + # Clean old docker images + - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + + #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + artifacts: + when: always + reports: + junit: ./src/tests/${TEST_NAME}/report_*.xml -- GitLab From adc467739b09706b06d14fdbe7137edabebb28b6 Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:26:30 +0000 Subject: [PATCH 002/371] CI/CD test Ryu-OpenFlow fix --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 112d3b68e..642a49da5 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -61,7 +61,7 @@ end2end_test ryu-openflow: timeout: 90m variables: TEST_NAME: 'ryu-openflow' - IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: end2end_test # Disable to force running it after all other tasks #needs: -- GitLab From 8a1310455a3dff33345f828ca0550ea53cad5fe2 Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:37:17 +0000 Subject: [PATCH 003/371] Fix CI/CD pipeline for Ryu OpenFlow test --- src/tests/ryu-openflow/.gitlab-ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 642a49da5..b068bd2cc 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -28,13 +28,15 @@ build ryu-openflow: - echo "CI_MERGE_REQUEST_IID = $CI_MERGE_REQUEST_IID" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Mininet.Dockerfile . + - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" after_script: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto @@ -72,8 +74,10 @@ end2end_test ryu-openflow: #- containerlab destroy --all --cleanup || true # cleanup mininet script: - # Download Docker image to run the test - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" + # Download Docker images to run the test + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" # Check MicroK8s is ready - microk8s status --wait-ready @@ -225,7 +229,7 @@ end2end_test ryu-openflow: #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' artifacts: when: always reports: -- GitLab From 63c64cc0cd18c09e203fd2a3e303e2e2dc4a0332 Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:42:28 +0000 Subject: [PATCH 004/371] Fix CI/CD pipeline --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cc85679d0..1657d3dc0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,12 @@ stages: - unit_test - end2end_test +workflow: + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + when: always + - when: never + # include the individual .gitlab-ci.yml of each micro-service and tests include: # #- local: '/manifests/.gitlab-ci.yml' -- GitLab From 1ce39e9c7053a0d976571cd84b8395442a366bfe Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:45:22 +0000 Subject: [PATCH 005/371] Fix CI/CD pipeline for Ryu OpenFlow --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ---- src/tests/ryu-openflow/Mininet.Dockerfile | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index b068bd2cc..f66a0f135 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -21,11 +21,7 @@ build ryu-openflow: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f - - containerlab destroy --all --cleanup || true script: - - echo "CI_PIPELINE_SOURCE = $CI_PIPELINE_SOURCE" - - echo "CI_MERGE_REQUEST_ID = $CI_MERGE_REQUEST_ID" - - echo "CI_MERGE_REQUEST_IID = $CI_MERGE_REQUEST_IID" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Mininet.Dockerfile . diff --git a/src/tests/ryu-openflow/Mininet.Dockerfile b/src/tests/ryu-openflow/Mininet.Dockerfile index a465297e4..0a829bb49 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/ryu-openflow/Mininet.Dockerfile @@ -22,6 +22,6 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -COPY custom_pentagon_topology.py /opt/custom_pentagon_topology.py +COPY src/tests/ryu-openflow/custom_pentagon_topology.py /opt/custom_pentagon_topology.py CMD ["python3", "/opt/custom_pentagon_topology.py"] -- GitLab From 3c76230f71ce6c9f4d7f9c154ff1b8c648e5c9cd Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Fri, 30 May 2025 11:49:07 +0000 Subject: [PATCH 006/371] CI/CD pipeline fix on Ryu OpenFlow --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index f66a0f135..734cf49a0 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -25,7 +25,7 @@ build ryu-openflow: - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Mininet.Dockerfile . - - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" after_script: -- GitLab From cf2b4b99d7155f7aed38a53a369f5233f89679bf Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 30 May 2025 13:48:48 +0000 Subject: [PATCH 007/371] deploy ryu and mininet --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 734cf49a0..5ea18b234 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -69,7 +69,8 @@ end2end_test ryu-openflow: - docker ps -aq | xargs -r docker rm -f #- containerlab destroy --all --cleanup || true # cleanup mininet - script: + - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c + # Download Docker images to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" @@ -90,12 +91,15 @@ end2end_test ryu-openflow: # - cd $RUNNER_PATH # deploy ryu + - docker network create tfs-test-net + - docker run -d --name ryu --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" # deploy mininet + - docker run -d --name mininet --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes -# - sleep 3 -# - docker ps -a + - sleep 10 + - docker ps -a # # # Configure TeraFlowSDN deployment # # Uncomment if DEBUG log level is needed for the components -- GitLab From 4744209b62cf74e73456ef41a3aacb761f0e4046 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 30 May 2025 13:55:31 +0000 Subject: [PATCH 008/371] Update file .gitlab-ci.yml --- src/tests/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 775bf2167..c3faacd02 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -24,6 +24,6 @@ include: # #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' # #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' # #- local: '/src/tests/ofc25/.gitlab-ci.yml' - - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' + - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' # - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' -- GitLab From 1b5f0857dabfe8874456b5cff0bcfb791ca5d177 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 30 May 2025 13:58:16 +0000 Subject: [PATCH 009/371] Update 2 files - /src/tests/.gitlab-ci.yml - /src/tests/ryu-openflow/.gitlab-ci.yml --- src/tests/.gitlab-ci.yml | 2 +- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index c3faacd02..775bf2167 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -24,6 +24,6 @@ include: # #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' # #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' # #- local: '/src/tests/ofc25/.gitlab-ci.yml' - - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' + - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' # - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 5ea18b234..90f3ffdc7 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -70,7 +70,7 @@ end2end_test ryu-openflow: #- containerlab destroy --all --cleanup || true # cleanup mininet - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c - + script: # Download Docker images to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -- GitLab From ad271ace673950aaafe3b7d8009ee1624ff45288 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 09:38:45 +0000 Subject: [PATCH 010/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 77 +++++++++++++++------------ 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 90f3ffdc7..70451fc36 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -91,38 +91,47 @@ end2end_test ryu-openflow: # - cd $RUNNER_PATH # deploy ryu - - docker network create tfs-test-net - - docker run -d --name ryu --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker network create -d bridge \ + --subnet=172.254.254.0/24 \ + --gateway=172.254.254.1 \ + tfs-test-net -# deploy mininet - - docker run -d --name mininet --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker run -d --name ryu \ + --network tfs-test-net \ + --ip 172.254.254.10 \ + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + + # deploy mininet + - docker run -d --name mininet \ + --network tfs-test-net \ + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes - sleep 10 - docker ps -a # -# # Configure TeraFlowSDN deployment -# # Uncomment if DEBUG log level is needed for the components -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml -# #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml -# -# - source src/tests/${TEST_NAME}/deploy_specs.sh -# #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" -# #- export TFS_SKIP_BUILD="YES" -# #- export TFS_IMAGE_TAG="latest" -# #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -# -# # Deploy TeraFlowSDN -# - ./deploy/crdb.sh -# - ./deploy/nats.sh -# - ./deploy/kafka.sh -# - ./deploy/qdb.sh -# - ./deploy/tfs.sh -# - ./deploy/show.sh + Configure TeraFlowSDN deployment + # Uncomment if DEBUG log level is needed for the components + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml +# + - source src/tests/${TEST_NAME}/deploy_specs.sh + - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + - export TFS_SKIP_BUILD="YES" + - export TFS_IMAGE_TAG="latest" + - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" +# + Deploy TeraFlowSDN + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + - ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). @@ -141,14 +150,14 @@ end2end_test ryu-openflow: # # break # # fi # # done -# - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server -# -# # Run end-to-end test: onboard scenario -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-onboarding.sh + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server +# + # Run end-to-end test: onboard scenario + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh # # # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) # -- GitLab From a38cc19288116d6635c812a2271e0f8ba34509a8 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 09:44:43 +0000 Subject: [PATCH 011/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 70451fc36..b05d55a60 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -90,21 +90,11 @@ end2end_test ryu-openflow: # - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml # - cd $RUNNER_PATH -# deploy ryu - - docker network create -d bridge \ - --subnet=172.254.254.0/24 \ - --gateway=172.254.254.1 \ - tfs-test-net - - - docker run -d --name ryu \ - --network tfs-test-net \ - --ip 172.254.254.10 \ - "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - # deploy mininet - - docker run -d --name mininet \ - --network tfs-test-net \ - "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker network rm tfs-test-net || true + - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-net + - docker run -d --name ryu --network tfs-test-net --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes - sleep 10 -- GitLab From 2641069e3400cba12a406b44b0701a56044dad8b Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 09:49:09 +0000 Subject: [PATCH 012/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index b05d55a60..0e512db95 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -91,10 +91,9 @@ end2end_test ryu-openflow: # - cd $RUNNER_PATH - docker network rm tfs-test-net || true - - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-net - - docker run -d --name ryu --network tfs-test-net --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker run -d --name mininet --network tfs-test-net "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes - sleep 10 -- GitLab From e556845778382f66181d2441c7d853504999a57c Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 09:54:03 +0000 Subject: [PATCH 013/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 0e512db95..13c80f075 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu-openflow: +end2end_test_ryu-openflow: timeout: 90m variables: TEST_NAME: 'ryu-openflow' -- GitLab From 673008a3bf8682f1ad53a07e7c4f390fa47e267a Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 09:55:13 +0000 Subject: [PATCH 014/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 13c80f075..30df68f52 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test_ryu-openflow: +end2end_test ryu-openflow: timeout: 90m variables: TEST_NAME: 'ryu-openflow' @@ -90,10 +90,10 @@ end2end_test_ryu-openflow: # - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml # - cd $RUNNER_PATH - - docker network rm tfs-test-net || true - - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + # - docker network rm tfs-test-net || true + # - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + # - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + # - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes - sleep 10 -- GitLab From fddc8cb86418fea2b5ae4b1baffeab5305cdf106 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:07:32 +0000 Subject: [PATCH 015/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 30df68f52..6b790de61 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -32,7 +32,6 @@ build ryu-openflow: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto @@ -90,10 +89,10 @@ end2end_test ryu-openflow: # - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml # - cd $RUNNER_PATH - # - docker network rm tfs-test-net || true - # - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - # - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - # - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker network rm tfs-test-net || true + - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # # Wait for initialization of Device NOSes - sleep 10 -- GitLab From 03705c1504a92749e5f4a6e0d4b455e232496b2e Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:15:28 +0000 Subject: [PATCH 016/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 93 ++++++++++++++------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 6b790de61..c3d262a88 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -32,6 +32,7 @@ build ryu-openflow: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto @@ -69,15 +70,15 @@ end2end_test ryu-openflow: #- containerlab destroy --all --cleanup || true # cleanup mininet - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c - script: - # Download Docker images to run the test - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" + #script: + ## Download Docker images to run the test + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" # Check MicroK8s is ready - - microk8s status --wait-ready - - kubectl get pods --all-namespaces + #- microk8s status --wait-ready + #- kubectl get pods --all-namespaces # # Deploy ContainerLab Scenario # - RUNNER_PATH=`pwd` @@ -89,37 +90,37 @@ end2end_test ryu-openflow: # - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml # - cd $RUNNER_PATH - - docker network rm tfs-test-net || true - - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - -# # Wait for initialization of Device NOSes - - sleep 10 - - docker ps -a -# - Configure TeraFlowSDN deployment - # Uncomment if DEBUG log level is needed for the components - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml -# - - source src/tests/${TEST_NAME}/deploy_specs.sh - - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" - - export TFS_SKIP_BUILD="YES" - - export TFS_IMAGE_TAG="latest" - - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -# - Deploy TeraFlowSDN - - ./deploy/crdb.sh - - ./deploy/nats.sh - - ./deploy/kafka.sh - - ./deploy/qdb.sh - - ./deploy/tfs.sh - - ./deploy/show.sh + #- docker network rm tfs-test-net || true + #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + #- docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + #- docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" +# +# # # Wait for initialization of Device NOSes + #- sleep 10 + #- docker ps -a +## + # Configure TeraFlowSDN deployment + ## Uncomment if DEBUG log level is needed for the components + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml +## + #- source src/tests/${TEST_NAME}/deploy_specs.sh + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" +# + # Deploy TeraFlowSDN + # - ./deploy/crdb.sh + # - ./deploy/nats.sh + # - ./deploy/kafka.sh + # - ./deploy/qdb.sh + # - ./deploy/tfs.sh + # - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). @@ -138,14 +139,14 @@ end2end_test ryu-openflow: # # break # # fi # # done - - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server -# - # Run end-to-end test: onboard scenario - - > - docker run -t --rm --name ${TEST_NAME} --network=host - --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" - --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh + #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + + ## Run end-to-end test: onboard scenario + #- > + # docker run -t --rm --name ${TEST_NAME} --network=host + # --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + # $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh # # # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) # -- GitLab From 4aeb762f6bb9644ebda60fc3c6857f9bcfd97458 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:16:15 +0000 Subject: [PATCH 017/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index c3d262a88..0fff56ed0 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -64,12 +64,12 @@ end2end_test ryu-openflow: # Disable to force running it after all other tasks #needs: # - build ryu-openflow - before_script: - - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - - docker ps -aq | xargs -r docker rm -f - #- containerlab destroy --all --cleanup || true - # cleanup mininet - - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c + #before_script: + # - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + # - docker ps -aq | xargs -r docker rm -f + # #- containerlab destroy --all --cleanup || true + # # cleanup mininet + # - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c #script: ## Download Docker images to run the test #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" -- GitLab From 78245bf36615961c9fa9325048efe661baa2c176 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:16:38 +0000 Subject: [PATCH 018/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 0fff56ed0..d70e1a443 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,12 +55,12 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu-openflow: - timeout: 90m - variables: - TEST_NAME: 'ryu-openflow' - IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' - stage: end2end_test +#end2end_test ryu-openflow: + #timeout: 90m + #variables: + #TEST_NAME: 'ryu-openflow' + #IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + #stage: end2end_test # Disable to force running it after all other tasks #needs: # - build ryu-openflow -- GitLab From 815d4ebe471d2e6beebf870e3e9c76d75d2dbea8 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:19:15 +0000 Subject: [PATCH 019/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d70e1a443..8db2f7cd6 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,9 +55,9 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -#end2end_test ryu-openflow: - #timeout: 90m - #variables: +end2end_test ryu-openflow: + timeout: 90m + variables: #TEST_NAME: 'ryu-openflow' #IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' #stage: end2end_test -- GitLab From b433da472f601756fa1bdb156569801c6d6588e5 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:20:48 +0000 Subject: [PATCH 020/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 8db2f7cd6..47a971965 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu-openflow: +end2end_test ryu_openflow: timeout: 90m variables: #TEST_NAME: 'ryu-openflow' -- GitLab From 7ba83be56e7a7568dd86787614a85a60a8ad9fd4 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:28:13 +0000 Subject: [PATCH 021/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 47a971965..d394c7681 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -58,8 +58,8 @@ build ryu-openflow: end2end_test ryu_openflow: timeout: 90m variables: - #TEST_NAME: 'ryu-openflow' - #IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + TEST_NAME: 'ryu-openflow' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' #stage: end2end_test # Disable to force running it after all other tasks #needs: -- GitLab From cb1fc9ed0516a8bdacebf134cb29399d4dad9a58 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:29:01 +0000 Subject: [PATCH 022/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d394c7681..23e653ec2 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu_openflow: +end2end_test ryu-openflow: timeout: 90m variables: TEST_NAME: 'ryu-openflow' -- GitLab From ba49d86d61c5f407fa3bfffd69e8753ba852771c Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:30:44 +0000 Subject: [PATCH 023/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 23e653ec2..b34f292f9 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,11 +55,11 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu-openflow: - timeout: 90m - variables: - TEST_NAME: 'ryu-openflow' - IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' +#end2end_test ryu-openflow: +# timeout: 90m +# variables: +# TEST_NAME: 'ryu-openflow' +# IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' #stage: end2end_test # Disable to force running it after all other tasks #needs: -- GitLab From 68c651e6f72f760fdcde8f604e3d3a8bd7132041 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:32:26 +0000 Subject: [PATCH 024/371] add --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index b34f292f9..23e653ec2 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,11 +55,11 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -#end2end_test ryu-openflow: -# timeout: 90m -# variables: -# TEST_NAME: 'ryu-openflow' -# IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' +end2end_test ryu-openflow: + timeout: 90m + variables: + TEST_NAME: 'ryu-openflow' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' #stage: end2end_test # Disable to force running it after all other tasks #needs: -- GitLab From fe57292f3192b1822c3d258100a8f5daba17d24f Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:35:48 +0000 Subject: [PATCH 025/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 23e653ec2..e61312254 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -56,10 +56,10 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: - timeout: 90m - variables: - TEST_NAME: 'ryu-openflow' - IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + #timeout: 90m + #variables: + # TEST_NAME: 'ryu-openflow' + # IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' #stage: end2end_test # Disable to force running it after all other tasks #needs: -- GitLab From adac956f787c453986dba96d07bc3a6e0cec99bb Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 10:36:16 +0000 Subject: [PATCH 026/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index e61312254..dafafe3d9 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ryu-openflow: + end2end_test ryu-openflow: #timeout: 90m #variables: # TEST_NAME: 'ryu-openflow' -- GitLab From f8a94d53431ec3219c6cd2164ab657725f15f2c1 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:07:53 +0000 Subject: [PATCH 027/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index dafafe3d9..adbeeaa06 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -55,7 +55,7 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test - end2end_test ryu-openflow: +end2end_test ryu-openflow: #timeout: 90m #variables: # TEST_NAME: 'ryu-openflow' @@ -70,7 +70,7 @@ build ryu-openflow: # #- containerlab destroy --all --cleanup || true # # cleanup mininet # - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c - #script: + script: ## Download Docker images to run the test #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -- GitLab From 714c08d53cda15a15d7184b4a42229c142653d6f Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:10:28 +0000 Subject: [PATCH 028/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 65 +++++++++++---------------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index adbeeaa06..624b35d35 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -56,49 +56,38 @@ build ryu-openflow: # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: - #timeout: 90m - #variables: - # TEST_NAME: 'ryu-openflow' - # IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' - #stage: end2end_test - # Disable to force running it after all other tasks - #needs: - # - build ryu-openflow - #before_script: - # - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - # - docker ps -aq | xargs -r docker rm -f - # #- containerlab destroy --all --cleanup || true - # # cleanup mininet - # - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c + timeout: 90m + variables: + TEST_NAME: 'ryu-openflow' + IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' + stage: end2end_test + Disable to force running it after all other tasks + needs: + - build ryu-openflow + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - docker ps -aq | xargs -r docker rm -f + #- containerlab destroy --all --cleanup || true + # cleanup mininet + - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: ## Download Docker images to run the test - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" # Check MicroK8s is ready - #- microk8s status --wait-ready - #- kubectl get pods --all-namespaces + - microk8s status --wait-ready + - kubectl get pods --all-namespaces + #run ryu and mininet + - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -# # Deploy ContainerLab Scenario -# - RUNNER_PATH=`pwd` -# #- cd $PWD/src/tests/${TEST_NAME} -# - mkdir -p /tmp/clab/${TEST_NAME} -# - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME} -# - tree -la /tmp/clab/${TEST_NAME} -# - cd /tmp/clab/${TEST_NAME} -# - containerlab deploy --reconfigure --topo ryu-openflow.clab.yml -# - cd $RUNNER_PATH - - #- docker network rm tfs-test-net || true - #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - #- docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - #- docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -# -# # # Wait for initialization of Device NOSes - #- sleep 10 - #- docker ps -a -## + # Wait for initialization of Device NOSes + - sleep 10 + - docker ps -a +# # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml -- GitLab From 76869645c23fd3075d12f0a655e2e577f1da848b Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:12:39 +0000 Subject: [PATCH 029/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 624b35d35..5babf4998 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -71,22 +71,25 @@ end2end_test ryu-openflow: # cleanup mininet - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: + - echo "Starting script section" ## Download Docker images to run the test - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" - # Check MicroK8s is ready - - microk8s status --wait-ready - - kubectl get pods --all-namespaces - #run ryu and mininet - - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - # Wait for initialization of Device NOSes - - sleep 10 - - docker ps -a + ## Check MicroK8s is ready + #- microk8s status --wait-ready + #- kubectl get pods --all-namespaces + ##run ryu and mininet + #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + #- docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + #- docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" +# + ## Wait for initialization of Device NOSes + #- sleep 10 + #- docker ps -a + - echo "Finishing script section" # # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components -- GitLab From d91f6d0a6f7c925bf2bb721d4f78a202ce35f5af Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:13:33 +0000 Subject: [PATCH 030/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 5babf4998..d153ef2b4 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -61,7 +61,7 @@ end2end_test ryu-openflow: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: end2end_test - Disable to force running it after all other tasks + #Disable to force running it after all other tasks needs: - build ryu-openflow before_script: -- GitLab From bfd6337b06b2d4f38ba307da373b55e4d3888bd4 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:14:57 +0000 Subject: [PATCH 031/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d153ef2b4..16e5528db 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -73,9 +73,9 @@ end2end_test ryu-openflow: script: - echo "Starting script section" ## Download Docker images to run the test - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" - #- docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" ## Check MicroK8s is ready -- GitLab From c2cb05501e0829a2a47ec1a6e8cdf1890d4e4337 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:15:42 +0000 Subject: [PATCH 032/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 16e5528db..e75535e92 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -79,16 +79,16 @@ end2end_test ryu-openflow: ## Check MicroK8s is ready - #- microk8s status --wait-ready - #- kubectl get pods --all-namespaces + - microk8s status --wait-ready + - kubectl get pods --all-namespaces ##run ryu and mininet - #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - #- docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - #- docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes - #- sleep 10 - #- docker ps -a + - sleep 10 + - docker ps -a - echo "Finishing script section" # # Configure TeraFlowSDN deployment -- GitLab From dc2ad01005262b322da001c804baca736d6f00a4 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:26:57 +0000 Subject: [PATCH 033/371] adding switches configuration --- src/tests/ryu-openflow/.gitlab-ci.yml | 50 +++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index e75535e92..bf7f8acb3 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -100,19 +100,19 @@ end2end_test ryu-openflow: #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml ## - #- source src/tests/${TEST_NAME}/deploy_specs.sh - #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" - #- export TFS_SKIP_BUILD="YES" - #- export TFS_IMAGE_TAG="latest" - #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -# - # Deploy TeraFlowSDN - # - ./deploy/crdb.sh - # - ./deploy/nats.sh - # - ./deploy/kafka.sh - # - ./deploy/qdb.sh - # - ./deploy/tfs.sh - # - ./deploy/show.sh + - source src/tests/${TEST_NAME}/deploy_specs.sh + - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + - export TFS_SKIP_BUILD="YES" + - export TFS_IMAGE_TAG="latest" + - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" +# + Deploy TeraFlowSDN + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + - ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). @@ -131,17 +131,23 @@ end2end_test ryu-openflow: # # break # # fi # # done - #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Run end-to-end test: onboard scenario - #- > - # docker run -t --rm --name ${TEST_NAME} --network=host - # --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" - # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - # $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh -# -# # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) -# + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh + +# Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 + + # # Run end-to-end test: configure service IETF # - > # docker run -t --rm --name ${TEST_NAME} --network=host -- GitLab From 4227158cef351cde37eb4fb1fdb6e959d1e75564 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:28:58 +0000 Subject: [PATCH 034/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 48 +++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index bf7f8acb3..6eed537ed 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -100,19 +100,19 @@ end2end_test ryu-openflow: #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml ## - - source src/tests/${TEST_NAME}/deploy_specs.sh - - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" - - export TFS_SKIP_BUILD="YES" - - export TFS_IMAGE_TAG="latest" - - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -# - Deploy TeraFlowSDN - - ./deploy/crdb.sh - - ./deploy/nats.sh - - ./deploy/kafka.sh - - ./deploy/qdb.sh - - ./deploy/tfs.sh - - ./deploy/show.sh + #- source src/tests/${TEST_NAME}/deploy_specs.sh + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" +## + # Deploy TeraFlowSDN + #- ./deploy/crdb.sh + #- ./deploy/nats.sh + #- ./deploy/kafka.sh + #- ./deploy/qdb.sh + #- ./deploy/tfs.sh + #- ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). @@ -131,21 +131,21 @@ end2end_test ryu-openflow: # # break # # fi # # done - - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Run end-to-end test: onboard scenario - - > - docker run -t --rm --name ${TEST_NAME} --network=host - --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" - --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh + #- > + # docker run -t --rm --name ${TEST_NAME} --network=host + # --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + # $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 + #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 + #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 + #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 + #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 + #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 # # Run end-to-end test: configure service IETF -- GitLab From cd6a36db2c44c93398d81eab57115a8cce89641a Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:30:23 +0000 Subject: [PATCH 035/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 6eed537ed..79bfbb3be 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -100,11 +100,11 @@ end2end_test ryu-openflow: #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml ## - #- source src/tests/${TEST_NAME}/deploy_specs.sh - #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" - #- export TFS_SKIP_BUILD="YES" - #- export TFS_IMAGE_TAG="latest" - #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" + - source src/tests/${TEST_NAME}/deploy_specs.sh + - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + - export TFS_SKIP_BUILD="YES" + - export TFS_IMAGE_TAG="latest" + - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" ## # Deploy TeraFlowSDN #- ./deploy/crdb.sh -- GitLab From 7fc724046961d96ffc92f1e659d1ef49df7eaf23 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:34:22 +0000 Subject: [PATCH 036/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 79bfbb3be..72ccbf74e 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -82,6 +82,8 @@ end2end_test ryu-openflow: - microk8s status --wait-ready - kubectl get pods --all-namespaces ##run ryu and mininet + - docker rm -f ryu mininet || true + - docker network rm tfs-test-ryu || true - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" @@ -107,12 +109,12 @@ end2end_test ryu-openflow: - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" ## # Deploy TeraFlowSDN - #- ./deploy/crdb.sh - #- ./deploy/nats.sh - #- ./deploy/kafka.sh - #- ./deploy/qdb.sh - #- ./deploy/tfs.sh - #- ./deploy/show.sh + - ./deploy/crdb.sh + - ./deploy/nats.sh + - ./deploy/kafka.sh + - ./deploy/qdb.sh + - ./deploy/tfs.sh + - ./deploy/show.sh # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). -- GitLab From a36567dd48b7a1f3c3a34681d74d7c563895d7a1 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 11:39:02 +0000 Subject: [PATCH 037/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 72ccbf74e..e366ea854 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -133,14 +133,14 @@ end2end_test ryu-openflow: # # break # # fi # # done - #- kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server ## Run end-to-end test: onboard scenario - #- > - # docker run -t --rm --name ${TEST_NAME} --network=host - # --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" - # --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - # $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 -- GitLab From 25228cc81637d207dc4878154b32aea1a3b79f13 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 12:10:27 +0000 Subject: [PATCH 038/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index e366ea854..cc74d00b4 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -137,7 +137,7 @@ end2end_test ryu-openflow: ## Run end-to-end test: onboard scenario - > - docker run -t --rm --name ${TEST_NAME} --network=host + docker run -t --rm --name ${TEST_NAME}-test --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh -- GitLab From a6fdac6d15cf156987c60b19053cecf369d55d2d Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 12:25:11 +0000 Subject: [PATCH 039/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index cc74d00b4..5e389aac2 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -137,10 +137,10 @@ end2end_test ryu-openflow: ## Run end-to-end test: onboard scenario - > - docker run -t --rm --name ${TEST_NAME}-test --network=host + docker run -t --rm --name ${TEST_NAME}-test --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - $CI_REGISTRY_IMAGE/${TEST_NAME}:${IMAGE_TAG} /var/teraflow/run-onboarding.sh + $CI_REGISTRY_IMAGE/${TEST_NAME}-test :${IMAGE_TAG} /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 -- GitLab From 6b884554e97bb7ebaa898e522e47d06063347b71 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 12:38:54 +0000 Subject: [PATCH 040/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 5e389aac2..6263b9f82 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -137,10 +137,10 @@ end2end_test ryu-openflow: ## Run end-to-end test: onboard scenario - > - docker run -t --rm --name ${TEST_NAME}-test --network=host + docker run -t --rm --name ${TEST_NAME} --network=host --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" - $CI_REGISTRY_IMAGE/${TEST_NAME}-test :${IMAGE_TAG} /var/teraflow/run-onboarding.sh + "${CI_REGISTRY_IMAGE}/${TEST_NAME}-test:${IMAGE_TAG}" /var/teraflow/run-onboarding.sh # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 -- GitLab From 0bc68ddb40707a98e597536e662949af6e8af33e Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 13:02:23 +0000 Subject: [PATCH 041/371] Update file tfs-topology.json --- src/tests/ryu-openflow/data/tfs-topology.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/data/tfs-topology.json b/src/tests/ryu-openflow/data/tfs-topology.json index e427f16ea..fda873aa9 100644 --- a/src/tests/ryu-openflow/data/tfs-topology.json +++ b/src/tests/ryu-openflow/data/tfs-topology.json @@ -14,7 +14,7 @@ { "device_id": {"device_uuid": {"uuid": "RYU"}}, "device_type": "openflow-ryu-controller", "device_drivers": ["DEVICEDRIVER_RYU"], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.254.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"timeout": 120}}} ]} -- GitLab From 381c2c8006f8c3af18bef7cdb3aafe725bc96605 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 19:41:30 +0000 Subject: [PATCH 042/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 6263b9f82..eb7c37465 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -84,7 +84,8 @@ end2end_test ryu-openflow: ##run ryu and mininet - docker rm -f ryu mininet || true - docker network rm tfs-test-ryu || true - - docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # -- GitLab From 20f7194c4a90c7e2623e31539cb639ec74c6eb21 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 20:32:05 +0000 Subject: [PATCH 043/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index eb7c37465..e71f0e29a 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -86,7 +86,7 @@ end2end_test ryu-openflow: - docker network rm tfs-test-ryu || true #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - - docker run -d --name ryu --network tfs-test-ryu --ip 172.254.254.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes -- GitLab From 0379381c8e87e20cdd31df6bfe97f846d03a3ec8 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 20:43:04 +0000 Subject: [PATCH 044/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index e71f0e29a..b46eb3208 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -84,7 +84,7 @@ end2end_test ryu-openflow: ##run ryu and mininet - docker rm -f ryu mininet || true - docker network rm tfs-test-ryu || true - #- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + ##- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -- GitLab From d77c1287c632c7d2adfaff99e708229b5b61af24 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 20:51:48 +0000 Subject: [PATCH 045/371] Update file tfs-topology.json --- src/tests/ryu-openflow/data/tfs-topology.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/data/tfs-topology.json b/src/tests/ryu-openflow/data/tfs-topology.json index fda873aa9..d7823d4bb 100644 --- a/src/tests/ryu-openflow/data/tfs-topology.json +++ b/src/tests/ryu-openflow/data/tfs-topology.json @@ -14,7 +14,7 @@ { "device_id": {"device_uuid": {"uuid": "RYU"}}, "device_type": "openflow-ryu-controller", "device_drivers": ["DEVICEDRIVER_RYU"], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.254.10"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.20.0.10"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8080"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"timeout": 120}}} ]} -- GitLab From 13db3625541a1b3de8614c998efd8b5bf5b27955 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 21:00:01 +0000 Subject: [PATCH 046/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index b46eb3208..d24b4ce9b 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -84,7 +84,7 @@ end2end_test ryu-openflow: ##run ryu and mininet - docker rm -f ryu mininet || true - docker network rm tfs-test-ryu || true - ##- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu + ###- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -- GitLab From 35669c02c497f84147a197a3240f4a616f923797 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 21:20:03 +0000 Subject: [PATCH 047/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d24b4ce9b..8042ea003 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -113,7 +113,7 @@ end2end_test ryu-openflow: - ./deploy/crdb.sh - ./deploy/nats.sh - ./deploy/kafka.sh - - ./deploy/qdb.sh + #- ./deploy/qdb.sh - ./deploy/tfs.sh - ./deploy/show.sh # -- GitLab From 00cd26b643fc16aeafbb2bca63e16c0ee96c5fe0 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 21:36:55 +0000 Subject: [PATCH 048/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 8042ea003..f0abeb1da 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -93,15 +93,21 @@ end2end_test ryu-openflow: - sleep 10 - docker ps -a - echo "Finishing script section" -# +# Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 + - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 + # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml - #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml ## - source src/tests/${TEST_NAME}/deploy_specs.sh - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" -- GitLab From 8cc04e0497caac63057dd8c197faaf69e08a75f0 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 21:48:57 +0000 Subject: [PATCH 049/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index f0abeb1da..d14793681 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -94,11 +94,11 @@ end2end_test ryu-openflow: - docker ps -a - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s1 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s2 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s3 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s4 - - docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 + - docker exec mininet ovs-ofctl dump-flows s1 + - docker exec mininet ovs-ofctl dump-flows s2 + - docker exec mininet ovs-ofctl dump-flows s3 + - docker exec mininet ovs-ofctl dump-flows s4 + - docker exec mininet ovs-ofctl dump-flows s5 # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components -- GitLab From f30acc7916f5094969df2ab19caf803348f9a519 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 22:13:48 +0000 Subject: [PATCH 050/371] Update file custom_pentagon_topology.py --- src/tests/ryu-openflow/custom_pentagon_topology.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index 03605f24a..e6a305555 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -18,6 +18,7 @@ from mininet.net import Mininet from mininet.node import RemoteController from mininet.cli import CLI from mininet.link import TCLink +import time class PentagonTopo(Topo): def build(self): @@ -51,5 +52,7 @@ if __name__ == '__main__': net.staticArp() print('Custom Pentagon Topology is up with static ARP.') - CLI(net) + #CLI(net) + while True: + time.sleep(60) net.stop() -- GitLab From 9f82b9d2c60652501c5bf848f23b2ee2a128437a Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 22:19:56 +0000 Subject: [PATCH 051/371] Update file custom_pentagon_topology.py --- src/tests/ryu-openflow/custom_pentagon_topology.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index e6a305555..970bfd58c 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -53,6 +53,13 @@ if __name__ == '__main__': print('Custom Pentagon Topology is up with static ARP.') #CLI(net) + try: while True: - time.sleep(60) - net.stop() + time.sleep(60) + except KeyboardInterrupt: + print("Stopping topology.") + finally: + net.stop() + #while True: + #time.sleep(60) + #net.stop() -- GitLab From ca437f088875463953f4347c601a5a540d0392b6 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 22:40:15 +0000 Subject: [PATCH 052/371] Update file custom_pentagon_topology.py --- src/tests/ryu-openflow/custom_pentagon_topology.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index 970bfd58c..9f3efbcda 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -54,8 +54,8 @@ if __name__ == '__main__': print('Custom Pentagon Topology is up with static ARP.') #CLI(net) try: - while True: - time.sleep(60) + while True: + time.sleep(60) except KeyboardInterrupt: print("Stopping topology.") finally: -- GitLab From 4ccce6ef4abaf0042e8d293592bad65898ece3d3 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 2 Jun 2025 22:45:33 +0000 Subject: [PATCH 053/371] Update 2 files - /src/tests/ryu-openflow/custom_pentagon_topology.py - /src/tests/ryu-openflow/.gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 ++ src/tests/ryu-openflow/custom_pentagon_topology.py | 9 ++------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d14793681..52cc38c76 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -94,6 +94,8 @@ end2end_test ryu-openflow: - docker ps -a - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) + - docker exec mininet ovs-vsctl show + - docker logs mininet - docker exec mininet ovs-ofctl dump-flows s1 - docker exec mininet ovs-ofctl dump-flows s2 - docker exec mininet ovs-ofctl dump-flows s3 diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index 9f3efbcda..616890dad 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -53,13 +53,8 @@ if __name__ == '__main__': print('Custom Pentagon Topology is up with static ARP.') #CLI(net) - try: - while True: - time.sleep(60) - except KeyboardInterrupt: - print("Stopping topology.") - finally: - net.stop() + while True: + time.sleep(60) #while True: #time.sleep(60) #net.stop() -- GitLab From f6928d6c488d270ea55386c8666156b9f2c2f0b0 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 10:47:10 +0000 Subject: [PATCH 054/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 52cc38c76..8a833db5a 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -92,6 +92,8 @@ end2end_test ryu-openflow: ## Wait for initialization of Device NOSes - sleep 10 - docker ps -a + - docker logs ryu + - docker logs mininet - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - docker exec mininet ovs-vsctl show -- GitLab From aa1ee7023727e1003db8810cd211dc0183508e8b Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 11:06:31 +0000 Subject: [PATCH 055/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 8a833db5a..91759effa 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -87,6 +87,7 @@ end2end_test ryu-openflow: ###- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" + - sleep 30 - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes -- GitLab From e0121a0ad6a873cf22a2cdf93fa4d95d9c1dbc30 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 12:09:51 +0000 Subject: [PATCH 056/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 91759effa..474e24642 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -87,7 +87,13 @@ end2end_test ryu-openflow: ###- docker network create -d bridge --subnet=172.254.254.0/24 --gateway=172.254.254.1 tfs-test-ryu - docker network create -d bridge --subnet=172.20.0.0/24 --gateway=172.20.0.1 tfs-test-ryu - docker run -d --name ryu --network tfs-test-ryu --ip 172.20.0.10 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-ryu:${IMAGE_TAG}" - - sleep 30 + - | + echo "Waiting for Ryu to be ready..." + until curl -s http://172.20.0.10:8080 >/dev/null; do + echo "Still waiting..." + sleep 5 + done + echo "Ryu is ready!" - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes -- GitLab From 67aa32fa6fcc9fb78cab558471da5e46b9e1699b Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 12:21:45 +0000 Subject: [PATCH 057/371] Update file custom_pentagon_topology.py --- src/tests/ryu-openflow/custom_pentagon_topology.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index 616890dad..310cb4dc9 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -46,7 +46,7 @@ class PentagonTopo(Topo): if __name__ == '__main__': topo = PentagonTopo() - net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='127.0.0.1'), link=TCLink) + net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='172.20.0.10'), link=TCLink) net.start() net.staticArp() -- GitLab From 3c1f6a1571ffa689308c35f7ae759ddb609f2ab1 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 12:39:44 +0000 Subject: [PATCH 058/371] Update file custom_pentagon_topology.py --- src/tests/ryu-openflow/custom_pentagon_topology.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/custom_pentagon_topology.py index 310cb4dc9..5d9012866 100644 --- a/src/tests/ryu-openflow/custom_pentagon_topology.py +++ b/src/tests/ryu-openflow/custom_pentagon_topology.py @@ -46,7 +46,7 @@ class PentagonTopo(Topo): if __name__ == '__main__': topo = PentagonTopo() - net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='172.20.0.10'), link=TCLink) + net = Mininet(topo=topo, controller=lambda name: RemoteController(name, ip='172.20.0.10', port=6653), link=TCLink) net.start() net.staticArp() -- GitLab From d18e25bc9649b60a047ac9bc6fb130773010387e Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 13:35:05 +0000 Subject: [PATCH 059/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 474e24642..c3c52ef9a 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -94,7 +94,7 @@ end2end_test ryu-openflow: sleep 5 done echo "Ryu is ready!" - - docker run -d --name mininet --network tfs-test-ryu "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes - sleep 10 -- GitLab From 6281d306ab0356e30ac16b35870f0c6666f3dabb Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 13:42:51 +0000 Subject: [PATCH 060/371] Update file docker-compose.yml --- src/tests/ryu-openflow/docker-compose.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/tests/ryu-openflow/docker-compose.yml b/src/tests/ryu-openflow/docker-compose.yml index 611129592..5d1204b7d 100644 --- a/src/tests/ryu-openflow/docker-compose.yml +++ b/src/tests/ryu-openflow/docker-compose.yml @@ -18,3 +18,15 @@ services: build: context: . dockerfile: Ryu.Dockerfile + +version: '3' +services: + mininet: + build: + context: . + image: mininet + tty: true + privileged: true + network_mode: "host" + volumes: + - /lib/modules:/lib/modules \ No newline at end of file -- GitLab From cbcb9bd3b413176672ce19b5b3ca96ba0cc87a6d Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 15:10:32 +0000 Subject: [PATCH 061/371] Update 2 files - /src/tests/ryu-openflow/docker-compose.yml - /src/tests/ryu-openflow/.gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 1 + src/tests/ryu-openflow/docker-compose.yml | 13 +------------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index c3c52ef9a..ae44c1762 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -99,6 +99,7 @@ end2end_test ryu-openflow: ## Wait for initialization of Device NOSes - sleep 10 - docker ps -a + - docker inspect mininet - docker logs ryu - docker logs mininet - echo "Finishing script section" diff --git a/src/tests/ryu-openflow/docker-compose.yml b/src/tests/ryu-openflow/docker-compose.yml index 5d1204b7d..b4892184a 100644 --- a/src/tests/ryu-openflow/docker-compose.yml +++ b/src/tests/ryu-openflow/docker-compose.yml @@ -18,15 +18,4 @@ services: build: context: . dockerfile: Ryu.Dockerfile - -version: '3' -services: - mininet: - build: - context: . - image: mininet - tty: true - privileged: true - network_mode: "host" - volumes: - - /lib/modules:/lib/modules \ No newline at end of file + -- GitLab From 6bcf93aa3dbe337edaa18589234368a57621cbaf Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 15:53:46 +0000 Subject: [PATCH 062/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index ae44c1762..bfc7340a3 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -94,7 +94,13 @@ end2end_test ryu-openflow: sleep 5 done echo "Ryu is ready!" - - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 \ + --privileged \ + --ulimit memlock=-1:-1 \ + --ulimit nofile=65536:65536 \ + --ulimit nproc=65536:65536 \ + mininet-image-name + # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes - sleep 10 -- GitLab From 201f9ddf42620f9356c8a22d60d1cb0ec9754cab Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 15:57:07 +0000 Subject: [PATCH 063/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index bfc7340a3..524aba2d8 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -94,12 +94,8 @@ end2end_test ryu-openflow: sleep 5 done echo "Ryu is ready!" - - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 \ - --privileged \ - --ulimit memlock=-1:-1 \ - --ulimit nofile=65536:65536 \ - --ulimit nproc=65536:65536 \ - mininet-image-name + + - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 mininet-image-name # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes -- GitLab From 553d8c3f7fc0d1858e0d62b5a126d0f2ebecf324 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 16:01:11 +0000 Subject: [PATCH 064/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 524aba2d8..ba38db4bf 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -95,7 +95,7 @@ end2end_test ryu-openflow: done echo "Ryu is ready!" - - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 mininet-image-name + - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # ## Wait for initialization of Device NOSes -- GitLab From 3019b226bd0dca9cd2bf0f2ca0d6fbc927e3ab8e Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 10 Jun 2025 16:08:04 +0000 Subject: [PATCH 065/371] Update file Mininet.Dockerfile --- src/tests/ryu-openflow/Mininet.Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/Mininet.Dockerfile b/src/tests/ryu-openflow/Mininet.Dockerfile index 0a829bb49..4b6bee010 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/ryu-openflow/Mininet.Dockerfile @@ -24,4 +24,7 @@ RUN apt-get update && \ COPY src/tests/ryu-openflow/custom_pentagon_topology.py /opt/custom_pentagon_topology.py -CMD ["python3", "/opt/custom_pentagon_topology.py"] +CMD sh -c "/usr/share/openvswitch/scripts/ovs-ctl start && python3 /opt/custom_pentagon_topology.py" + + +#CMD ["python3", "/opt/custom_pentagon_topology.py"] -- GitLab From 34c6ff0c23bd79eba4b64d4b8540a16dd5f5d9d1 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Wed, 11 Jun 2025 09:37:38 +0000 Subject: [PATCH 066/371] Update file Mininet.Dockerfile --- src/tests/ryu-openflow/Mininet.Dockerfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/tests/ryu-openflow/Mininet.Dockerfile b/src/tests/ryu-openflow/Mininet.Dockerfile index 4b6bee010..5fb95e6d0 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/ryu-openflow/Mininet.Dockerfile @@ -23,8 +23,4 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* COPY src/tests/ryu-openflow/custom_pentagon_topology.py /opt/custom_pentagon_topology.py - -CMD sh -c "/usr/share/openvswitch/scripts/ovs-ctl start && python3 /opt/custom_pentagon_topology.py" - - -#CMD ["python3", "/opt/custom_pentagon_topology.py"] +CMD ["python3", "/opt/custom_pentagon_topology.py"] -- GitLab From 7c89ed58fc3f703cb875cefd864106e9773d8147 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 26 Jun 2025 17:34:33 +0000 Subject: [PATCH 067/371] Ryu-OpenFlow CI/CD test - Fixed docker exec commands --- src/tests/ryu-openflow/.gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index ba38db4bf..073e5c29f 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -106,13 +106,13 @@ end2end_test ryu-openflow: - docker logs mininet - echo "Finishing script section" # Dump configuration of the switches (OpenFlow rules configured) (before configure IETF service) - - docker exec mininet ovs-vsctl show + - docker exec mininet bash -c "ovs-vsctl show" - docker logs mininet - - docker exec mininet ovs-ofctl dump-flows s1 - - docker exec mininet ovs-ofctl dump-flows s2 - - docker exec mininet ovs-ofctl dump-flows s3 - - docker exec mininet ovs-ofctl dump-flows s4 - - docker exec mininet ovs-ofctl dump-flows s5 + - docker exec mininet bash -c "ovs-ofctl dump-flows s1" + - docker exec mininet bash -c "ovs-ofctl dump-flows s2" + - docker exec mininet bash -c "ovs-ofctl dump-flows s3" + - docker exec mininet bash -c "ovs-ofctl dump-flows s4" + - docker exec mininet bash -c "ovs-ofctl dump-flows s5" # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components -- GitLab From b2e882ec5a61edeac987ceafde1f7a298f3a24ec Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 26 Jun 2025 17:44:39 +0000 Subject: [PATCH 068/371] Ryu-OpenFlow CI/CD test - Corrected mininet dockerfile --- src/tests/ryu-openflow/Mininet.Dockerfile | 11 +++++++++-- .../{ => mininet}/custom_pentagon_topology.py | 0 src/tests/ryu-openflow/mininet/mininet-entrypoint.sh | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) rename src/tests/ryu-openflow/{ => mininet}/custom_pentagon_topology.py (100%) create mode 100644 src/tests/ryu-openflow/mininet/mininet-entrypoint.sh diff --git a/src/tests/ryu-openflow/Mininet.Dockerfile b/src/tests/ryu-openflow/Mininet.Dockerfile index 5fb95e6d0..1d6328554 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/ryu-openflow/Mininet.Dockerfile @@ -14,6 +14,9 @@ FROM ubuntu:22.04 +USER root +WORKDIR /root + ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y --no-install-recommends iproute2 net-tools openvswitch-switch ca-certificates && \ @@ -22,5 +25,9 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -COPY src/tests/ryu-openflow/custom_pentagon_topology.py /opt/custom_pentagon_topology.py -CMD ["python3", "/opt/custom_pentagon_topology.py"] +COPY src/tests/ryu-openflow/mininet/custom_pentagon_topology.py /opt/custom_pentagon_topology.py +COPY src/tests/ryu-openflow/mininet/mininet-entrypoint.sh /mininet-entrypoint.sh + +EXPOSE 6633 6653 6640 + +ENTRYPOINT ["/mininet-entrypoint.sh"] diff --git a/src/tests/ryu-openflow/custom_pentagon_topology.py b/src/tests/ryu-openflow/mininet/custom_pentagon_topology.py similarity index 100% rename from src/tests/ryu-openflow/custom_pentagon_topology.py rename to src/tests/ryu-openflow/mininet/custom_pentagon_topology.py diff --git a/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh new file mode 100644 index 000000000..b5eb4066f --- /dev/null +++ b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +service openvswitch-switch start +ovs-vsctl set-manager ptcp:6640 + +python3 /opt/custom_pentagon_topology.py + +service openvswitch-switch stop -- GitLab From 97b3c55a7a4cebde7792457316cec4b149556138 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 26 Jun 2025 17:47:11 +0000 Subject: [PATCH 069/371] Ryu-OpenFlow CI/CD test - Corrected mininet dockerfile entrypoint permissions --- src/tests/ryu-openflow/mininet/mininet-entrypoint.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/tests/ryu-openflow/mininet/mininet-entrypoint.sh diff --git a/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh old mode 100644 new mode 100755 -- GitLab From 199ceb30c8b0ae10747ccbe10576743a61596fb7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 26 Jun 2025 17:54:47 +0000 Subject: [PATCH 070/371] Ryu-OpenFlow CI/CD test - Added ACK - Corrected mininet instantiation --- src/tests/ryu-openflow/.gitlab-ci.yml | 6 +++--- .../ryu-openflow/{ => mininet}/Mininet.Dockerfile | 2 ++ src/tests/ryu-openflow/mininet/README.md | 3 +++ .../ryu-openflow/mininet/mininet-entrypoint.sh | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) rename src/tests/ryu-openflow/{ => mininet}/Mininet.Dockerfile (95%) create mode 100644 src/tests/ryu-openflow/mininet/README.md diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 073e5c29f..e3181fb76 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -24,7 +24,7 @@ build ryu-openflow: script: - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Ryu.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-ryu:${IMAGE_TAG}" - - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Mininet.Dockerfile . + - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/mininet/Mininet.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-mininet:${IMAGE_TAG}" - docker buildx build -t "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" -f ./src/tests/${TEST_NAME}/Test.Dockerfile . - docker push "$CI_REGISTRY_IMAGE/${TEST_NAME}-test:${IMAGE_TAG}" @@ -95,9 +95,9 @@ end2end_test ryu-openflow: done echo "Ryu is ready!" - - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" + - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 --privileged --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 --ulimit nproc=65536:65536 --volume /lib/modules:/lib/modules "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" # - docker run -d --name mininet --network tfs-test-ryu --ip 172.20.0.11 "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" -# + ## Wait for initialization of Device NOSes - sleep 10 - docker ps -a diff --git a/src/tests/ryu-openflow/Mininet.Dockerfile b/src/tests/ryu-openflow/mininet/Mininet.Dockerfile similarity index 95% rename from src/tests/ryu-openflow/Mininet.Dockerfile rename to src/tests/ryu-openflow/mininet/Mininet.Dockerfile index 1d6328554..ea18a3dd8 100644 --- a/src/tests/ryu-openflow/Mininet.Dockerfile +++ b/src/tests/ryu-openflow/mininet/Mininet.Dockerfile @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Based on: https://github.com/iwaseyusuke/docker-mininet + FROM ubuntu:22.04 USER root diff --git a/src/tests/ryu-openflow/mininet/README.md b/src/tests/ryu-openflow/mininet/README.md new file mode 100644 index 000000000..8cc106555 --- /dev/null +++ b/src/tests/ryu-openflow/mininet/README.md @@ -0,0 +1,3 @@ +# Docker-containerized Mininet environment + +- Based on: https://github.com/iwaseyusuke/docker-mininet diff --git a/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh index b5eb4066f..525e89d0a 100755 --- a/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh +++ b/src/tests/ryu-openflow/mininet/mininet-entrypoint.sh @@ -1,4 +1,19 @@ #!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Based on: https://github.com/iwaseyusuke/docker-mininet service openvswitch-switch start ovs-vsctl set-manager ptcp:6640 -- GitLab From ed3162863dfa808d2e4cf5a0435d2fd843b30b4f Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 30 Jun 2025 13:13:00 +0000 Subject: [PATCH 071/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index e3181fb76..d20d038af 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -32,7 +32,7 @@ build ryu-openflow: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - #- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + ##- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto -- GitLab From d4e94f13b4bcb7b3349aa1b1c163066feea38ada Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 1 Jul 2025 15:01:24 +0000 Subject: [PATCH 072/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d20d038af..532f2cc96 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -32,7 +32,7 @@ build ryu-openflow: - docker images --filter="dangling=true" --quiet | xargs -r docker rmi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - ##- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + ###- if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto -- GitLab From d97308ea2dcf5b5b83b16f13465712e2bca3fe5f Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 8 Aug 2025 13:22:38 +0000 Subject: [PATCH 073/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 532f2cc96..2b6f82cdd 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -14,7 +14,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build ryu-openflow: - variables: + variables: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: build @@ -40,7 +40,7 @@ build ryu-openflow: - src/tests/${TEST_NAME}/Dockerfile - .gitlab-ci.yml - +# # - docker rm -f na-t1 na-t2 na-r1 na-r2 # - docker network rm -f na-br # -- GitLab From 4622ac2e30f5a0b8c543382d8cb3a758749d2afe Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 11 Aug 2025 11:12:42 +0000 Subject: [PATCH 074/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 2b6f82cdd..a62fd7dce 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -69,7 +69,7 @@ end2end_test ryu-openflow: - docker ps -aq | xargs -r docker rm -f #- containerlab destroy --all --cleanup || true # cleanup mininet - - docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c + #- docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: - echo "Starting script section" ## Download Docker images to run the test -- GitLab From 0afea6987f9d9aafb0b968fac88d4213a54707bc Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 11 Aug 2025 11:31:37 +0000 Subject: [PATCH 075/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index a62fd7dce..6f7031743 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -116,12 +116,12 @@ end2end_test ryu-openflow: # Configure TeraFlowSDN deployment ## Uncomment if DEBUG log level is needed for the components - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml - - yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/deviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="frontend").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/pathcompservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml + #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml ## - source src/tests/${TEST_NAME}/deploy_specs.sh - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" @@ -171,12 +171,12 @@ end2end_test ryu-openflow: #- docker exec ryu-openflow-mininet ovs-ofctl dump-flows s5 -# # Run end-to-end test: configure service IETF -# - > -# docker run -t --rm --name ${TEST_NAME} --network=host -# --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" -# --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" -# $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh + # Run end-to-end test: configure service IETF + - > + docker run -t --rm --name ${TEST_NAME} --network=host + --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" + --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" + $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh # # # Dump configuration of the switches (OpenFlow rules configured) (after configure IETF service) # -- GitLab From 94c3f9ec8e7494c8e885892c1cb35bdac5234391 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 11 Aug 2025 15:20:56 +0000 Subject: [PATCH 076/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 6f7031743..16271301b 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -122,20 +122,21 @@ end2end_test ryu-openflow: #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/serviceservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/nbiservice.yaml #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/monitoringservice.yaml -## + - source src/tests/${TEST_NAME}/deploy_specs.sh - - export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" - - export TFS_SKIP_BUILD="YES" - - export TFS_IMAGE_TAG="latest" - - echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" -## + #- export TFS_REGISTRY_IMAGES="${CI_REGISTRY_IMAGE}" + #- export TFS_SKIP_BUILD="YES" + #- export TFS_IMAGE_TAG="latest" + #- echo "TFS_REGISTRY_IMAGES=${CI_REGISTRY_IMAGE}" + # Deploy TeraFlowSDN - ./deploy/crdb.sh - ./deploy/nats.sh - ./deploy/kafka.sh - #- ./deploy/qdb.sh + - ./deploy/qdb.sh - ./deploy/tfs.sh - ./deploy/show.sh + # # ## Wait for Context to be subscribed to NATS # ## WARNING: this loop is infinite if there is no subscriber (such as monitoring). -- GitLab From 021355ec42340e126130793ee5ba8ae101a79ec8 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Tue, 12 Aug 2025 10:29:13 +0000 Subject: [PATCH 077/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 16271301b..d574ff670 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -67,7 +67,6 @@ end2end_test ryu-openflow: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker ps -aq | xargs -r docker rm -f - #- containerlab destroy --all --cleanup || true # cleanup mininet #- docker run --rm "${CI_REGISTRY_IMAGE}/${TEST_NAME}-mininet:${IMAGE_TAG}" mn -c script: -- GitLab From e9ad6c8e9a766c24064c207dad7449520c850560 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 25 Aug 2025 11:10:57 +0000 Subject: [PATCH 078/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index d574ff670..a111dec69 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -40,7 +40,7 @@ build ryu-openflow: - src/tests/${TEST_NAME}/Dockerfile - .gitlab-ci.yml -# + # - docker rm -f na-t1 na-t2 na-r1 na-r2 # - docker network rm -f na-br # -- GitLab From 344b68b51c78f91e5a174f8fa473f3aba33c38fc Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 25 Aug 2025 13:26:04 +0000 Subject: [PATCH 079/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index a111dec69..56b1a235b 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -39,8 +39,6 @@ build ryu-openflow: - src/tests/${TEST_NAME}/**/*.{py,in,sh,yml} - src/tests/${TEST_NAME}/Dockerfile - .gitlab-ci.yml - - # - docker rm -f na-t1 na-t2 na-r1 na-r2 # - docker network rm -f na-br # -- GitLab From 5d59451b663fa867b1931eccad7bf513bbea14df Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 26 Aug 2025 08:08:25 +0000 Subject: [PATCH 080/371] Ryu E2E Integration Test: - Resolve merge conflict in CI/CD pipeline descriptors --- .gitlab-ci.yml | 40 +---------------------- src/tests/.gitlab-ci.yml | 22 ++----------- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- src/tests/ryu-openflow/docker-compose.yml | 1 - 4 files changed, 5 insertions(+), 60 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 823dfd753..c8fcd83a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,13 +27,13 @@ workflow: # include the individual .gitlab-ci.yml of each micro-service and tests include: -<<<<<<< HEAD # #- local: '/manifests/.gitlab-ci.yml' # - local: '/src/monitoring/.gitlab-ci.yml' # - local: '/src/nbi/.gitlab-ci.yml' # - local: '/src/context/.gitlab-ci.yml' # - local: '/src/device/.gitlab-ci.yml' # - local: '/src/service/.gitlab-ci.yml' +# - local: '/src/qkd_app/.gitlab-ci.yml' # - local: '/src/dbscanserving/.gitlab-ci.yml' # - local: '/src/opticalattackmitigator/.gitlab-ci.yml' # - local: '/src/opticalattackdetector/.gitlab-ci.yml' @@ -63,44 +63,6 @@ include: # - local: '/src/e2e_orchestrator/.gitlab-ci.yml' # - local: '/src/ztp_server/.gitlab-ci.yml' # - local: '/src/osm_client/.gitlab-ci.yml' -======= - #- local: '/manifests/.gitlab-ci.yml' - - local: '/src/monitoring/.gitlab-ci.yml' - - local: '/src/nbi/.gitlab-ci.yml' - - local: '/src/context/.gitlab-ci.yml' - - local: '/src/device/.gitlab-ci.yml' - - local: '/src/service/.gitlab-ci.yml' - - local: '/src/qkd_app/.gitlab-ci.yml' - - local: '/src/dbscanserving/.gitlab-ci.yml' - - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - - local: '/src/opticalattackdetector/.gitlab-ci.yml' - - local: '/src/opticalattackmanager/.gitlab-ci.yml' - - local: '/src/opticalcontroller/.gitlab-ci.yml' - - local: '/src/ztp/.gitlab-ci.yml' - - local: '/src/policy/.gitlab-ci.yml' - - local: '/src/automation/.gitlab-ci.yml' - - local: '/src/forecaster/.gitlab-ci.yml' - #- local: '/src/webui/.gitlab-ci.yml' - #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - - local: '/src/slice/.gitlab-ci.yml' - #- local: '/src/interdomain/.gitlab-ci.yml' - - local: '/src/pathcomp/.gitlab-ci.yml' - #- local: '/src/dlt/.gitlab-ci.yml' - - local: '/src/load_generator/.gitlab-ci.yml' - - local: '/src/bgpls_speaker/.gitlab-ci.yml' - - local: '/src/kpi_manager/.gitlab-ci.yml' - - local: '/src/kpi_value_api/.gitlab-ci.yml' - #- local: '/src/kpi_value_writer/.gitlab-ci.yml' - #- local: '/src/telemetry/.gitlab-ci.yml' - - local: '/src/analytics/.gitlab-ci.yml' - - local: '/src/qos_profile/.gitlab-ci.yml' - - local: '/src/vnt_manager/.gitlab-ci.yml' - - local: '/src/e2e_orchestrator/.gitlab-ci.yml' - - local: '/src/ztp_server/.gitlab-ci.yml' - - local: '/src/osm_client/.gitlab-ci.yml' ->>>>>>> e3f502c37e9ed4060edf0d3af0a22857867233b3 # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 4a5788147..98c0c1eb6 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -14,7 +14,6 @@ # include the individual .gitlab-ci.yml of each end-to-end integration test include: -<<<<<<< HEAD # - local: '/src/tests/ofc22/.gitlab-ci.yml' # #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' # - local: '/src/tests/ecoc22/.gitlab-ci.yml' @@ -26,23 +25,8 @@ include: # #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' # #- local: '/src/tests/ofc25/.gitlab-ci.yml' - local: '/src/tests/ryu-openflow/.gitlab-ci.yml' +# - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' # - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' -======= - - local: '/src/tests/ofc22/.gitlab-ci.yml' - #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml' - - local: '/src/tests/ecoc22/.gitlab-ci.yml' - #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' - #- local: '/src/tests/ofc23/.gitlab-ci.yml' - - local: '/src/tests/ofc24/.gitlab-ci.yml' - - local: '/src/tests/eucnc24/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml' - #- local: '/src/tests/ofc25/.gitlab-ci.yml' - #- local: '/src/tests/ryu-openflow/.gitlab-ci.yml' - - local: '/src/tests/qkd_end2end/.gitlab-ci.yml' - - - local: '/src/tests/tools/mock_tfs_nbi_dependencies/.gitlab-ci.yml' - - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml' - - local: '/src/tests/tools/mock_osm_nbi/.gitlab-ci.yml' ->>>>>>> e3f502c37e9ed4060edf0d3af0a22857867233b3 +# - local: '/src/tests/tools/mock_qkd_node/.gitlab-ci.yml' +# - local: '/src/tests/tools/mock_osm_nbi/.gitlab-ci.yml' diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 56b1a235b..18e35f454 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -14,7 +14,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build ryu-openflow: - variables: + variables: TEST_NAME: 'ryu-openflow' IMAGE_TAG: 'mr$CI_MERGE_REQUEST_IID' stage: build diff --git a/src/tests/ryu-openflow/docker-compose.yml b/src/tests/ryu-openflow/docker-compose.yml index b4892184a..611129592 100644 --- a/src/tests/ryu-openflow/docker-compose.yml +++ b/src/tests/ryu-openflow/docker-compose.yml @@ -18,4 +18,3 @@ services: build: context: . dockerfile: Ryu.Dockerfile - -- GitLab From cdd2bb5df4ec86de8b9372969b93a9a47cd544fc Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Wed, 17 Sep 2025 07:37:06 +0000 Subject: [PATCH 081/371] check if its working --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index 18e35f454..a5da61d8d 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -51,7 +51,7 @@ build ryu-openflow: # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" # asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - +# # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: timeout: 90m -- GitLab From 37d8abe35ca98a98c849a92c44b643d776964d38 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Wed, 17 Sep 2025 10:24:21 +0000 Subject: [PATCH 082/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 763d7da17..880386368 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -37,6 +37,7 @@ def test_scenario_onboarding( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) + time.sleep(4) descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From eca86d1f73bd20d8b75452dcde0315bbc5258ad3 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Wed, 17 Sep 2025 10:36:16 +0000 Subject: [PATCH 083/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 880386368..22124e66d 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -37,7 +37,22 @@ def test_scenario_onboarding( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) - time.sleep(4) + # replace: time.sleep(4) + def wait_for_devices(ctx, expected, timeout=20.0, interval=0.5): + deadline = time.time() + timeout + last = -1 + while time.time() < deadline: + n = len(ctx.ListDevices(Empty()).devices) + if n == expected: + return + last = n + time.sleep(interval) + raise AssertionError(f"Timeout waiting for devices: expected {expected}, got {last}") + + # Wait until Context service actually shows all devices, then run validate() + wait_for_devices(context_client, descriptor_loader.num_devices) + descriptor_loader.validate() + descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From 9eb127fd67418b2582fd4a588db79262210579eb Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Thu, 18 Sep 2025 10:28:12 +0000 Subject: [PATCH 084/371] Update file .gitlab-ci.yml --- src/tests/ryu-openflow/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/.gitlab-ci.yml b/src/tests/ryu-openflow/.gitlab-ci.yml index a5da61d8d..18e35f454 100644 --- a/src/tests/ryu-openflow/.gitlab-ci.yml +++ b/src/tests/ryu-openflow/.gitlab-ci.yml @@ -51,7 +51,7 @@ build ryu-openflow: # --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" # asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh -# + # Deploy TeraFlowSDN and Execute end-2-end test end2end_test ryu-openflow: timeout: 90m -- GitLab From 6e84608dab08ee581701029347d517a54a7b373b Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 19 Sep 2025 10:25:55 +0000 Subject: [PATCH 085/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 22124e66d..763d7da17 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -37,22 +37,6 @@ def test_scenario_onboarding( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) - # replace: time.sleep(4) - def wait_for_devices(ctx, expected, timeout=20.0, interval=0.5): - deadline = time.time() + timeout - last = -1 - while time.time() < deadline: - n = len(ctx.ListDevices(Empty()).devices) - if n == expected: - return - last = n - time.sleep(interval) - raise AssertionError(f"Timeout waiting for devices: expected {expected}, got {last}") - - # Wait until Context service actually shows all devices, then run validate() - wait_for_devices(context_client, descriptor_loader.num_devices) - descriptor_loader.validate() - descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From d3cfbade4fcf3b9c4cca0b5d8cb98d77616c260d Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 19 Sep 2025 12:45:27 +0000 Subject: [PATCH 086/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 763d7da17..5d484d7a2 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -37,6 +37,9 @@ def test_scenario_onboarding( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) + logging.info("Devices currently in context: %d", len(response.devices)) + for d in response.devices: + logging.info("Device ID: %s, Type: %s", d.device_id.device_uuid.uuid, d.device_type) descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From bb2f7b13e44ef9f275579fadc78f43ec4ee95974 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Fri, 19 Sep 2025 12:57:51 +0000 Subject: [PATCH 087/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 5d484d7a2..3265f768a 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -37,9 +37,11 @@ def test_scenario_onboarding( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) + response = context_client.ListDevices(Empty()) + logging.info("DescriptorLoader expects %d devices", descriptor_loader.num_devices) logging.info("Devices currently in context: %d", len(response.devices)) for d in response.devices: - logging.info("Device ID: %s, Type: %s", d.device_id.device_uuid.uuid, d.device_type) + logging.info("Device ID: %s", d.device_id.device_uuid.uuid) descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From 5bb776328dadfb6acce82fa660ac257edcc695ae Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 22 Sep 2025 08:38:37 +0000 Subject: [PATCH 088/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 3265f768a..13ae1ffdb 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -32,16 +32,14 @@ def test_scenario_onboarding( device_client : DeviceClient, # pylint: disable=redefined-outer-name ) -> None: validate_empty_scenario(context_client) + resp = context_client.ListDevices(Empty()) + LOGGER.info('Num Devices enabled:{:d}'.format(resp.devices)) descriptor_loader = DescriptorLoader( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) response = context_client.ListDevices(Empty()) - logging.info("DescriptorLoader expects %d devices", descriptor_loader.num_devices) - logging.info("Devices currently in context: %d", len(response.devices)) - for d in response.devices: - logging.info("Device ID: %s", d.device_id.device_uuid.uuid) descriptor_loader.validate() # Verify the scenario has no services/slices -- GitLab From 466d80e3db10ed0081632b3023bdadaf9d6c0121 Mon Sep 17 00:00:00 2001 From: Mohamad Rahhal Date: Mon, 22 Sep 2025 08:46:36 +0000 Subject: [PATCH 089/371] Update file test_onboarding.py --- src/tests/ryu-openflow/tests/test_onboarding.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 13ae1ffdb..9dfec4b47 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -33,7 +33,7 @@ def test_scenario_onboarding( ) -> None: validate_empty_scenario(context_client) resp = context_client.ListDevices(Empty()) - LOGGER.info('Num Devices enabled:{:d}'.format(resp.devices)) + LOGGER.info('Num Devices enabled: %d', len(resp.devices)) descriptor_loader = DescriptorLoader( descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client) -- GitLab From d574194b399b8d3b533c231b12464287db47e1a6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 3 Nov 2025 19:15:38 +0000 Subject: [PATCH 090/371] Common - Tools - RestConf Server: - Improve support for Yang Model Discovery - Improve YANG path normalization to detect namespaces - Enable Pre-Get data dispatchers - Renamed old data dispatchers to update - Update related test tools --- .../server/restconf_server/Callbacks.py | 51 +++++++++++++----- .../server/restconf_server/DispatchData.py | 13 +++-- .../RestConfServerApplication.py | 3 ++ .../server/restconf_server/YangHandler.py | 19 +++++-- .../restconf_server/YangModelDiscoverer.py | 52 +++++++++++++++---- .../nce_fan_ctrl/Callbacks.py | 6 +-- .../mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py | 4 +- 7 files changed, 113 insertions(+), 35 deletions(-) diff --git a/src/common/tools/rest_conf/server/restconf_server/Callbacks.py b/src/common/tools/rest_conf/server/restconf_server/Callbacks.py index e3e4d0f45..04a8b8bd9 100644 --- a/src/common/tools/rest_conf/server/restconf_server/Callbacks.py +++ b/src/common/tools/rest_conf/server/restconf_server/Callbacks.py @@ -38,7 +38,22 @@ class _Callback: ''' return self._path_pattern.fullmatch(path) - def execute_data( + def execute_data_pre_get( + self, match : re.Match, path : str, old_data : Optional[Dict] + ) -> bool: + ''' + Execute the callback action for a matched data path. + This method should be implemented for each specific callback. + @param match: `re.Match` object returned by `match()`. + @param path: Original request path that was matched. + @param old_data: Resource representation before retrieval, if applicable, otherwise `None` + @returns boolean indicating whether additional callbacks should be executed, defaults to False + ''' + MSG = 'match={:s}, path={:s}, old_data={:s}' + msg = MSG.format(match.groupdict(), path, old_data) + raise NotImplementedError(msg) + + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -78,14 +93,24 @@ class CallbackDispatcher: def register(self, callback : _Callback) -> None: self._callbacks.append(callback) - def dispatch_data( + def dispatch_data_pre_get( + self, path : str, old_data : Optional[Dict] = None + ) -> None: + LOGGER.warning('[dispatch_data_pre_get] Checking Callbacks for path={:s}'.format(str(path))) + for callback in self._callbacks: + match = callback.match(path) + if match is None: continue + keep_running_callbacks = callback.execute_data_pre_get(match, path, old_data) + if not keep_running_callbacks: break + + def dispatch_data_update( self, path : str, old_data : Optional[Dict] = None, new_data : Optional[Dict] = None ) -> None: - LOGGER.warning('[dispatch_data] Checking Callbacks for path={:s}'.format(str(path))) + LOGGER.warning('[dispatch_data_update] Checking Callbacks for path={:s}'.format(str(path))) for callback in self._callbacks: match = callback.match(path) if match is None: continue - keep_running_callbacks = callback.execute_data(match, path, old_data, new_data) + keep_running_callbacks = callback.execute_data_update(match, path, old_data, new_data) if not keep_running_callbacks: break def dispatch_operation( @@ -113,7 +138,7 @@ class CallbackOnNetwork(_Callback): pattern += r'/ietf-network:networks/network=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -127,7 +152,7 @@ class CallbackOnNode(_Callback): pattern += r'/node=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -141,7 +166,7 @@ class CallbackOnLink(_Callback): pattern += r'/ietf-network-topology:link=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -167,12 +192,12 @@ def main() -> None: callbacks.register(CallbackOnLink()) callbacks.register(CallbackShutdown()) - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin') - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/node=P-PE2') - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L6') - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/') - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/node=P-PE1/') - callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L4/') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/node=P-PE2') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L6') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/node=P-PE1/') + callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L4/') callbacks.dispatch_operation('/restconf/operations/shutdown/') if __name__ == '__main__': diff --git a/src/common/tools/rest_conf/server/restconf_server/DispatchData.py b/src/common/tools/rest_conf/server/restconf_server/DispatchData.py index 89cb8206e..0dff60d3a 100644 --- a/src/common/tools/rest_conf/server/restconf_server/DispatchData.py +++ b/src/common/tools/rest_conf/server/restconf_server/DispatchData.py @@ -31,6 +31,11 @@ class RestConfDispatchData(Resource): self._callback_dispatcher = callback_dispatcher def get(self, subpath : str = '/') -> Response: + data = self._yang_handler.get(subpath) + self._callback_dispatcher.dispatch_data_pre_get( + '/restconf/data/' + subpath, old_data=data + ) + data = self._yang_handler.get(subpath) if data is None: abort( @@ -70,7 +75,7 @@ class RestConfDispatchData(Resource): LOGGER.info('[POST] {:s} {:s} => {:s}'.format(subpath, str(payload), str(json_data))) - self._callback_dispatcher.dispatch_data( + self._callback_dispatcher.dispatch_data_update( '/restconf/data/' + subpath, old_data=None, new_data=json_data ) @@ -102,7 +107,7 @@ class RestConfDispatchData(Resource): diff_data = deepdiff.DeepDiff(old_data, new_data) updated = len(diff_data) > 0 - self._callback_dispatcher.dispatch_data( + self._callback_dispatcher.dispatch_data_update( '/restconf/data/' + subpath, old_data=old_data, new_data=new_data ) @@ -140,7 +145,7 @@ class RestConfDispatchData(Resource): #diff_data = deepdiff.DeepDiff(old_data, new_data) #updated = len(diff_data) > 0 - self._callback_dispatcher.dispatch_data( + self._callback_dispatcher.dispatch_data_update( '/restconf/data/' + subpath, old_data=old_data, new_data=new_data ) @@ -170,7 +175,7 @@ class RestConfDispatchData(Resource): description='Path({:s}) not found'.format(str(subpath)) ) - self._callback_dispatcher.dispatch_data( + self._callback_dispatcher.dispatch_data_update( '/restconf/data/' + subpath, old_data=old_data, new_data=None ) diff --git a/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py b/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py index 58384299c..1da9f7069 100644 --- a/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py +++ b/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py @@ -63,6 +63,9 @@ class RestConfServerApplication: self._app.after_request(log_request) self._api = Api(self._app) + @property + def yang_handler(self): return self._yang_handler + @property def callback_dispatcher(self): return self._callback_dispatcher diff --git a/src/common/tools/rest_conf/server/restconf_server/YangHandler.py b/src/common/tools/rest_conf/server/restconf_server/YangHandler.py index 9df57528f..22e5b63d7 100644 --- a/src/common/tools/rest_conf/server/restconf_server/YangHandler.py +++ b/src/common/tools/rest_conf/server/restconf_server/YangHandler.py @@ -54,6 +54,12 @@ class YangHandler: json.dumps(yang_startup_data), fmt='json' ) + @property + def yang_context(self): return self._yang_context + + @property + def yang_datastore(self): return self._datastore + def destroy(self) -> None: self._yang_context.destroy() @@ -165,13 +171,20 @@ class YangHandler: name, val = part.split('=', 1) # keep original name (may include prefix) for output, but # use local name (without module prefix) to lookup schema - local_name = name.split(':', 1)[1] if ':' in name else name + local_name = name #.split(':', 1)[1] if ':' in name else name schema_path = schema_path + '/' + local_name if schema_path else '/' + local_name schema_nodes = list(self._yang_context.find_path(schema_path)) if len(schema_nodes) != 1: MSG = 'No/Multiple SchemaNodes({:s}) for SchemaPath({:s})' raise Exception(MSG.format( - str([repr(sn) for sn in schema_nodes]), schema_path + #str([repr(sn) for sn in schema_nodes]), schema_path + str([ + '{:s}({:s}) => {:s}'.format( + repr(sn), + str(sn.schema_path()), + str([repr(snn) for snn in sn.iter_tree()]) + ) + for sn in schema_nodes]), schema_path )) schema_node = schema_nodes[0] @@ -219,7 +232,7 @@ class YangHandler: out_parts.append(name + ''.join(preds)) else: - local_part = part.split(':', 1)[1] if ':' in part else part + local_part = part #.split(':', 1)[1] if ':' in part else part schema_path = schema_path + '/' + local_part if schema_path else '/' + local_part out_parts.append(part) diff --git a/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py b/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py index f31305280..ff9ddee50 100644 --- a/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py +++ b/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py @@ -32,8 +32,14 @@ IMPORT_BLOCK_RE = re.compile(r"\bimport\s+([A-Za-z0-9_.-]+)\s*\{", re.IGNORECASE # import foo; (very rare, but we’ll support it) IMPORT_SEMI_RE = re.compile(r"\bimport\s+([A-Za-z0-9_.-]+)\s*;", re.IGNORECASE) +# include foo { ... } (most common form) +INCLUDE_BLOCK_RE = re.compile(r"\binclude\s+([A-Za-z0-9_.-]+)\s*\{", re.IGNORECASE) -def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str]]: +# include foo; (very rare, but we’ll support it) +INCLUDE_SEMI_RE = re.compile(r"\binclude\s+([A-Za-z0-9_.-]+)\s*;", re.IGNORECASE) + + +def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str], Set[str]]: path_stem = path.stem # file name without extension expected_module_name = path_stem.split('@', 1)[0] @@ -54,14 +60,20 @@ def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str]]: raise Exception(MSG.format(str(module_name), str(expected_module_name))) module_imports = set() + module_includes = set() if module_name is not None: module_imports.update(IMPORT_BLOCK_RE.findall(data)) module_imports.update(IMPORT_SEMI_RE.findall(data)) + module_includes.update(INCLUDE_BLOCK_RE.findall(data)) + module_includes.update(INCLUDE_SEMI_RE.findall(data)) # ignore modules importing themselves, just in case module_imports.discard(module_name) - return module_name, module_imports + # ignore modules including themselves, just in case + module_includes.discard(module_name) + + return module_name, module_imports, module_includes class YangModuleDiscoverer: @@ -70,9 +82,9 @@ class YangModuleDiscoverer: self._module_to_paths : Dict[str, List[Path]] = defaultdict(list) self._module_to_imports : Dict[str, Set[str]] = defaultdict(set) + self._module_to_includes : Dict[str, Set[str]] = defaultdict(set) self._ordered_module_names : Optional[List[str]] = None - def run( self, do_print_order : bool = False, do_log_order : bool = False, logger : Optional[logging.Logger] = None, level : int = logging.INFO @@ -97,10 +109,30 @@ class YangModuleDiscoverer: raise Exception(MSG.format(str(self._yang_search_path))) for yang_path in yang_root.rglob('*.yang'): - module_name, module_imports = _parse_yang_file(yang_path) + module_name, module_imports, module_includes = _parse_yang_file(yang_path) if module_name is None: continue - self._module_to_paths[module_name].append(yang_path) - self._module_to_imports[module_name] = module_imports + self._module_to_paths.setdefault(module_name, list()).append(yang_path) + self._module_to_imports.setdefault(module_name, set()).update(module_imports) + self._module_to_includes.setdefault(module_name, set()).update(module_includes) + + # Propagate modules imported by included modules to modules including them: + # openconfig-platform includes openconfig-platform-common + # openconfig-platform-common imports ( + # openconfig-platform-types, openconfig-extensions, openconfig-types + # ) + # => propagate ( + # openconfig-platform-types, openconfig-extensions, openconfig-types + # ) as imports of openconfig-platform + # => remove openconfig-platform-common from list of modules_to_imports as + # cannot be imported by itself + included_modules : Set[str] = set() + for module_name, module_includes in self._module_to_includes.items(): + for inc_mdl_name in module_includes: + included_module_imports = self._module_to_imports.get(inc_mdl_name, set()) + self._module_to_imports.setdefault(module_name, set()).update(included_module_imports) + included_modules.update(module_includes) + for included_module in included_modules: + self._module_to_imports.pop(included_module) if len(self._module_to_paths) == 0: MSG = 'No modules found in Path({:s})' @@ -128,8 +160,8 @@ class YangModuleDiscoverer: def _check_missing_modules(self) -> None: local_module_names = set(self._module_to_imports.keys()) missing_modules : List[str] = list() - for module_name, imported_modules in self._module_to_imports.items(): - missing = imported_modules.difference(local_module_names) + for module_name, module_imports in self._module_to_imports.items(): + missing = module_imports.difference(local_module_names) if len(missing) == 0: continue missing_modules.append( ' {:s} => {:s}'.format(module_name, str(missing)) @@ -143,8 +175,8 @@ class YangModuleDiscoverer: def _sort_modules(self) -> None: ts = TopologicalSorter() - for module_name, imported_modules in self._module_to_imports.items(): - ts.add(module_name, *imported_modules) + for module_name, module_imports in self._module_to_imports.items(): + ts.add(module_name, *module_imports) try: self._ordered_module_names = list(ts.static_order()) # raises CycleError on cycles diff --git a/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py b/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py index 1c6996581..622e03fbf 100644 --- a/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py +++ b/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py @@ -28,7 +28,7 @@ class CallbackQosProfile(_Callback): pattern += r'/qos-profile=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -44,7 +44,7 @@ class CallbackApplication(_Callback): pattern += r'/application=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -60,7 +60,7 @@ class CallbackAppFlow(_Callback): pattern += r'/app-flow=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: diff --git a/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py b/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py index ea2e7f748..d2c2b5c2f 100644 --- a/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py +++ b/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py @@ -28,7 +28,7 @@ class CallbackOsuTunnel(_Callback): pattern += r'/tunnel=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: @@ -44,7 +44,7 @@ class CallbackEthTService(_Callback): pattern += r'/etht-svc-instances=(?P[^/]+)' super().__init__(pattern) - def execute_data( + def execute_data_update( self, match : re.Match, path : str, old_data : Optional[Dict], new_data : Optional[Dict] ) -> bool: -- GitLab From 35a3f12a6579259c1e82659185e93480827fad3e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 3 Nov 2025 19:21:09 +0000 Subject: [PATCH 091/371] Tests - Tools - Firewall Agent: - Implement new Firewall Agent - Expose RESTCONF/OpenConfig NBI - Use NFTables backend - Test scenarios --- src/tests/tools/firewall_agent/Dockerfile | 30 + src/tests/tools/firewall_agent/README.md | 6 + .../firewall_agent/docker-compose-down.sh | 20 + .../tools/firewall_agent/docker-compose-up.sh | 27 + .../tools/firewall_agent/docker-compose.yml | 37 + .../firewall_agent/docs/Docs-and-Commands.md | 980 +++++++++ .../docs/yang/generate-trees.sh | 54 + .../docs/yang/ietf/iana-if-type.yang | 1619 ++++++++++++++ .../docs/yang/ietf/ietf-interfaces.yang | 1123 ++++++++++ .../docs/yang/ietf/ietf-yang-types.yang | 474 +++++ .../docs/yang/openconfig-acl.tree | 337 +++ .../docs/yang/openconfig-components.tree | 188 ++ .../docs/yang/openconfig-interfaces.tree | 716 +++++++ .../yang/openconfig/acl/openconfig-acl.yang | 935 ++++++++ .../acl/openconfig-icmpv4-types.yang | 540 +++++ .../acl/openconfig-icmpv6-types.yang | 1010 +++++++++ .../acl/openconfig-packet-match-types.yang | 374 ++++ .../acl/openconfig-packet-match.yang | 727 +++++++ .../defined-sets/openconfig-defined-sets.yang | 227 ++ .../interfaces/openconfig-if-aggregate.yang | 249 +++ .../interfaces/openconfig-if-ethernet.yang | 693 ++++++ .../interfaces/openconfig-if-ip.yang | 1611 ++++++++++++++ .../interfaces/openconfig-interfaces.yang | 1336 ++++++++++++ .../mpls/openconfig-mpls-types.yang | 548 +++++ .../openconfig/openconfig-extensions.yang | 206 ++ .../openconfig-transport-types.yang | 1883 +++++++++++++++++ .../platform/openconfig-platform-common.yang | 246 +++ .../platform/openconfig-platform-port.yang | 327 +++ .../platform/openconfig-platform-types.yang | 541 +++++ .../platform/openconfig-platform.yang | 1221 +++++++++++ .../system/openconfig-alarm-types.yang | 150 ++ .../types/openconfig-inet-types.yang | 485 +++++ .../openconfig/types/openconfig-types.yang | 485 +++++ .../types/openconfig-yang-types.yang | 230 ++ .../vlan/openconfig-vlan-types.yang | 283 +++ .../yang/openconfig/vlan/openconfig-vlan.yang | 1001 +++++++++ .../docs/yang/yang-repo-url.txt | 1 + .../firewall_agent/firewall_agent/__init__.py | 14 + .../firewall_agent/firewall_agent/app.py | 39 + .../firewall_agent/resources/ACLs.py | 226 ++ .../firewall_agent/resources/Components.py | 40 + .../firewall_agent/resources/HostMeta.py | 25 + .../firewall_agent/resources/Interfaces.py | 88 + .../firewall_agent/resources/Root.py | 25 + .../firewall_agent/resources/__init__.py | 14 + .../resources/nft_model/ActionEnum.py | 24 + .../resources/nft_model/Chain.py | 94 + .../resources/nft_model/DirectionEnum.py | 23 + .../resources/nft_model/Exceptions.py | 89 + .../resources/nft_model/FamilyEnum.py | 27 + .../resources/nft_model/NFTables.py | 153 ++ .../resources/nft_model/NFTablesCommand.py | 79 + .../nft_model/NFTablesParserTools.py | 77 + .../resources/nft_model/ProtocolEnum.py | 24 + .../resources/nft_model/Rule.py | 201 ++ .../resources/nft_model/Table.py | 86 + .../resources/nft_model/TableEnum.py | 24 + .../resources/nft_model/__init__.py | 14 + .../resources/nft_model/__main__.py | 31 + src/tests/tools/firewall_agent/redeploy.sh | 25 + .../tools/firewall_agent/requirements.txt | 21 + .../scripts/data/oc_acl_block_8001.json | 27 + .../scripts/data/oc_acl_block_8002.json | 27 + .../scripts/data/oc_acl_multi_rule.json | 39 + .../firewall_agent/scripts/run_nft_model.sh | 18 + .../firewall_agent/scripts/test_commands.sh | 32 + 66 files changed, 22526 insertions(+) create mode 100644 src/tests/tools/firewall_agent/Dockerfile create mode 100644 src/tests/tools/firewall_agent/README.md create mode 100755 src/tests/tools/firewall_agent/docker-compose-down.sh create mode 100755 src/tests/tools/firewall_agent/docker-compose-up.sh create mode 100644 src/tests/tools/firewall_agent/docker-compose.yml create mode 100644 src/tests/tools/firewall_agent/docs/Docs-and-Commands.md create mode 100755 src/tests/tools/firewall_agent/docs/yang/generate-trees.sh create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang create mode 100644 src/tests/tools/firewall_agent/docs/yang/yang-repo-url.txt create mode 100644 src/tests/tools/firewall_agent/firewall_agent/__init__.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/app.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Components.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Root.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py create mode 100755 src/tests/tools/firewall_agent/redeploy.sh create mode 100644 src/tests/tools/firewall_agent/requirements.txt create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json create mode 100755 src/tests/tools/firewall_agent/scripts/run_nft_model.sh create mode 100755 src/tests/tools/firewall_agent/scripts/test_commands.sh diff --git a/src/tests/tools/firewall_agent/Dockerfile b/src/tests/tools/firewall_agent/Dockerfile new file mode 100644 index 000000000..dec746c5c --- /dev/null +++ b/src/tests/tools/firewall_agent/Dockerfile @@ -0,0 +1,30 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +FROM python:3.11-slim + +ENV PYTHONUNBUFFERED=0 + +RUN apt-get update -y +RUN apt-get install -y --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables +RUN apt-get clean -y && rm -rf /var/lib/apt/lists/* + +WORKDIR /app +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt +COPY firewall_agent ./firewall_agent + +EXPOSE 8888 +CMD ["python", "-m", "firewall_agent.app"] diff --git a/src/tests/tools/firewall_agent/README.md b/src/tests/tools/firewall_agent/README.md new file mode 100644 index 000000000..2f07034de --- /dev/null +++ b/src/tests/tools/firewall_agent/README.md @@ -0,0 +1,6 @@ +# Firewall Agent + +This repository contains a simple RESTCONF/OpenConfig firewall agent and a test deployment that demonstrates ACL behavior using two minimal HTTP servers. + +__NOTE: TO BE COMPLETED__ + diff --git a/src/tests/tools/firewall_agent/docker-compose-down.sh b/src/tests/tools/firewall_agent/docker-compose-down.sh new file mode 100755 index 000000000..edae64d04 --- /dev/null +++ b/src/tests/tools/firewall_agent/docker-compose-down.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -euo pipefail + +echo "Tearing down demo stack..." +docker compose -f docker-compose.yml down -v --remove-orphans diff --git a/src/tests/tools/firewall_agent/docker-compose-up.sh b/src/tests/tools/firewall_agent/docker-compose-up.sh new file mode 100755 index 000000000..43687694b --- /dev/null +++ b/src/tests/tools/firewall_agent/docker-compose-up.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -euo pipefail + +echo "Starting demo stack with docker compose..." +docker compose -f docker-compose.yml up -d --build + +echo "Waiting a few seconds for services to become healthy..." +sleep 3 + +echo "You can now run: python3 install_acls.py --ports 8001,8002" +echo "Services started. HTTP servers: http://localhost:8001 and http://localhost:8002." +echo "Firewall agent RESTCONF: http://localhost:8888/restconf/data" diff --git a/src/tests/tools/firewall_agent/docker-compose.yml b/src/tests/tools/firewall_agent/docker-compose.yml new file mode 100644 index 000000000..596ae4d51 --- /dev/null +++ b/src/tests/tools/firewall_agent/docker-compose.yml @@ -0,0 +1,37 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +services: + firewall_agent: + build: + context: . + dockerfile: Dockerfile + container_name: firewall-agent + network_mode: host + cap_add: + - NET_ADMIN + - NET_RAW + + public_server: + image: python:3.11-slim + container_name: public-server + network_mode: host + command: ["python", "-u", "-m", "http.server", "8001"] + + corporate_server: + image: python:3.11-slim + container_name: corporate-server + network_mode: host + command: ["python", "-u", "-m", "http.server", "8002"] diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md new file mode 100644 index 000000000..7dd08a844 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md @@ -0,0 +1,980 @@ +# Docs and Commands + +- Ref: https://ral-arturo.org/2020/11/22/python-nftables-tutorial.html +- Ref: https://www.netfilter.org/projects/nftables/manpage.html +- Ref: https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes + +- Note: table and chain can have comment as well. + +## Example Commands: + +```bash +sudo nft add table ip filter +sudo nft add chain ip filter input {type filter hook input priority filter ; policy accept; } +sudo nft add chain ip filter output {type filter hook output priority filter; policy accept; } + +# Example options +#sudo nft add rule ip filter input +# iifname lo +# oifname lo +# ip saddr 0.0.0.0/0 +# ip daddr 192.168.0.10/32 +# tcp sport 12345 +# tcp dport 80 +# accept/drop/reject +# comment "my-rule-name" + +sudo nft add rule ip filter input iifname enp0s3 ip saddr 0.0.0.0/0 ip daddr 192.168.0.10/32 tcp sport 12345 tcp dport 80 accept comment "my-rule-in-test" +sudo nft add rule ip filter output oifname enp0s3 ip daddr 0.0.0.0/0 ip saddr 192.168.0.10/32 tcp dport 80 tcp sport 12345 drop comment "my-rule-out-test" +``` + + +## Running code: + +```python +import json +import nftables + +nft = nftables.Nftables() +nft.set_json_output(True) +rc, output, error = nft.cmd("list ruleset") +print(json.loads(output)) +``` + +Retrieves in `output`: + +```json +{ + "nftables": [ + { + "metainfo": { + "version": "1.1.3", + "release_name": "Commodore Bullmoose #4", + "json_schema_version": 1 + } + }, + { + "table": { + "family": "ip", + "name": "nat", + "handle": 1 + } + }, + { + "chain": { + "family": "ip", + "table": "nat", + "name": "DOCKER", + "handle": 1 + } + }, + { + "chain": { + "family": "ip", + "table": "nat", + "name": "PREROUTING", + "handle": 6, + "type": "nat", + "hook": "prerouting", + "prio": -100, + "policy": "accept" + } + }, + { + "chain": { + "family": "ip", + "table": "nat", + "name": "OUTPUT", + "handle": 8, + "type": "nat", + "hook": "output", + "prio": -100, + "policy": "accept" + } + }, + { + "chain": { + "family": "ip", + "table": "nat", + "name": "POSTROUTING", + "handle": 10, + "type": "nat", + "hook": "postrouting", + "prio": 100, + "policy": "accept" + } + }, + { + "rule": { + "family": "ip", + "table": "nat", + "chain": "DOCKER", + "handle": 14, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "iifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "return": null + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "nat", + "chain": "PREROUTING", + "handle": 7, + "expr": [ + { + "xt": { + "type": "match", + "name": "addrtype" + } + }, + { + "counter": { + "packets": 2, + "bytes": 88 + } + }, + { + "jump": { + "target": "DOCKER" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "nat", + "chain": "OUTPUT", + "handle": 9, + "expr": [ + { + "match": { + "op": "!=", + "left": { + "payload": { + "protocol": "ip", + "field": "daddr" + } + }, + "right": { + "prefix": { + "addr": "127.0.0.0", + "len": 8 + } + } + } + }, + { + "xt": { + "type": "match", + "name": "addrtype" + } + }, + { + "counter": { + "packets": 12, + "bytes": 720 + } + }, + { + "jump": { + "target": "DOCKER" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "nat", + "chain": "POSTROUTING", + "handle": 13, + "expr": [ + { + "match": { + "op": "!=", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "match": { + "op": "==", + "left": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + "right": { + "prefix": { + "addr": "172.17.0.0", + "len": 16 + } + } + } + }, + { + "counter": { + "packets": 74, + "bytes": 4651 + } + }, + { + "xt": { + "type": "target", + "name": "MASQUERADE" + } + } + ] + } + }, + { + "table": { + "family": "ip", + "name": "filter", + "handle": 2 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER", + "handle": 1 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-FORWARD", + "handle": 2 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-BRIDGE", + "handle": 3 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-CT", + "handle": 4 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-ISOLATION-STAGE-1", + "handle": 5 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-ISOLATION-STAGE-2", + "handle": 6 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "FORWARD", + "handle": 7, + "type": "filter", + "hook": "forward", + "prio": 0, + "policy": "accept" + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "DOCKER-USER", + "handle": 18 + } + }, + { + "chain": { + "family": "ip", + "table": "filter", + "name": "INPUT", + "handle": 26, + "type": "filter", + "hook": "input", + "prio": 0, + "policy": "accept" + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER", + "handle": 21, + "expr": [ + { + "match": { + "op": "!=", + "left": { + "meta": { + "key": "iifname" + } + }, + "right": "docker0" + } + }, + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "drop": null + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 11, + "expr": [ + { + "counter": { + "packets": 188597, + "bytes": 246896440 + } + }, + { + "jump": { + "target": "DOCKER-CT" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 10, + "expr": [ + { + "counter": { + "packets": 68171, + "bytes": 3005971 + } + }, + { + "jump": { + "target": "DOCKER-ISOLATION-STAGE-1" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 9, + "expr": [ + { + "counter": { + "packets": 68171, + "bytes": 3005971 + } + }, + { + "jump": { + "target": "DOCKER-BRIDGE" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 20, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "iifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 68171, + "bytes": 3005971 + } + }, + { + "accept": null + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-BRIDGE", + "handle": 23, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-CT", + "handle": 22, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "xt": { + "type": "match", + "name": "conntrack" + } + }, + { + "counter": { + "packets": 120426, + "bytes": 243890469 + } + }, + { + "accept": null + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-ISOLATION-STAGE-1", + "handle": 24, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "iifname" + } + }, + "right": "docker0" + } + }, + { + "match": { + "op": "!=", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 68171, + "bytes": 3005971 + } + }, + { + "jump": { + "target": "DOCKER-ISOLATION-STAGE-2" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "DOCKER-ISOLATION-STAGE-2", + "handle": 25, + "expr": [ + { + "match": { + "op": "==", + "left": { + "meta": { + "key": "oifname" + } + }, + "right": "docker0" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "drop": null + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "FORWARD", + "handle": 19, + "expr": [ + { + "counter": { + "packets": 188597, + "bytes": 246896440 + } + }, + { + "jump": { + "target": "DOCKER-USER" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "FORWARD", + "handle": 8, + "expr": [ + { + "counter": { + "packets": 188597, + "bytes": 246896440 + } + }, + { + "jump": { + "target": "DOCKER-FORWARD" + } + } + ] + } + }, + { + "rule": { + "family": "ip", + "table": "filter", + "chain": "INPUT", + "handle": 27, + "expr": [ + { + "match": { + "op": "==", + "left": { + "payload": { + "protocol": "ip", + "field": "saddr" + } + }, + "right": "9.9.9.9" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "drop": null + } + ] + } + }, + { + "table": { + "family": "ip6", + "name": "nat", + "handle": 3 + } + }, + { + "chain": { + "family": "ip6", + "table": "nat", + "name": "DOCKER", + "handle": 1 + } + }, + { + "chain": { + "family": "ip6", + "table": "nat", + "name": "PREROUTING", + "handle": 2, + "type": "nat", + "hook": "prerouting", + "prio": -100, + "policy": "accept" + } + }, + { + "chain": { + "family": "ip6", + "table": "nat", + "name": "OUTPUT", + "handle": 4, + "type": "nat", + "hook": "output", + "prio": -100, + "policy": "accept" + } + }, + { + "rule": { + "family": "ip6", + "table": "nat", + "chain": "PREROUTING", + "handle": 3, + "expr": [ + { + "xt": { + "type": "match", + "name": "addrtype" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER" + } + } + ] + } + }, + { + "rule": { + "family": "ip6", + "table": "nat", + "chain": "OUTPUT", + "handle": 5, + "expr": [ + { + "match": { + "op": "!=", + "left": { + "payload": { + "protocol": "ip6", + "field": "daddr" + } + }, + "right": "::1" + } + }, + { + "xt": { + "type": "match", + "name": "addrtype" + } + }, + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER" + } + } + ] + } + }, + { + "table": { + "family": "ip6", + "name": "filter", + "handle": 4 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER", + "handle": 1 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-FORWARD", + "handle": 2 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-BRIDGE", + "handle": 3 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-CT", + "handle": 4 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-ISOLATION-STAGE-1", + "handle": 5 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-ISOLATION-STAGE-2", + "handle": 6 + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "FORWARD", + "handle": 7, + "type": "filter", + "hook": "forward", + "prio": 0, + "policy": "accept" + } + }, + { + "chain": { + "family": "ip6", + "table": "filter", + "name": "DOCKER-USER", + "handle": 12 + } + }, + { + "rule": { + "family": "ip6", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 11, + "expr": [ + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER-CT" + } + } + ] + } + }, + { + "rule": { + "family": "ip6", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 10, + "expr": [ + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER-ISOLATION-STAGE-1" + } + } + ] + } + }, + { + "rule": { + "family": "ip6", + "table": "filter", + "chain": "DOCKER-FORWARD", + "handle": 9, + "expr": [ + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER-BRIDGE" + } + } + ] + } + }, + { + "rule": { + "family": "ip6", + "table": "filter", + "chain": "FORWARD", + "handle": 13, + "expr": [ + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER-USER" + } + } + ] + } + }, + { + "rule": { + "family": "ip6", + "table": "filter", + "chain": "FORWARD", + "handle": 8, + "expr": [ + { + "counter": { + "packets": 0, + "bytes": 0 + } + }, + { + "jump": { + "target": "DOCKER-FORWARD" + } + } + ] + } + } + ] +} +``` diff --git a/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh b/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh new file mode 100755 index 000000000..30f02e67e --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +cd openconfig + +pyang -f tree -o ../openconfig-components.tree \ + platform/openconfig-platform-common.yang \ + platform/openconfig-platform-types.yang \ + platform/openconfig-platform.yang \ + system/openconfig-alarm-types.yang \ + types/openconfig-types.yang \ + types/openconfig-yang-types.yang + +pyang -f tree -o ../openconfig-interfaces.tree \ + interfaces/openconfig-if-aggregate.yang \ + interfaces/openconfig-if-ethernet.yang \ + interfaces/openconfig-if-ip.yang \ + interfaces/openconfig-interfaces.yang \ + openconfig-extensions.yang \ + openconfig-transport/openconfig-transport-types.yang \ + platform/openconfig-platform-types.yang \ + types/openconfig-inet-types.yang \ + types/openconfig-types.yang \ + types/openconfig-yang-types.yang \ + vlan/openconfig-vlan-types.yang \ + vlan/openconfig-vlan.yang + +pyang -f tree -o ../openconfig-acl.tree \ + acl/openconfig-acl.yang \ + acl/openconfig-icmpv4-types.yang \ + acl/openconfig-icmpv6-types.yang \ + acl/openconfig-packet-match-types.yang \ + acl/openconfig-packet-match.yang \ + defined-sets/openconfig-defined-sets.yang \ + interfaces/openconfig-interfaces.yang \ + mpls/openconfig-mpls-types.yang \ + openconfig-transport/openconfig-transport-types.yang \ + platform/openconfig-platform-types.yang \ + types/openconfig-inet-types.yang \ + types/openconfig-types.yang \ + types/openconfig-yang-types.yang diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang new file mode 100644 index 000000000..7bfee3647 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang @@ -0,0 +1,1619 @@ +module iana-if-type { + namespace "urn:ietf:params:xml:ns:yang:iana-if-type"; + prefix ianaift; + + import ietf-interfaces { + prefix if; + } + + organization "IANA"; + contact + " Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States + + Tel: +1 310 301 5800 + "; + description + "This YANG module defines YANG identities for IANA-registered + interface types. + + This YANG module is maintained by IANA and reflects the + 'ifType definitions' registry. + + The latest revision of this YANG module can be obtained from + the IANA web site. + + Requests for new values should be made to IANA via + email (iana&iana.org). + + Copyright (c) 2014 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + The initial version of this YANG module is part of RFC 7224; + see the RFC itself for full legal notices."; + reference + "IANA 'ifType definitions' registry. + "; + + revision 2017-01-19 { + description + "Registered ifType 289."; + } + + revision 2016-11-23 { + description + "Registered ifTypes 283-288."; + } + + revision 2016-06-09 { + description + "Registered ifType 282."; + } + revision 2016-05-03 { + description + "Registered ifType 281."; + } + revision 2015-06-12 { + description + "Corrected formatting issue."; + } + revision 2014-09-24 { + description + "Registered ifType 280."; + } + revision 2014-09-19 { + description + "Registered ifType 279."; + } + revision 2014-07-03 { + description + "Registered ifTypes 277-278."; + } + revision 2014-05-19 { + description + "Updated the contact address."; + } + revision 2014-05-08 { + description + "Initial revision."; + reference + "RFC 7224: IANA Interface Type YANG Module"; + } + + identity iana-interface-type { + base if:interface-type; + description + "This identity is used as a base for all interface types + defined in the 'ifType definitions' registry."; + } + + identity other { + base iana-interface-type; + } + identity regular1822 { + base iana-interface-type; + } + identity hdh1822 { + base iana-interface-type; + } + identity ddnX25 { + base iana-interface-type; + } + identity rfc877x25 { + base iana-interface-type; + reference + "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer"; + } + identity ethernetCsmacd { + base iana-interface-type; + description + "For all Ethernet-like interfaces, regardless of speed, + as per RFC 3635."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity iso88023Csmacd { + base iana-interface-type; + status deprecated; + description + "Deprecated via RFC 3635. + Use ethernetCsmacd(6) instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity iso88024TokenBus { + base iana-interface-type; + } + identity iso88025TokenRing { + base iana-interface-type; + } + identity iso88026Man { + base iana-interface-type; + } + identity starLan { + base iana-interface-type; + status deprecated; + description + "Deprecated via RFC 3635. + Use ethernetCsmacd(6) instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity proteon10Mbit { + base iana-interface-type; + } + identity proteon80Mbit { + base iana-interface-type; + } + identity hyperchannel { + base iana-interface-type; + } + identity fddi { + base iana-interface-type; + reference + "RFC 1512 - FDDI Management Information Base"; + } + identity lapb { + base iana-interface-type; + reference + "RFC 1381 - SNMP MIB Extension for X.25 LAPB"; + } + identity sdlc { + base iana-interface-type; + } + identity ds1 { + base iana-interface-type; + description + "DS1-MIB."; + reference + "RFC 4805 - Definitions of Managed Objects for the + DS1, J1, E1, DS2, and E2 Interface Types"; + } + identity e1 { + base iana-interface-type; + status obsolete; + description + "Obsolete; see DS1-MIB."; + reference + "RFC 4805 - Definitions of Managed Objects for the + DS1, J1, E1, DS2, and E2 Interface Types"; + } + identity basicISDN { + base iana-interface-type; + description + "No longer used. See also RFC 2127."; + } + identity primaryISDN { + base iana-interface-type; + description + "No longer used. See also RFC 2127."; + } + identity propPointToPointSerial { + base iana-interface-type; + description + "Proprietary serial."; + } + identity ppp { + base iana-interface-type; + } + identity softwareLoopback { + base iana-interface-type; + } + identity eon { + base iana-interface-type; + description + "CLNP over IP."; + } + identity ethernet3Mbit { + base iana-interface-type; + } + identity nsip { + base iana-interface-type; + description + "XNS over IP."; + } + identity slip { + base iana-interface-type; + description + "Generic SLIP."; + } + identity ultra { + base iana-interface-type; + description + "Ultra Technologies."; + } + identity ds3 { + base iana-interface-type; + description + "DS3-MIB."; + reference + "RFC 3896 - Definitions of Managed Objects for the + DS3/E3 Interface Type"; + } + identity sip { + base iana-interface-type; + description + "SMDS, coffee."; + reference + "RFC 1694 - Definitions of Managed Objects for SMDS + Interfaces using SMIv2"; + } + identity frameRelay { + base iana-interface-type; + description + "DTE only."; + reference + "RFC 2115 - Management Information Base for Frame Relay + DTEs Using SMIv2"; + } + identity rs232 { + base iana-interface-type; + reference + "RFC 1659 - Definitions of Managed Objects for RS-232-like + Hardware Devices using SMIv2"; + } + identity para { + base iana-interface-type; + description + "Parallel-port."; + reference + "RFC 1660 - Definitions of Managed Objects for + Parallel-printer-like Hardware Devices using + SMIv2"; + } + identity arcnet { + base iana-interface-type; + description + "ARCnet."; + } + identity arcnetPlus { + base iana-interface-type; + description + "ARCnet Plus."; + } + identity atm { + base iana-interface-type; + description + "ATM cells."; + } + identity miox25 { + base iana-interface-type; + reference + "RFC 1461 - SNMP MIB extension for Multiprotocol + Interconnect over X.25"; + } + identity sonet { + base iana-interface-type; + description + "SONET or SDH."; + } + identity x25ple { + base iana-interface-type; + reference + "RFC 2127 - ISDN Management Information Base using SMIv2"; + } + identity iso88022llc { + base iana-interface-type; + } + identity localTalk { + base iana-interface-type; + } + identity smdsDxi { + base iana-interface-type; + } + identity frameRelayService { + base iana-interface-type; + description + "FRNETSERV-MIB."; + reference + "RFC 2954 - Definitions of Managed Objects for Frame + Relay Service"; + } + identity v35 { + base iana-interface-type; + } + identity hssi { + base iana-interface-type; + } + identity hippi { + base iana-interface-type; + } + identity modem { + base iana-interface-type; + description + "Generic modem."; + } + identity aal5 { + base iana-interface-type; + description + "AAL5 over ATM."; + } + identity sonetPath { + base iana-interface-type; + } + identity sonetVT { + base iana-interface-type; + } + identity smdsIcip { + base iana-interface-type; + description + "SMDS InterCarrier Interface."; + } + identity propVirtual { + base iana-interface-type; + description + "Proprietary virtual/internal."; + reference + "RFC 2863 - The Interfaces Group MIB"; + } + identity propMultiplexor { + base iana-interface-type; + description + "Proprietary multiplexing."; + reference + "RFC 2863 - The Interfaces Group MIB"; + } + identity ieee80212 { + base iana-interface-type; + description + "100BaseVG."; + } + identity fibreChannel { + base iana-interface-type; + description + "Fibre Channel."; + } + identity hippiInterface { + base iana-interface-type; + description + "HIPPI interfaces."; + } + identity frameRelayInterconnect { + base iana-interface-type; + status obsolete; + description + "Obsolete; use either + frameRelay(32) or frameRelayService(44)."; + } + identity aflane8023 { + base iana-interface-type; + description + "ATM Emulated LAN for 802.3."; + } + identity aflane8025 { + base iana-interface-type; + description + "ATM Emulated LAN for 802.5."; + } + identity cctEmul { + base iana-interface-type; + description + "ATM Emulated circuit."; + } + identity fastEther { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity isdn { + base iana-interface-type; + description + "ISDN and X.25."; + reference + "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN + in the Packet Mode"; + } + identity v11 { + base iana-interface-type; + description + "CCITT V.11/X.21."; + } + identity v36 { + base iana-interface-type; + description + "CCITT V.36."; + } + identity g703at64k { + base iana-interface-type; + description + "CCITT G703 at 64Kbps."; + } + identity g703at2mb { + base iana-interface-type; + status obsolete; + description + "Obsolete; see DS1-MIB."; + } + identity qllc { + base iana-interface-type; + description + "SNA QLLC."; + } + identity fastEtherFX { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity channel { + base iana-interface-type; + description + "Channel."; + } + identity ieee80211 { + base iana-interface-type; + description + "Radio spread spectrum."; + } + identity ibm370parChan { + base iana-interface-type; + description + "IBM System 360/370 OEMI Channel."; + } + identity escon { + base iana-interface-type; + description + "IBM Enterprise Systems Connection."; + } + identity dlsw { + base iana-interface-type; + description + "Data Link Switching."; + } + identity isdns { + base iana-interface-type; + description + "ISDN S/T interface."; + } + identity isdnu { + base iana-interface-type; + description + "ISDN U interface."; + } + identity lapd { + base iana-interface-type; + description + "Link Access Protocol D."; + } + identity ipSwitch { + base iana-interface-type; + description + "IP Switching Objects."; + } + identity rsrb { + base iana-interface-type; + description + "Remote Source Route Bridging."; + } + identity atmLogical { + base iana-interface-type; + description + "ATM Logical Port."; + reference + "RFC 3606 - Definitions of Supplemental Managed Objects + for ATM Interface"; + } + identity ds0 { + base iana-interface-type; + description + "Digital Signal Level 0."; + reference + "RFC 2494 - Definitions of Managed Objects for the DS0 + and DS0 Bundle Interface Type"; + } + identity ds0Bundle { + base iana-interface-type; + description + "Group of ds0s on the same ds1."; + reference + "RFC 2494 - Definitions of Managed Objects for the DS0 + and DS0 Bundle Interface Type"; + } + identity bsc { + base iana-interface-type; + description + "Bisynchronous Protocol."; + } + identity async { + base iana-interface-type; + description + "Asynchronous Protocol."; + } + identity cnr { + base iana-interface-type; + description + "Combat Net Radio."; + } + identity iso88025Dtr { + base iana-interface-type; + description + "ISO 802.5r DTR."; + } + identity eplrs { + base iana-interface-type; + description + "Ext Pos Loc Report Sys."; + } + identity arap { + base iana-interface-type; + description + "Appletalk Remote Access Protocol."; + } + identity propCnls { + base iana-interface-type; + description + "Proprietary Connectionless Protocol."; + } + identity hostPad { + base iana-interface-type; + description + "CCITT-ITU X.29 PAD Protocol."; + } + identity termPad { + base iana-interface-type; + description + "CCITT-ITU X.3 PAD Facility."; + } + identity frameRelayMPI { + base iana-interface-type; + description + "Multiproto Interconnect over FR."; + } + identity x213 { + base iana-interface-type; + description + "CCITT-ITU X213."; + } + identity adsl { + base iana-interface-type; + description + "Asymmetric Digital Subscriber Loop."; + } + identity radsl { + base iana-interface-type; + description + "Rate-Adapt. Digital Subscriber Loop."; + } + identity sdsl { + base iana-interface-type; + description + "Symmetric Digital Subscriber Loop."; + } + identity vdsl { + base iana-interface-type; + description + "Very H-Speed Digital Subscrib. Loop."; + } + identity iso88025CRFPInt { + base iana-interface-type; + description + "ISO 802.5 CRFP."; + } + identity myrinet { + base iana-interface-type; + description + "Myricom Myrinet."; + } + identity voiceEM { + base iana-interface-type; + description + "Voice recEive and transMit."; + } + identity voiceFXO { + base iana-interface-type; + description + "Voice Foreign Exchange Office."; + } + identity voiceFXS { + base iana-interface-type; + description + "Voice Foreign Exchange Station."; + } + identity voiceEncap { + base iana-interface-type; + description + "Voice encapsulation."; + } + identity voiceOverIp { + base iana-interface-type; + description + "Voice over IP encapsulation."; + } + identity atmDxi { + base iana-interface-type; + description + "ATM DXI."; + } + identity atmFuni { + base iana-interface-type; + description + "ATM FUNI."; + } + identity atmIma { + base iana-interface-type; + description + "ATM IMA."; + } + identity pppMultilinkBundle { + base iana-interface-type; + description + "PPP Multilink Bundle."; + } + identity ipOverCdlc { + base iana-interface-type; + description + "IBM ipOverCdlc."; + } + identity ipOverClaw { + base iana-interface-type; + description + "IBM Common Link Access to Workstn."; + } + identity stackToStack { + base iana-interface-type; + description + "IBM stackToStack."; + } + identity virtualIpAddress { + base iana-interface-type; + description + "IBM VIPA."; + } + identity mpc { + base iana-interface-type; + description + "IBM multi-protocol channel support."; + } + identity ipOverAtm { + base iana-interface-type; + description + "IBM ipOverAtm."; + reference + "RFC 2320 - Definitions of Managed Objects for Classical IP + and ARP Over ATM Using SMIv2 (IPOA-MIB)"; + } + identity iso88025Fiber { + base iana-interface-type; + description + "ISO 802.5j Fiber Token Ring."; + } + identity tdlc { + base iana-interface-type; + description + "IBM twinaxial data link control."; + } + identity gigabitEthernet { + base iana-interface-type; + status deprecated; + description + "Obsoleted via RFC 3635. + ethernetCsmacd(6) should be used instead."; + reference + "RFC 3635 - Definitions of Managed Objects for the + Ethernet-like Interface Types"; + } + identity hdlc { + base iana-interface-type; + description + "HDLC."; + } + identity lapf { + base iana-interface-type; + description + "LAP F."; + } + identity v37 { + base iana-interface-type; + description + "V.37."; + } + identity x25mlp { + base iana-interface-type; + description + "Multi-Link Protocol."; + } + identity x25huntGroup { + base iana-interface-type; + description + "X25 Hunt Group."; + } + identity transpHdlc { + base iana-interface-type; + description + "Transp HDLC."; + } + identity interleave { + base iana-interface-type; + description + "Interleave channel."; + } + identity fast { + base iana-interface-type; + description + "Fast channel."; + } + identity ip { + base iana-interface-type; + description + "IP (for APPN HPR in IP networks)."; + } + identity docsCableMaclayer { + base iana-interface-type; + description + "CATV Mac Layer."; + } + identity docsCableDownstream { + base iana-interface-type; + description + "CATV Downstream interface."; + } + identity docsCableUpstream { + base iana-interface-type; + description + "CATV Upstream interface."; + } + identity a12MppSwitch { + base iana-interface-type; + description + "Avalon Parallel Processor."; + } + identity tunnel { + base iana-interface-type; + description + "Encapsulation interface."; + } + identity coffee { + base iana-interface-type; + description + "Coffee pot."; + reference + "RFC 2325 - Coffee MIB"; + } + identity ces { + base iana-interface-type; + description + "Circuit Emulation Service."; + } + identity atmSubInterface { + base iana-interface-type; + description + "ATM Sub Interface."; + } + identity l2vlan { + base iana-interface-type; + description + "Layer 2 Virtual LAN using 802.1Q."; + } + identity l3ipvlan { + base iana-interface-type; + description + "Layer 3 Virtual LAN using IP."; + } + identity l3ipxvlan { + base iana-interface-type; + description + "Layer 3 Virtual LAN using IPX."; + } + identity digitalPowerline { + base iana-interface-type; + description + "IP over Power Lines."; + } + identity mediaMailOverIp { + base iana-interface-type; + description + "Multimedia Mail over IP."; + } + identity dtm { + base iana-interface-type; + description + "Dynamic synchronous Transfer Mode."; + } + identity dcn { + base iana-interface-type; + description + "Data Communications Network."; + } + identity ipForward { + base iana-interface-type; + description + "IP Forwarding Interface."; + } + identity msdsl { + base iana-interface-type; + description + "Multi-rate Symmetric DSL."; + } + identity ieee1394 { + base iana-interface-type; + + description + "IEEE1394 High Performance Serial Bus."; + } + identity if-gsn { + base iana-interface-type; + description + "HIPPI-6400."; + } + identity dvbRccMacLayer { + base iana-interface-type; + description + "DVB-RCC MAC Layer."; + } + identity dvbRccDownstream { + base iana-interface-type; + description + "DVB-RCC Downstream Channel."; + } + identity dvbRccUpstream { + base iana-interface-type; + description + "DVB-RCC Upstream Channel."; + } + identity atmVirtual { + base iana-interface-type; + description + "ATM Virtual Interface."; + } + identity mplsTunnel { + base iana-interface-type; + description + "MPLS Tunnel Virtual Interface."; + } + identity srp { + base iana-interface-type; + description + "Spatial Reuse Protocol."; + } + identity voiceOverAtm { + base iana-interface-type; + description + "Voice over ATM."; + } + identity voiceOverFrameRelay { + base iana-interface-type; + description + "Voice Over Frame Relay."; + } + identity idsl { + base iana-interface-type; + description + "Digital Subscriber Loop over ISDN."; + } + identity compositeLink { + base iana-interface-type; + description + "Avici Composite Link Interface."; + } + identity ss7SigLink { + base iana-interface-type; + description + "SS7 Signaling Link."; + } + identity propWirelessP2P { + base iana-interface-type; + description + "Prop. P2P wireless interface."; + } + identity frForward { + base iana-interface-type; + description + "Frame Forward Interface."; + } + identity rfc1483 { + base iana-interface-type; + description + "Multiprotocol over ATM AAL5."; + reference + "RFC 1483 - Multiprotocol Encapsulation over ATM + Adaptation Layer 5"; + } + identity usb { + base iana-interface-type; + description + "USB Interface."; + } + identity ieee8023adLag { + base iana-interface-type; + description + "IEEE 802.3ad Link Aggregate."; + } + identity bgppolicyaccounting { + base iana-interface-type; + description + "BGP Policy Accounting."; + } + identity frf16MfrBundle { + base iana-interface-type; + description + "FRF.16 Multilink Frame Relay."; + } + identity h323Gatekeeper { + base iana-interface-type; + description + "H323 Gatekeeper."; + } + identity h323Proxy { + base iana-interface-type; + description + "H323 Voice and Video Proxy."; + } + identity mpls { + base iana-interface-type; + description + "MPLS."; + } + identity mfSigLink { + base iana-interface-type; + description + "Multi-frequency signaling link."; + } + identity hdsl2 { + base iana-interface-type; + description + "High Bit-Rate DSL - 2nd generation."; + } + identity shdsl { + base iana-interface-type; + description + "Multirate HDSL2."; + } + identity ds1FDL { + base iana-interface-type; + description + "Facility Data Link (4Kbps) on a DS1."; + } + identity pos { + base iana-interface-type; + description + "Packet over SONET/SDH Interface."; + } + identity dvbAsiIn { + base iana-interface-type; + description + "DVB-ASI Input."; + } + identity dvbAsiOut { + base iana-interface-type; + description + "DVB-ASI Output."; + } + identity plc { + base iana-interface-type; + description + "Power Line Communications."; + } + identity nfas { + base iana-interface-type; + description + "Non-Facility Associated Signaling."; + } + identity tr008 { + base iana-interface-type; + description + "TR008."; + } + identity gr303RDT { + base iana-interface-type; + description + "Remote Digital Terminal."; + } + identity gr303IDT { + base iana-interface-type; + description + "Integrated Digital Terminal."; + } + identity isup { + base iana-interface-type; + description + "ISUP."; + } + identity propDocsWirelessMaclayer { + base iana-interface-type; + description + "Cisco proprietary Maclayer."; + } + identity propDocsWirelessDownstream { + base iana-interface-type; + description + "Cisco proprietary Downstream."; + } + identity propDocsWirelessUpstream { + base iana-interface-type; + description + "Cisco proprietary Upstream."; + } + identity hiperlan2 { + base iana-interface-type; + description + "HIPERLAN Type 2 Radio Interface."; + } + identity propBWAp2Mp { + base iana-interface-type; + description + "PropBroadbandWirelessAccesspt2Multipt (use of this value + for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f + is deprecated, and ieee80216WMAN(237) should be used + instead)."; + } + identity sonetOverheadChannel { + base iana-interface-type; + description + "SONET Overhead Channel."; + } + identity digitalWrapperOverheadChannel { + base iana-interface-type; + description + "Digital Wrapper."; + } + identity aal2 { + base iana-interface-type; + description + "ATM adaptation layer 2."; + } + identity radioMAC { + base iana-interface-type; + description + "MAC layer over radio links."; + } + identity atmRadio { + base iana-interface-type; + description + "ATM over radio links."; + } + identity imt { + base iana-interface-type; + description + "Inter-Machine Trunks."; + } + identity mvl { + base iana-interface-type; + description + "Multiple Virtual Lines DSL."; + } + identity reachDSL { + base iana-interface-type; + description + "Long Reach DSL."; + } + identity frDlciEndPt { + base iana-interface-type; + description + "Frame Relay DLCI End Point."; + } + identity atmVciEndPt { + base iana-interface-type; + description + "ATM VCI End Point."; + } + identity opticalChannel { + base iana-interface-type; + description + "Optical Channel."; + } + identity opticalTransport { + base iana-interface-type; + description + "Optical Transport."; + } + identity propAtm { + base iana-interface-type; + description + "Proprietary ATM."; + } + identity voiceOverCable { + base iana-interface-type; + description + "Voice Over Cable Interface."; + } + identity infiniband { + base iana-interface-type; + description + "Infiniband."; + } + identity teLink { + base iana-interface-type; + description + "TE Link."; + } + identity q2931 { + base iana-interface-type; + description + "Q.2931."; + } + identity virtualTg { + base iana-interface-type; + description + "Virtual Trunk Group."; + } + identity sipTg { + base iana-interface-type; + description + "SIP Trunk Group."; + } + identity sipSig { + base iana-interface-type; + description + "SIP Signaling."; + } + identity docsCableUpstreamChannel { + base iana-interface-type; + description + "CATV Upstream Channel."; + } + identity econet { + base iana-interface-type; + description + "Acorn Econet."; + } + identity pon155 { + base iana-interface-type; + description + "FSAN 155Mb Symetrical PON interface."; + } + identity pon622 { + base iana-interface-type; + description + "FSAN 622Mb Symetrical PON interface."; + } + identity bridge { + base iana-interface-type; + description + "Transparent bridge interface."; + } + identity linegroup { + base iana-interface-type; + description + "Interface common to multiple lines."; + } + identity voiceEMFGD { + base iana-interface-type; + description + "Voice E&M Feature Group D."; + } + identity voiceFGDEANA { + base iana-interface-type; + description + "Voice FGD Exchange Access North American."; + } + identity voiceDID { + base iana-interface-type; + description + "Voice Direct Inward Dialing."; + } + identity mpegTransport { + base iana-interface-type; + description + "MPEG transport interface."; + } + identity sixToFour { + base iana-interface-type; + status deprecated; + description + "6to4 interface (DEPRECATED)."; + reference + "RFC 4087 - IP Tunnel MIB"; + } + identity gtp { + base iana-interface-type; + description + "GTP (GPRS Tunneling Protocol)."; + } + identity pdnEtherLoop1 { + base iana-interface-type; + description + "Paradyne EtherLoop 1."; + } + identity pdnEtherLoop2 { + base iana-interface-type; + description + "Paradyne EtherLoop 2."; + } + identity opticalChannelGroup { + base iana-interface-type; + description + "Optical Channel Group."; + } + identity homepna { + base iana-interface-type; + description + "HomePNA ITU-T G.989."; + } + identity gfp { + base iana-interface-type; + description + "Generic Framing Procedure (GFP)."; + } + identity ciscoISLvlan { + base iana-interface-type; + description + "Layer 2 Virtual LAN using Cisco ISL."; + } + identity actelisMetaLOOP { + base iana-interface-type; + description + "Acteleis proprietary MetaLOOP High Speed Link."; + } + identity fcipLink { + base iana-interface-type; + description + "FCIP Link."; + } + identity rpr { + base iana-interface-type; + description + "Resilient Packet Ring Interface Type."; + } + identity qam { + base iana-interface-type; + description + "RF Qam Interface."; + } + identity lmp { + base iana-interface-type; + description + "Link Management Protocol."; + reference + "RFC 4327 - Link Management Protocol (LMP) Management + Information Base (MIB)"; + } + identity cblVectaStar { + base iana-interface-type; + description + "Cambridge Broadband Networks Limited VectaStar."; + } + identity docsCableMCmtsDownstream { + base iana-interface-type; + description + "CATV Modular CMTS Downstream Interface."; + } + identity adsl2 { + base iana-interface-type; + status deprecated; + description + "Asymmetric Digital Subscriber Loop Version 2 + (DEPRECATED/OBSOLETED - please use adsl2plus(238) + instead)."; + reference + "RFC 4706 - Definitions of Managed Objects for Asymmetric + Digital Subscriber Line 2 (ADSL2)"; + } + identity macSecControlledIF { + base iana-interface-type; + description + "MACSecControlled."; + } + identity macSecUncontrolledIF { + base iana-interface-type; + description + "MACSecUncontrolled."; + } + identity aviciOpticalEther { + base iana-interface-type; + description + "Avici Optical Ethernet Aggregate."; + } + identity atmbond { + base iana-interface-type; + description + "atmbond."; + } + identity voiceFGDOS { + base iana-interface-type; + description + "Voice FGD Operator Services."; + } + identity mocaVersion1 { + base iana-interface-type; + description + "MultiMedia over Coax Alliance (MoCA) Interface + as documented in information provided privately to IANA."; + } + identity ieee80216WMAN { + base iana-interface-type; + description + "IEEE 802.16 WMAN interface."; + } + identity adsl2plus { + base iana-interface-type; + description + "Asymmetric Digital Subscriber Loop Version 2 - + Version 2 Plus and all variants."; + } + identity dvbRcsMacLayer { + base iana-interface-type; + description + "DVB-RCS MAC Layer."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity dvbTdm { + base iana-interface-type; + description + "DVB Satellite TDM."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity dvbRcsTdma { + base iana-interface-type; + description + "DVB-RCS TDMA."; + reference + "RFC 5728 - The SatLabs Group DVB-RCS MIB"; + } + identity x86Laps { + base iana-interface-type; + description + "LAPS based on ITU-T X.86/Y.1323."; + } + identity wwanPP { + base iana-interface-type; + description + "3GPP WWAN."; + } + identity wwanPP2 { + base iana-interface-type; + description + "3GPP2 WWAN."; + } + identity voiceEBS { + base iana-interface-type; + description + "Voice P-phone EBS physical interface."; + } + identity ifPwType { + base iana-interface-type; + description + "Pseudowire interface type."; + reference + "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)"; + } + identity ilan { + base iana-interface-type; + description + "Internal LAN on a bridge per IEEE 802.1ap."; + } + identity pip { + base iana-interface-type; + description + "Provider Instance Port on a bridge per IEEE 802.1ah PBB."; + } + identity aluELP { + base iana-interface-type; + description + "Alcatel-Lucent Ethernet Link Protection."; + } + identity gpon { + base iana-interface-type; + description + "Gigabit-capable passive optical networks (G-PON) as per + ITU-T G.948."; + } + identity vdsl2 { + base iana-interface-type; + description + "Very high speed digital subscriber line Version 2 + (as per ITU-T Recommendation G.993.2)."; + reference + "RFC 5650 - Definitions of Managed Objects for Very High + Speed Digital Subscriber Line 2 (VDSL2)"; + } + identity capwapDot11Profile { + base iana-interface-type; + description + "WLAN Profile Interface."; + reference + "RFC 5834 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Binding MIB for + IEEE 802.11"; + } + identity capwapDot11Bss { + base iana-interface-type; + description + "WLAN BSS Interface."; + reference + "RFC 5834 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Binding MIB for + IEEE 802.11"; + } + identity capwapWtpVirtualRadio { + base iana-interface-type; + description + "WTP Virtual Radio Interface."; + reference + "RFC 5833 - Control and Provisioning of Wireless Access + Points (CAPWAP) Protocol Base MIB"; + } + identity bits { + base iana-interface-type; + description + "bitsport."; + } + identity docsCableUpstreamRfPort { + base iana-interface-type; + description + "DOCSIS CATV Upstream RF Port."; + } + identity cableDownstreamRfPort { + base iana-interface-type; + description + "CATV downstream RF Port."; + } + identity vmwareVirtualNic { + base iana-interface-type; + description + "VMware Virtual Network Interface."; + } + identity ieee802154 { + base iana-interface-type; + description + "IEEE 802.15.4 WPAN interface."; + reference + "IEEE 802.15.4-2006"; + } + identity otnOdu { + base iana-interface-type; + description + "OTN Optical Data Unit."; + } + identity otnOtu { + base iana-interface-type; + description + "OTN Optical channel Transport Unit."; + } + identity ifVfiType { + base iana-interface-type; + description + "VPLS Forwarding Instance Interface Type."; + } + identity g9981 { + base iana-interface-type; + description + "G.998.1 bonded interface."; + } + identity g9982 { + base iana-interface-type; + description + "G.998.2 bonded interface."; + } + identity g9983 { + base iana-interface-type; + description + "G.998.3 bonded interface."; + } + + identity aluEpon { + base iana-interface-type; + description + "Ethernet Passive Optical Networks (E-PON)."; + } + identity aluEponOnu { + base iana-interface-type; + description + "EPON Optical Network Unit."; + } + identity aluEponPhysicalUni { + base iana-interface-type; + description + "EPON physical User to Network interface."; + } + identity aluEponLogicalLink { + base iana-interface-type; + description + "The emulation of a point-to-point link over the EPON + layer."; + } + identity aluGponOnu { + base iana-interface-type; + description + "GPON Optical Network Unit."; + reference + "ITU-T G.984.2"; + } + identity aluGponPhysicalUni { + base iana-interface-type; + description + "GPON physical User to Network interface."; + reference + "ITU-T G.984.2"; + } + identity vmwareNicTeam { + base iana-interface-type; + description + "VMware NIC Team."; + } + identity docsOfdmDownstream { + base iana-interface-type; + description + "CATV Downstream OFDM interface."; + } + identity docsOfdmaUpstream { + base iana-interface-type; + description + "CATV Upstream OFDMA interface."; + } + identity gfast { + base iana-interface-type; + description + "G.fast port."; + reference + "ITU-T G.9701"; + } + identity sdci { + base iana-interface-type; + description + "SDCI (IO-Link)."; + reference + "IEC 61131-9 Edition 1.0 2013-09"; + } + identity xboxWireless { + base iana-interface-type; + description + "Xbox wireless."; + } + identity fastdsl { + base iana-interface-type; + description + "FastDSL."; + reference + "BBF TR-355"; + } + identity docsCableScte55d1FwdOob { + base iana-interface-type; + description + "Cable SCTE 55-1 OOB Forward Channel."; + } + identity docsCableScte55d1RetOob { + base iana-interface-type; + description + "Cable SCTE 55-1 OOB Return Channel."; + } + identity docsCableScte55d2DsOob { + base iana-interface-type; + description + "Cable SCTE 55-2 OOB Downstream Channel."; + } + identity docsCableScte55d2UsOob { + base iana-interface-type; + description + "Cable SCTE 55-2 OOB Upstream Channel."; + } + identity docsCableNdf { + base iana-interface-type; + description + "Cable Narrowband Digital Forward."; + } + identity docsCableNdr { + base iana-interface-type; + description + "Cable Narrowband Digital Return."; + } + identity ptm { + base iana-interface-type; + description + "Packet Transfer Mode."; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang new file mode 100644 index 000000000..f66c205ce --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang @@ -0,0 +1,1123 @@ +module ietf-interfaces { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces"; + prefix if; + + import ietf-yang-types { + prefix yang; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + + contact + "WG Web: + WG List: + + Editor: Martin Bjorklund + "; + + description + "This module contains a collection of YANG definitions for + managing network interfaces. + + Copyright (c) 2018 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8343; see + the RFC itself for full legal notices."; + + revision 2018-02-20 { + description + "Updated to support NMDA."; + reference + "RFC 8343: A YANG Data Model for Interface Management"; + } + + revision 2014-05-08 { + description + "Initial revision."; + reference + "RFC 7223: A YANG Data Model for Interface Management"; + } + + /* + * Typedefs + */ + + typedef interface-ref { + type leafref { + path "/if:interfaces/if:interface/if:name"; + } + description + "This type is used by data models that need to reference + interfaces."; + } + + /* + * Identities + */ + + identity interface-type { + description + "Base identity from which specific interface types are + derived."; + } + + /* + * Features + */ + + feature arbitrary-names { + description + "This feature indicates that the device allows user-controlled + interfaces to be named arbitrarily."; + } + feature pre-provisioning { + description + "This feature indicates that the device supports + pre-provisioning of interface configuration, i.e., it is + possible to configure an interface whose physical interface + hardware is not present on the device."; + } + feature if-mib { + description + "This feature indicates that the device implements + the IF-MIB."; + reference + "RFC 2863: The Interfaces Group MIB"; + } + + /* + * Data nodes + */ + + container interfaces { + description + "Interface parameters."; + + list interface { + key "name"; + + description + "The list of interfaces on the device. + + The status of an interface is available in this list in the + operational state. If the configuration of a + system-controlled interface cannot be used by the system + (e.g., the interface hardware present does not match the + interface type), then the configuration is not applied to + the system-controlled interface shown in the operational + state. If the configuration of a user-controlled interface + cannot be used by the system, the configured interface is + not instantiated in the operational state. + + System-controlled interfaces created by the system are + always present in this list in the operational state, + whether or not they are configured."; + + leaf name { + type string; + description + "The name of the interface. + + A device MAY restrict the allowed values for this leaf, + possibly depending on the type of the interface. + For system-controlled interfaces, this leaf is the + device-specific name of the interface. + + If a client tries to create configuration for a + system-controlled interface that is not present in the + operational state, the server MAY reject the request if + the implementation does not support pre-provisioning of + interfaces or if the name refers to an interface that can + never exist in the system. A Network Configuration + Protocol (NETCONF) server MUST reply with an rpc-error + with the error-tag 'invalid-value' in this case. + + If the device supports pre-provisioning of interface + configuration, the 'pre-provisioning' feature is + advertised. + + If the device allows arbitrarily named user-controlled + interfaces, the 'arbitrary-names' feature is advertised. + + When a configured user-controlled interface is created by + the system, it is instantiated with the same name in the + operational state. + + A server implementation MAY map this leaf to the ifName + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifName. The definition of + such a mechanism is outside the scope of this document."; + reference + "RFC 2863: The Interfaces Group MIB - ifName"; + } + + leaf description { + type string; + description + "A textual description of the interface. + + A server implementation MAY map this leaf to the ifAlias + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifAlias. The definition of + such a mechanism is outside the scope of this document. + + Since ifAlias is defined to be stored in non-volatile + storage, the MIB implementation MUST map ifAlias to the + value of 'description' in the persistently stored + configuration."; + reference + "RFC 2863: The Interfaces Group MIB - ifAlias"; + } + + leaf type { + type identityref { + base interface-type; + } + mandatory true; + description + "The type of the interface. + + When an interface entry is created, a server MAY + initialize the type leaf with a valid value, e.g., if it + is possible to derive the type from the name of the + interface. + + If a client tries to set the type of an interface to a + value that can never be used by the system, e.g., if the + type is not supported or if the type does not match the + name of the interface, the server MUST reject the request. + A NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf enabled { + type boolean; + default "true"; + description + "This leaf contains the configured, desired state of the + interface. + + Systems that implement the IF-MIB use the value of this + leaf in the intended configuration to set + IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry + has been initialized, as described in RFC 2863. + + Changes in this leaf in the intended configuration are + reflected in ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf link-up-down-trap-enable { + if-feature if-mib; + type enumeration { + enum enabled { + value 1; + description + "The device will generate linkUp/linkDown SNMP + notifications for this interface."; + } + enum disabled { + value 2; + description + "The device will not generate linkUp/linkDown SNMP + notifications for this interface."; + } + } + description + "Controls whether linkUp/linkDown SNMP notifications + should be generated for this interface. + + If this node is not configured, the value 'enabled' is + operationally used by the server for interfaces that do + not operate on top of any other interface (i.e., there are + no 'lower-layer-if' entries), and 'disabled' otherwise."; + reference + "RFC 2863: The Interfaces Group MIB - + ifLinkUpDownTrapEnable"; + } + + leaf admin-status { + if-feature if-mib; + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "Not ready to pass packets and not in some test mode."; + } + enum testing { + value 3; + description + "In some test mode."; + } + } + config false; + mandatory true; + description + "The desired state of the interface. + + This leaf has the same read semantics as ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf oper-status { + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + + description + "The interface does not pass any packets."; + } + enum testing { + value 3; + description + "In some test mode. No operational packets can + be passed."; + } + enum unknown { + value 4; + description + "Status cannot be determined for some reason."; + } + enum dormant { + value 5; + description + "Waiting for some external event."; + } + enum not-present { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum lower-layer-down { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + config false; + mandatory true; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + } + + leaf last-change { + type yang:date-and-time; + config false; + description + "The time the interface entered its current operational + state. If the current state was entered prior to the + last re-initialization of the local network management + subsystem, then this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifLastChange"; + } + + leaf if-index { + if-feature if-mib; + type int32 { + range "1..2147483647"; + } + config false; + mandatory true; + description + "The ifIndex value for the ifEntry represented by this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifIndex"; + } + + leaf phys-address { + type yang:phys-address; + config false; + description + "The interface's address at its protocol sub-layer. For + example, for an 802.x interface, this object normally + contains a Media Access Control (MAC) address. The + interface's media-specific modules must define the bit + and byte ordering and the format of the value of this + object. For interfaces that do not have such an address + (e.g., a serial line), this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; + } + + leaf-list higher-layer-if { + type interface-ref; + config false; + description + "A list of references to interfaces layered on top of this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf-list lower-layer-if { + type interface-ref; + config false; + + description + "A list of references to interfaces layered underneath this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf speed { + type yang:gauge64; + units "bits/second"; + config false; + description + "An estimate of the interface's current bandwidth in bits + per second. For interfaces that do not vary in + bandwidth or for those where no accurate estimation can + be made, this node should contain the nominal bandwidth. + For interfaces that have no concept of bandwidth, this + node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - + ifSpeed, ifHighSpeed"; + } + + container statistics { + config false; + description + "A collection of interface-related statistics objects."; + + leaf discontinuity-time { + type yang:date-and-time; + mandatory true; + description + "The time on the most recent occasion at which any one or + more of this interface's counters suffered a + discontinuity. If no such discontinuities have occurred + since the last re-initialization of the local management + subsystem, then this node contains the time the local + management subsystem re-initialized itself."; + } + + leaf in-octets { + type yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + + leaf in-unicast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } + + leaf in-broadcast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } + + leaf in-multicast-pkts { + type yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } + + leaf in-discards { + type yang:counter32; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } + + leaf in-errors { + type yang:counter32; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } + + leaf in-unknown-protos { + type yang:counter32; + + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf out-octets { + type yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } + + leaf out-unicast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } + + leaf out-broadcast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } + + leaf out-multicast-pkts { + type yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } + + leaf out-discards { + type yang:counter32; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } + + leaf out-errors { + type yang:counter32; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } + } + + } + } + + /* + * Legacy typedefs + */ + + typedef interface-state-ref { + type leafref { + path "/if:interfaces-state/if:interface/if:name"; + } + status deprecated; + description + "This type is used by data models that need to reference + the operationally present interfaces."; + } + + /* + * Legacy operational state data nodes + */ + + container interfaces-state { + config false; + status deprecated; + description + "Data nodes for the operational state of interfaces."; + + list interface { + key "name"; + status deprecated; + + description + "The list of interfaces on the device. + + System-controlled interfaces created by the system are + always present in this list, whether or not they are + configured."; + + leaf name { + type string; + status deprecated; + description + "The name of the interface. + + A server implementation MAY map this leaf to the ifName + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifName. The definition of + such a mechanism is outside the scope of this document."; + reference + "RFC 2863: The Interfaces Group MIB - ifName"; + } + + leaf type { + type identityref { + base interface-type; + } + mandatory true; + status deprecated; + description + "The type of the interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf admin-status { + if-feature if-mib; + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "Not ready to pass packets and not in some test mode."; + } + enum testing { + value 3; + description + "In some test mode."; + } + } + mandatory true; + status deprecated; + description + "The desired state of the interface. + + This leaf has the same read semantics as ifAdminStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + leaf oper-status { + type enumeration { + enum up { + value 1; + description + "Ready to pass packets."; + } + enum down { + value 2; + description + "The interface does not pass any packets."; + } + enum testing { + value 3; + description + "In some test mode. No operational packets can + be passed."; + } + enum unknown { + value 4; + description + "Status cannot be determined for some reason."; + } + enum dormant { + value 5; + description + "Waiting for some external event."; + } + enum not-present { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum lower-layer-down { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + mandatory true; + status deprecated; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + } + + leaf last-change { + type yang:date-and-time; + status deprecated; + description + "The time the interface entered its current operational + state. If the current state was entered prior to the + last re-initialization of the local network management + subsystem, then this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifLastChange"; + } + + leaf if-index { + if-feature if-mib; + type int32 { + range "1..2147483647"; + } + mandatory true; + status deprecated; + description + "The ifIndex value for the ifEntry represented by this + interface."; + + reference + "RFC 2863: The Interfaces Group MIB - ifIndex"; + } + + leaf phys-address { + type yang:phys-address; + status deprecated; + description + "The interface's address at its protocol sub-layer. For + example, for an 802.x interface, this object normally + contains a Media Access Control (MAC) address. The + interface's media-specific modules must define the bit + and byte ordering and the format of the value of this + object. For interfaces that do not have such an address + (e.g., a serial line), this node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - ifPhysAddress"; + } + + leaf-list higher-layer-if { + type interface-state-ref; + status deprecated; + description + "A list of references to interfaces layered on top of this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf-list lower-layer-if { + type interface-state-ref; + status deprecated; + description + "A list of references to interfaces layered underneath this + interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifStackTable"; + } + + leaf speed { + type yang:gauge64; + units "bits/second"; + status deprecated; + description + "An estimate of the interface's current bandwidth in bits + per second. For interfaces that do not vary in + bandwidth or for those where no accurate estimation can + + be made, this node should contain the nominal bandwidth. + For interfaces that have no concept of bandwidth, this + node is not present."; + reference + "RFC 2863: The Interfaces Group MIB - + ifSpeed, ifHighSpeed"; + } + + container statistics { + status deprecated; + description + "A collection of interface-related statistics objects."; + + leaf discontinuity-time { + type yang:date-and-time; + mandatory true; + status deprecated; + description + "The time on the most recent occasion at which any one or + more of this interface's counters suffered a + discontinuity. If no such discontinuities have occurred + since the last re-initialization of the local management + subsystem, then this node contains the time the local + management subsystem re-initialized itself."; + } + + leaf in-octets { + type yang:counter64; + status deprecated; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets"; + } + + leaf in-unicast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts"; + } + + leaf in-broadcast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInBroadcastPkts"; + } + + leaf in-multicast-pkts { + type yang:counter64; + status deprecated; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCInMulticastPkts"; + } + + leaf in-discards { + type yang:counter32; + status deprecated; + + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards"; + } + + leaf in-errors { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors"; + } + + leaf in-unknown-protos { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf out-octets { + type yang:counter64; + status deprecated; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets"; + } + + leaf out-unicast-pkts { + type yang:counter64; + status deprecated; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts"; + } + + leaf out-broadcast-pkts { + type yang:counter64; + status deprecated; + + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutBroadcastPkts"; + } + + leaf out-multicast-pkts { + type yang:counter64; + status deprecated; + description + "The total number of packets that higher-level protocols + requested be transmitted and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - + ifHCOutMulticastPkts"; + } + + leaf out-discards { + type yang:counter32; + status deprecated; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards"; + } + + leaf out-errors { + type yang:counter32; + status deprecated; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system and at + other times as indicated by the value of + 'discontinuity-time'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors"; + } + } + } + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang new file mode 100644 index 000000000..ee58fa3ab --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang @@ -0,0 +1,474 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree new file mode 100644 index 000000000..74ce02934 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree @@ -0,0 +1,337 @@ +module: openconfig-acl + +--rw acl + +--rw config + +--ro state + | +--ro counter-capability? identityref + +--rw acl-sets + | +--rw acl-set* [name type] + | +--rw name -> ../config/name + | +--rw type -> ../config/type + | +--rw config + | | +--rw name? string + | | +--rw type? identityref + | | +--rw description? string + | +--ro state + | | +--ro name? string + | | +--ro type? identityref + | | +--ro description? string + | +--rw acl-entries + | +--rw acl-entry* [sequence-id] + | +--rw sequence-id -> ../config/sequence-id + | +--rw config + | | +--rw sequence-id? uint32 + | | +--rw description? string + | +--ro state + | | +--ro sequence-id? uint32 + | | +--ro description? string + | | +--ro matched-packets? oc-yang:counter64 + | | +--ro matched-octets? oc-yang:counter64 + | +--rw l2 + | | +--rw config + | | | +--rw source-mac? oc-yang:mac-address + | | | +--rw source-mac-mask? oc-yang:mac-address + | | | +--rw destination-mac? oc-yang:mac-address + | | | +--rw destination-mac-mask? oc-yang:mac-address + | | | +--rw ethertype? oc-pkt-match-types:ethertype-type + | | +--ro state + | | +--ro source-mac? oc-yang:mac-address + | | +--ro source-mac-mask? oc-yang:mac-address + | | +--ro destination-mac? oc-yang:mac-address + | | +--ro destination-mac-mask? oc-yang:mac-address + | | +--ro ethertype? oc-pkt-match-types:ethertype-type + | +--rw ipv4 + | | +--rw config + | | | +--rw source-address? oc-inet:ipv4-prefix + | | | +--rw source-address-prefix-set? -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name + | | | +--rw destination-address? oc-inet:ipv4-prefix + | | | +--rw destination-address-prefix-set? -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name + | | | +--rw dscp? oc-inet:dscp + | | | +--rw dscp-set* oc-inet:dscp + | | | +--rw length? uint16 + | | | +--rw protocol? oc-pkt-match-types:ip-protocol-type + | | | +--rw hop-limit? uint8 + | | +--ro state + | | | +--ro source-address? oc-inet:ipv4-prefix + | | | +--ro source-address-prefix-set? -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name + | | | +--ro destination-address? oc-inet:ipv4-prefix + | | | +--ro destination-address-prefix-set? -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name + | | | +--ro dscp? oc-inet:dscp + | | | +--ro dscp-set* oc-inet:dscp + | | | +--ro length? uint16 + | | | +--ro protocol? oc-pkt-match-types:ip-protocol-type + | | | +--ro hop-limit? uint8 + | | +--rw icmpv4 + | | +--rw config + | | | +--rw type? identityref + | | | +--rw code? identityref + | | +--ro state + | | +--ro type? identityref + | | +--ro code? identityref + | +--rw mpls + | | +--rw config + | | | +--rw traffic-class? oc-mpls:mpls-tc + | | | +--rw start-label-value? oc-mpls:mpls-label + | | | +--rw end-label-value? oc-mpls:mpls-label + | | | +--rw ttl-value? uint8 + | | +--ro state + | | +--ro traffic-class? oc-mpls:mpls-tc + | | +--ro start-label-value? oc-mpls:mpls-label + | | +--ro end-label-value? oc-mpls:mpls-label + | | +--ro ttl-value? uint8 + | +--rw ipv6 + | | +--rw config + | | | +--rw source-address? oc-inet:ipv6-prefix + | | | +--rw source-address-prefix-set? -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name + | | | +--rw source-flow-label? oc-inet:ipv6-flow-label + | | | +--rw destination-address? oc-inet:ipv6-prefix + | | | +--rw destination-address-prefix-set? -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name + | | | +--rw destination-flow-label? oc-inet:ipv6-flow-label + | | | +--rw dscp? oc-inet:dscp + | | | +--rw dscp-set* oc-inet:dscp + | | | +--rw length? uint16 + | | | +--rw protocol? oc-pkt-match-types:ip-protocol-type + | | | +--rw hop-limit? uint8 + | | +--ro state + | | | +--ro source-address? oc-inet:ipv6-prefix + | | | +--ro source-address-prefix-set? -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name + | | | +--ro source-flow-label? oc-inet:ipv6-flow-label + | | | +--ro destination-address? oc-inet:ipv6-prefix + | | | +--ro destination-address-prefix-set? -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name + | | | +--ro destination-flow-label? oc-inet:ipv6-flow-label + | | | +--ro dscp? oc-inet:dscp + | | | +--ro dscp-set* oc-inet:dscp + | | | +--ro length? uint16 + | | | +--ro protocol? oc-pkt-match-types:ip-protocol-type + | | | +--ro hop-limit? uint8 + | | +--rw icmpv6 + | | +--rw config + | | | +--rw type? identityref + | | | +--rw code? identityref + | | +--ro state + | | +--ro type? identityref + | | +--ro code? identityref + | +--rw transport + | | +--rw config + | | | +--rw source-port? oc-pkt-match-types:port-num-range + | | | +--rw source-port-set? -> /oc-sets:defined-sets/port-sets/port-set/name + | | | +--rw destination-port? oc-pkt-match-types:port-num-range + | | | +--rw destination-port-set? -> /oc-sets:defined-sets/port-sets/port-set/name + | | | +--rw detail-mode? enumeration + | | | +--rw explicit-detail-match-mode? enumeration + | | | +--rw explicit-tcp-flags* identityref + | | | +--rw builtin-detail? enumeration + | | +--ro state + | | +--ro source-port? oc-pkt-match-types:port-num-range + | | +--ro source-port-set? -> /oc-sets:defined-sets/port-sets/port-set/name + | | +--ro destination-port? oc-pkt-match-types:port-num-range + | | +--ro destination-port-set? -> /oc-sets:defined-sets/port-sets/port-set/name + | | +--ro detail-mode? enumeration + | | +--ro explicit-detail-match-mode? enumeration + | | +--ro explicit-tcp-flags* identityref + | | +--ro builtin-detail? enumeration + | +--rw input-interface + | | +--rw config + | | +--ro state + | | +--rw interface-ref + | | +--rw config + | | | +--rw interface? -> /oc-if:interfaces/interface/name + | | | +--rw subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | | +--ro state + | | +--ro interface? -> /oc-if:interfaces/interface/name + | | +--ro subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | +--rw actions + | +--rw config + | | +--rw forwarding-action identityref + | | +--rw log-action? identityref + | +--ro state + | +--ro forwarding-action identityref + | +--ro log-action? identityref + +--rw interfaces + +--rw interface* [id] + +--rw id -> ../config/id + +--rw config + | +--rw id? oc-if:interface-id + +--ro state + | +--ro id? oc-if:interface-id + +--rw interface-ref + | +--rw config + | | +--rw interface? -> /oc-if:interfaces/interface/name + | | +--rw subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | +--ro state + | +--ro interface? -> /oc-if:interfaces/interface/name + | +--ro subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + +--rw ingress-acl-sets + | +--rw ingress-acl-set* [set-name type] + | +--rw set-name -> ../config/set-name + | +--rw type -> ../config/type + | +--rw config + | | +--rw set-name? -> ../../../../../../acl-sets/acl-set/config/name + | | +--rw type? -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type + | +--ro state + | | +--ro set-name? -> ../../../../../../acl-sets/acl-set/config/name + | | +--ro type? -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type + | +--ro acl-entries + | +--ro acl-entry* [sequence-id] + | +--ro sequence-id -> ../state/sequence-id + | +--ro state + | +--ro sequence-id? -> /acl/acl-sets/acl-set[oc-acl:name=current()/../../../../set-name][oc-acl:type=current()/../../../../type]/oc-acl:acl-entries/acl-entry/sequence-id + | +--ro matched-packets? oc-yang:counter64 + | +--ro matched-octets? oc-yang:counter64 + +--rw egress-acl-sets + +--rw egress-acl-set* [set-name type] + +--rw set-name -> ../config/set-name + +--rw type -> ../config/type + +--rw config + | +--rw set-name? -> ../../../../../../acl-sets/acl-set/config/name + | +--rw type? -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type + +--ro state + | +--ro set-name? -> ../../../../../../acl-sets/acl-set/config/name + | +--ro type? -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type + +--ro acl-entries + +--ro acl-entry* [sequence-id] + +--ro sequence-id -> ../state/sequence-id + +--ro state + +--ro sequence-id? -> /acl/acl-sets/acl-set[oc-acl:name=current()/../../../../set-name][oc-acl:type=current()/../../../../type]/oc-acl:acl-entries/acl-entry/sequence-id + +--ro matched-packets? oc-yang:counter64 + +--ro matched-octets? oc-yang:counter64 + +module: openconfig-defined-sets + +--rw defined-sets + +--rw ipv4-prefix-sets + | +--rw ipv4-prefix-set* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? string + | | +--rw description? string + | | +--rw prefix* oc-inet:ipv4-prefix + | +--ro state + | +--ro name? string + | +--ro description? string + | +--ro prefix* oc-inet:ipv4-prefix + +--rw ipv6-prefix-sets + | +--rw ipv6-prefix-set* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? string + | | +--rw description? string + | | +--rw prefix* oc-inet:ipv6-prefix + | +--ro state + | +--ro name? string + | +--ro description? string + | +--ro prefix* oc-inet:ipv6-prefix + +--rw port-sets + +--rw port-set* [name] + +--rw name -> ../config/name + +--rw config + | +--rw name? string + | +--rw description? string + | +--rw port* oc-pkt-match-types:port-num-range + +--ro state + +--ro name? string + +--ro description? string + +--ro port* oc-pkt-match-types:port-num-range + +module: openconfig-interfaces + +--rw interfaces + +--rw interface* [name] + +--rw name -> ../config/name + +--rw config + | +--rw name? string + | +--rw type identityref + | +--rw mtu? uint16 + | +--rw loopback-mode? oc-opt-types:loopback-mode-type + | +--rw description? string + | +--rw enabled? boolean + +--ro state + | +--ro name? string + | +--ro type identityref + | +--ro mtu? uint16 + | +--ro loopback-mode? oc-opt-types:loopback-mode-type + | +--ro description? string + | +--ro enabled? boolean + | +--ro ifindex? uint32 + | +--ro admin-status enumeration + | +--ro oper-status enumeration + | +--ro last-change? oc-types:timeticks64 + | +--ro logical? boolean + | +--ro management? boolean + | +--ro cpu? boolean + | +--ro counters + | +--ro in-octets? oc-yang:counter64 + | +--ro in-pkts? oc-yang:counter64 + | +--ro in-unicast-pkts? oc-yang:counter64 + | +--ro in-broadcast-pkts? oc-yang:counter64 + | +--ro in-multicast-pkts? oc-yang:counter64 + | +--ro in-errors? oc-yang:counter64 + | +--ro in-discards? oc-yang:counter64 + | +--ro out-octets? oc-yang:counter64 + | +--ro out-pkts? oc-yang:counter64 + | +--ro out-unicast-pkts? oc-yang:counter64 + | +--ro out-broadcast-pkts? oc-yang:counter64 + | +--ro out-multicast-pkts? oc-yang:counter64 + | +--ro out-discards? oc-yang:counter64 + | +--ro out-errors? oc-yang:counter64 + | +--ro last-clear? oc-types:timeticks64 + | +--ro in-unknown-protos? oc-yang:counter64 + | +--ro in-fcs-errors? oc-yang:counter64 + | +--ro carrier-transitions? oc-yang:counter64 + | +--ro resets? oc-yang:counter64 + +--rw hold-time + | +--rw config + | | +--rw up? uint32 + | | +--rw down? uint32 + | +--ro state + | +--ro up? uint32 + | +--ro down? uint32 + +--rw penalty-based-aied + | +--rw config + | | +--rw max-suppress-time? uint32 + | | +--rw decay-half-life? uint32 + | | +--rw suppress-threshold? uint32 + | | +--rw reuse-threshold? uint32 + | | +--rw flap-penalty? uint32 + | +--ro state + | +--ro max-suppress-time? uint32 + | +--ro decay-half-life? uint32 + | +--ro suppress-threshold? uint32 + | +--ro reuse-threshold? uint32 + | +--ro flap-penalty? uint32 + +--rw subinterfaces + +--rw subinterface* [index] + +--rw index -> ../config/index + +--rw config + | +--rw index? uint32 + | +--rw description? string + | +--rw enabled? boolean + +--ro state + +--ro index? uint32 + +--ro description? string + +--ro enabled? boolean + +--ro name? string + +--ro ifindex? uint32 + +--ro admin-status enumeration + +--ro oper-status enumeration + +--ro last-change? oc-types:timeticks64 + +--ro logical? boolean + +--ro management? boolean + +--ro cpu? boolean + +--ro counters + +--ro in-octets? oc-yang:counter64 + +--ro in-pkts? oc-yang:counter64 + +--ro in-unicast-pkts? oc-yang:counter64 + +--ro in-broadcast-pkts? oc-yang:counter64 + +--ro in-multicast-pkts? oc-yang:counter64 + +--ro in-errors? oc-yang:counter64 + +--ro in-discards? oc-yang:counter64 + +--ro out-octets? oc-yang:counter64 + +--ro out-pkts? oc-yang:counter64 + +--ro out-unicast-pkts? oc-yang:counter64 + +--ro out-broadcast-pkts? oc-yang:counter64 + +--ro out-multicast-pkts? oc-yang:counter64 + +--ro out-discards? oc-yang:counter64 + +--ro out-errors? oc-yang:counter64 + +--ro last-clear? oc-types:timeticks64 + x--ro in-unknown-protos? oc-yang:counter64 + x--ro in-fcs-errors? oc-yang:counter64 + x--ro carrier-transitions? oc-yang:counter64 + diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree new file mode 100644 index 000000000..885a0947e --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree @@ -0,0 +1,188 @@ +module: openconfig-platform + +--rw components + +--rw component* [name] + +--rw name -> ../config/name + +--rw config + | +--rw name? string + +--ro state + | +--ro name? string + | +--ro type? union + | +--ro id? string + | +--ro location? string + | +--ro description? string + | +--ro mfg-name? string + | +--ro mfg-date? oc-yang:date + | +--ro hardware-version? string + | +--ro firmware-version? string + | +--ro software-version? string + | +--ro serial-no? string + | +--ro part-no? string + | +--ro model-name? string + | +--ro clei-code? string + | +--ro removable? boolean + | +--ro oper-status? identityref + | +--ro empty? boolean + | +--ro parent? -> ../../../component/config/name + | +--ro redundant-role? oc-platform-types:component-redundant-role + | +--ro last-switchover-reason + | | +--ro trigger? component-redundant-role-switchover-reason-trigger + | | +--ro details? string + | +--ro last-switchover-time? oc-types:timeticks64 + | +--ro last-reboot-reason? identityref + | +--ro last-reboot-time? oc-types:timeticks64 + | +--ro switchover-ready? boolean + | +--ro base-mac-address? oc-yang:mac-address + | +--ro temperature + | | +--ro instant? decimal64 + | | +--ro avg? decimal64 + | | +--ro min? decimal64 + | | +--ro max? decimal64 + | | +--ro interval? oc-types:stat-interval + | | +--ro min-time? oc-types:timeticks64 + | | +--ro max-time? oc-types:timeticks64 + | | +--ro alarm-status? boolean + | | +--ro alarm-threshold? uint32 + | | +--ro alarm-severity? identityref + | +--ro memory + | | +--ro available? uint64 + | | +--ro utilized? uint64 + | +--ro allocated-power? uint32 + | +--ro used-power? uint32 + | +--ro pcie + | +--ro fatal-errors + | | +--ro total-errors? oc-yang:counter64 + | | +--ro undefined-errors? oc-yang:counter64 + | | +--ro data-link-errors? oc-yang:counter64 + | | +--ro surprise-down-errors? oc-yang:counter64 + | | +--ro poisoned-tlp-errors? oc-yang:counter64 + | | +--ro flow-control-protocol-errors? oc-yang:counter64 + | | +--ro completion-timeout-errors? oc-yang:counter64 + | | +--ro completion-abort-errors? oc-yang:counter64 + | | +--ro unexpected-completion-errors? oc-yang:counter64 + | | +--ro receiver-overflow-errors? oc-yang:counter64 + | | +--ro malformed-tlp-errors? oc-yang:counter64 + | | +--ro ecrc-errors? oc-yang:counter64 + | | +--ro unsupported-request-errors? oc-yang:counter64 + | | +--ro acs-violation-errors? oc-yang:counter64 + | | +--ro internal-errors? oc-yang:counter64 + | | +--ro blocked-tlp-errors? oc-yang:counter64 + | | +--ro atomic-op-blocked-errors? oc-yang:counter64 + | | +--ro tlp-prefix-blocked-errors? oc-yang:counter64 + | +--ro non-fatal-errors + | | +--ro total-errors? oc-yang:counter64 + | | +--ro undefined-errors? oc-yang:counter64 + | | +--ro data-link-errors? oc-yang:counter64 + | | +--ro surprise-down-errors? oc-yang:counter64 + | | +--ro poisoned-tlp-errors? oc-yang:counter64 + | | +--ro flow-control-protocol-errors? oc-yang:counter64 + | | +--ro completion-timeout-errors? oc-yang:counter64 + | | +--ro completion-abort-errors? oc-yang:counter64 + | | +--ro unexpected-completion-errors? oc-yang:counter64 + | | +--ro receiver-overflow-errors? oc-yang:counter64 + | | +--ro malformed-tlp-errors? oc-yang:counter64 + | | +--ro ecrc-errors? oc-yang:counter64 + | | +--ro unsupported-request-errors? oc-yang:counter64 + | | +--ro acs-violation-errors? oc-yang:counter64 + | | +--ro internal-errors? oc-yang:counter64 + | | +--ro blocked-tlp-errors? oc-yang:counter64 + | | +--ro atomic-op-blocked-errors? oc-yang:counter64 + | | +--ro tlp-prefix-blocked-errors? oc-yang:counter64 + | +--ro correctable-errors + | +--ro total-errors? oc-yang:counter64 + | +--ro receiver-errors? oc-yang:counter64 + | +--ro bad-tlp-errors? oc-yang:counter64 + | +--ro bad-dllp-errors? oc-yang:counter64 + | +--ro relay-rollover-errors? oc-yang:counter64 + | +--ro replay-timeout-errors? oc-yang:counter64 + | +--ro advisory-non-fatal-errors? oc-yang:counter64 + | +--ro internal-errors? oc-yang:counter64 + | +--ro hdr-log-overflow-errors? oc-yang:counter64 + +--rw properties + | +--rw property* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? string + | | +--rw value? union + | +--ro state + | +--ro name? string + | +--ro value? union + | +--ro configurable? boolean + +--rw subcomponents + | +--rw subcomponent* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? -> ../../../../../component/config/name + | +--ro state + | +--ro name? -> ../../../../../component/config/name + +--rw chassis + | +--rw config + | +--ro state + | +--rw utilization + | +--rw resources + | +--rw resource* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? string + | | +--rw used-threshold-upper? oc-types:percentage + | | +--rw used-threshold-upper-clear? oc-types:percentage + | +--ro state + | +--ro name? string + | +--ro used-threshold-upper? oc-types:percentage + | +--ro used-threshold-upper-clear? oc-types:percentage + | +--ro used? uint64 + | +--ro committed? uint64 + | +--ro free? uint64 + | +--ro max-limit? uint64 + | +--ro high-watermark? uint64 + | +--ro last-high-watermark? oc-types:timeticks64 + | +--ro used-threshold-upper-exceeded? boolean + +--rw port + | +--rw config + | +--ro state + +--rw power-supply + | +--rw config + | +--ro state + +--rw fan + | +--rw config + | +--ro state + +--rw fabric + | +--rw config + | +--ro state + +--rw storage + | +--rw config + | +--ro state + +--rw cpu + | +--rw config + | +--ro state + +--rw integrated-circuit + | +--rw config + | +--ro state + | +--rw utilization + | +--rw resources + | +--rw resource* [name] + | +--rw name -> ../config/name + | +--rw config + | | +--rw name? string + | | +--rw used-threshold-upper? oc-types:percentage + | | +--rw used-threshold-upper-clear? oc-types:percentage + | +--ro state + | +--ro name? string + | +--ro used-threshold-upper? oc-types:percentage + | +--ro used-threshold-upper-clear? oc-types:percentage + | +--ro used? uint64 + | +--ro committed? uint64 + | +--ro free? uint64 + | +--ro max-limit? uint64 + | +--ro high-watermark? uint64 + | +--ro last-high-watermark? oc-types:timeticks64 + | +--ro used-threshold-upper-exceeded? boolean + +--rw backplane + | +--rw config + | +--ro state + +--rw software-module + | +--rw config + | +--ro state + +--rw controller-card + +--rw config + +--ro state + diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree new file mode 100644 index 000000000..0d780d63c --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree @@ -0,0 +1,716 @@ +module: openconfig-interfaces + +--rw interfaces + +--rw interface* [name] + +--rw name -> ../config/name + +--rw config + | +--rw name? string + | +--rw type identityref + | +--rw mtu? uint16 + | +--rw loopback-mode? oc-opt-types:loopback-mode-type + | +--rw description? string + | +--rw enabled? boolean + | +--rw oc-vlan:tpid? identityref + +--ro state + | +--ro name? string + | +--ro type identityref + | +--ro mtu? uint16 + | +--ro loopback-mode? oc-opt-types:loopback-mode-type + | +--ro description? string + | +--ro enabled? boolean + | +--ro ifindex? uint32 + | +--ro admin-status enumeration + | +--ro oper-status enumeration + | +--ro last-change? oc-types:timeticks64 + | +--ro logical? boolean + | +--ro management? boolean + | +--ro cpu? boolean + | +--ro counters + | | +--ro in-octets? oc-yang:counter64 + | | +--ro in-pkts? oc-yang:counter64 + | | +--ro in-unicast-pkts? oc-yang:counter64 + | | +--ro in-broadcast-pkts? oc-yang:counter64 + | | +--ro in-multicast-pkts? oc-yang:counter64 + | | +--ro in-errors? oc-yang:counter64 + | | +--ro in-discards? oc-yang:counter64 + | | +--ro out-octets? oc-yang:counter64 + | | +--ro out-pkts? oc-yang:counter64 + | | +--ro out-unicast-pkts? oc-yang:counter64 + | | +--ro out-broadcast-pkts? oc-yang:counter64 + | | +--ro out-multicast-pkts? oc-yang:counter64 + | | +--ro out-discards? oc-yang:counter64 + | | +--ro out-errors? oc-yang:counter64 + | | +--ro last-clear? oc-types:timeticks64 + | | +--ro in-unknown-protos? oc-yang:counter64 + | | +--ro in-fcs-errors? oc-yang:counter64 + | | +--ro carrier-transitions? oc-yang:counter64 + | | +--ro resets? oc-yang:counter64 + | +--ro oc-vlan:tpid? identityref + +--rw hold-time + | +--rw config + | | +--rw up? uint32 + | | +--rw down? uint32 + | +--ro state + | +--ro up? uint32 + | +--ro down? uint32 + +--rw penalty-based-aied + | +--rw config + | | +--rw max-suppress-time? uint32 + | | +--rw decay-half-life? uint32 + | | +--rw suppress-threshold? uint32 + | | +--rw reuse-threshold? uint32 + | | +--rw flap-penalty? uint32 + | +--ro state + | +--ro max-suppress-time? uint32 + | +--ro decay-half-life? uint32 + | +--ro suppress-threshold? uint32 + | +--ro reuse-threshold? uint32 + | +--ro flap-penalty? uint32 + +--rw subinterfaces + | +--rw subinterface* [index] + | +--rw index -> ../config/index + | +--rw config + | | +--rw index? uint32 + | | +--rw description? string + | | +--rw enabled? boolean + | +--ro state + | | +--ro index? uint32 + | | +--ro description? string + | | +--ro enabled? boolean + | | +--ro name? string + | | +--ro ifindex? uint32 + | | +--ro admin-status enumeration + | | +--ro oper-status enumeration + | | +--ro last-change? oc-types:timeticks64 + | | +--ro logical? boolean + | | +--ro management? boolean + | | +--ro cpu? boolean + | | +--ro counters + | | +--ro in-octets? oc-yang:counter64 + | | +--ro in-pkts? oc-yang:counter64 + | | +--ro in-unicast-pkts? oc-yang:counter64 + | | +--ro in-broadcast-pkts? oc-yang:counter64 + | | +--ro in-multicast-pkts? oc-yang:counter64 + | | +--ro in-errors? oc-yang:counter64 + | | +--ro in-discards? oc-yang:counter64 + | | +--ro out-octets? oc-yang:counter64 + | | +--ro out-pkts? oc-yang:counter64 + | | +--ro out-unicast-pkts? oc-yang:counter64 + | | +--ro out-broadcast-pkts? oc-yang:counter64 + | | +--ro out-multicast-pkts? oc-yang:counter64 + | | +--ro out-discards? oc-yang:counter64 + | | +--ro out-errors? oc-yang:counter64 + | | +--ro last-clear? oc-types:timeticks64 + | | x--ro in-unknown-protos? oc-yang:counter64 + | | x--ro in-fcs-errors? oc-yang:counter64 + | | x--ro carrier-transitions? oc-yang:counter64 + | +--rw oc-vlan:vlan + | | +--rw oc-vlan:config + | | | x--rw oc-vlan:vlan-id? union + | | +--ro oc-vlan:state + | | | x--ro oc-vlan:vlan-id? union + | | +--rw oc-vlan:match + | | | +--rw oc-vlan:single-tagged + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:single-tagged-list + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:vlan-ids* oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:vlan-ids* oc-vlan-types:vlan-id + | | | +--rw oc-vlan:single-tagged-range + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:low-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:high-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:low-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:high-vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged-inner-list + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:inner-vlan-ids* oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:inner-vlan-ids* oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged-outer-list + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-vlan-ids* oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-vlan-ids* oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged-inner-range + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:inner-low-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:inner-high-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-vlan-id* oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:inner-low-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:inner-high-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-vlan-id* oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged-outer-range + | | | | +--rw oc-vlan:config + | | | | | +--rw oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-low-vlan-id? oc-vlan-types:vlan-id + | | | | | +--rw oc-vlan:outer-high-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:state + | | | | +--ro oc-vlan:inner-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-low-vlan-id? oc-vlan-types:vlan-id + | | | | +--ro oc-vlan:outer-high-vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:double-tagged-inner-outer-range + | | | +--rw oc-vlan:config + | | | | +--rw oc-vlan:inner-low-vlan-id? oc-vlan-types:vlan-id + | | | | +--rw oc-vlan:inner-high-vlan-id? oc-vlan-types:vlan-id + | | | | +--rw oc-vlan:outer-low-vlan-id? oc-vlan-types:vlan-id + | | | | +--rw oc-vlan:outer-high-vlan-id? oc-vlan-types:vlan-id + | | | +--ro oc-vlan:state + | | | +--ro oc-vlan:inner-low-vlan-id? oc-vlan-types:vlan-id + | | | +--ro oc-vlan:inner-high-vlan-id? oc-vlan-types:vlan-id + | | | +--ro oc-vlan:outer-low-vlan-id? oc-vlan-types:vlan-id + | | | +--ro oc-vlan:outer-high-vlan-id? oc-vlan-types:vlan-id + | | +--rw oc-vlan:ingress-mapping + | | | +--rw oc-vlan:config + | | | | +--rw oc-vlan:vlan-stack-action? oc-vlan-types:vlan-stack-action + | | | | +--rw oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | | | +--rw oc-vlan:tpid? identityref + | | | +--ro oc-vlan:state + | | | +--ro oc-vlan:vlan-stack-action? oc-vlan-types:vlan-stack-action + | | | +--ro oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | | +--ro oc-vlan:tpid? identityref + | | +--rw oc-vlan:egress-mapping + | | +--rw oc-vlan:config + | | | +--rw oc-vlan:vlan-stack-action? oc-vlan-types:vlan-stack-action + | | | +--rw oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | | +--rw oc-vlan:tpid? identityref + | | +--ro oc-vlan:state + | | +--ro oc-vlan:vlan-stack-action? oc-vlan-types:vlan-stack-action + | | +--ro oc-vlan:vlan-id? oc-vlan-types:vlan-id + | | +--ro oc-vlan:tpid? identityref + | +--rw oc-ip:ipv4 + | | +--rw oc-ip:addresses + | | | +--rw oc-ip:address* [ip] + | | | +--rw oc-ip:ip -> ../config/ip + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:ip? oc-inet:ipv4-address + | | | | +--rw oc-ip:prefix-length? uint8 + | | | | +--rw oc-ip:type? ipv4-address-type + | | | +--ro oc-ip:state + | | | | +--ro oc-ip:ip? oc-inet:ipv4-address + | | | | +--ro oc-ip:prefix-length? uint8 + | | | | +--ro oc-ip:type? ipv4-address-type + | | | | +--ro oc-ip:origin? ip-address-origin + | | | +--rw oc-ip:vrrp + | | | +--rw oc-ip:vrrp-group* [virtual-router-id] + | | | +--rw oc-ip:virtual-router-id -> ../config/virtual-router-id + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:virtual-router-id? uint8 + | | | | +--rw oc-ip:virtual-address* oc-inet:ip-address + | | | | +--rw oc-ip:priority? uint8 + | | | | +--rw oc-ip:preempt? boolean + | | | | +--rw oc-ip:preempt-delay? uint16 + | | | | +--rw oc-ip:accept-mode? boolean + | | | | +--rw oc-ip:advertisement-interval? uint16 + | | | +--ro oc-ip:state + | | | | +--ro oc-ip:virtual-router-id? uint8 + | | | | +--ro oc-ip:virtual-address* oc-inet:ip-address + | | | | +--ro oc-ip:priority? uint8 + | | | | +--ro oc-ip:preempt? boolean + | | | | +--ro oc-ip:preempt-delay? uint16 + | | | | +--ro oc-ip:accept-mode? boolean + | | | | +--ro oc-ip:advertisement-interval? uint16 + | | | | +--ro oc-ip:current-priority? uint8 + | | | +--rw oc-ip:interface-tracking + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | | | +--rw oc-ip:priority-decrement? uint8 + | | | +--ro oc-ip:state + | | | +--ro oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | | +--ro oc-ip:priority-decrement? uint8 + | | +--rw oc-ip:proxy-arp + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:mode? enumeration + | | | +--ro oc-ip:state + | | | +--ro oc-ip:mode? enumeration + | | +--rw oc-ip:neighbors + | | | +--rw oc-ip:neighbor* [ip] + | | | +--rw oc-ip:ip -> ../config/ip + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:ip? oc-inet:ipv4-address + | | | | +--rw oc-ip:link-layer-address oc-yang:phys-address + | | | +--ro oc-ip:state + | | | +--ro oc-ip:ip? oc-inet:ipv4-address + | | | +--ro oc-ip:link-layer-address oc-yang:phys-address + | | | +--ro oc-ip:origin? neighbor-origin + | | +--rw oc-ip:unnumbered + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:enabled? boolean + | | | +--ro oc-ip:state + | | | | +--ro oc-ip:enabled? boolean + | | | +--rw oc-ip:interface-ref + | | | +--rw oc-ip:config + | | | | +--rw oc-ip:interface? -> /oc-if:interfaces/interface/name + | | | | +--rw oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | | | +--ro oc-ip:state + | | | +--ro oc-ip:interface? -> /oc-if:interfaces/interface/name + | | | +--ro oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | | +--rw oc-ip:config + | | | +--rw oc-ip:enabled? boolean + | | | +--rw oc-ip:mtu? uint16 + | | | +--rw oc-ip:dhcp-client? boolean + | | +--ro oc-ip:state + | | +--ro oc-ip:enabled? boolean + | | +--ro oc-ip:mtu? uint16 + | | +--ro oc-ip:dhcp-client? boolean + | | +--ro oc-ip:counters + | | +--ro oc-ip:in-pkts? oc-yang:counter64 + | | +--ro oc-ip:in-octets? oc-yang:counter64 + | | +--ro oc-ip:in-multicast-pkts? oc-yang:counter64 + | | +--ro oc-ip:in-multicast-octets? oc-yang:counter64 + | | +--ro oc-ip:in-error-pkts? oc-yang:counter64 + | | +--ro oc-ip:in-forwarded-pkts? oc-yang:counter64 + | | +--ro oc-ip:in-forwarded-octets? oc-yang:counter64 + | | +--ro oc-ip:in-discarded-pkts? oc-yang:counter64 + | | +--ro oc-ip:out-pkts? oc-yang:counter64 + | | +--ro oc-ip:out-octets? oc-yang:counter64 + | | +--ro oc-ip:out-multicast-pkts? oc-yang:counter64 + | | +--ro oc-ip:out-multicast-octets? oc-yang:counter64 + | | +--ro oc-ip:out-error-pkts? oc-yang:counter64 + | | +--ro oc-ip:out-forwarded-pkts? oc-yang:counter64 + | | +--ro oc-ip:out-forwarded-octets? oc-yang:counter64 + | | +--ro oc-ip:out-discarded-pkts? oc-yang:counter64 + | +--rw oc-ip:ipv6 + | +--rw oc-ip:addresses + | | +--rw oc-ip:address* [ip] + | | +--rw oc-ip:ip -> ../config/ip + | | +--rw oc-ip:config + | | | +--rw oc-ip:ip? oc-inet:ipv6-address + | | | +--rw oc-ip:prefix-length uint8 + | | | +--rw oc-ip:type? oc-inet:ipv6-address-type + | | +--ro oc-ip:state + | | | +--ro oc-ip:ip? oc-inet:ipv6-address + | | | +--ro oc-ip:prefix-length uint8 + | | | +--ro oc-ip:type? oc-inet:ipv6-address-type + | | | +--ro oc-ip:origin? ip-address-origin + | | | +--ro oc-ip:status? enumeration + | | +--rw oc-ip:vrrp + | | +--rw oc-ip:vrrp-group* [virtual-router-id] + | | +--rw oc-ip:virtual-router-id -> ../config/virtual-router-id + | | +--rw oc-ip:config + | | | +--rw oc-ip:virtual-router-id? uint8 + | | | +--rw oc-ip:virtual-address* oc-inet:ip-address + | | | +--rw oc-ip:priority? uint8 + | | | +--rw oc-ip:preempt? boolean + | | | +--rw oc-ip:preempt-delay? uint16 + | | | +--rw oc-ip:accept-mode? boolean + | | | +--rw oc-ip:advertisement-interval? uint16 + | | | +--rw oc-ip:virtual-link-local? oc-inet:ip-address + | | +--ro oc-ip:state + | | | +--ro oc-ip:virtual-router-id? uint8 + | | | +--ro oc-ip:virtual-address* oc-inet:ip-address + | | | +--ro oc-ip:priority? uint8 + | | | +--ro oc-ip:preempt? boolean + | | | +--ro oc-ip:preempt-delay? uint16 + | | | +--ro oc-ip:accept-mode? boolean + | | | +--ro oc-ip:advertisement-interval? uint16 + | | | +--ro oc-ip:current-priority? uint8 + | | | +--ro oc-ip:virtual-link-local? oc-inet:ip-address + | | +--rw oc-ip:interface-tracking + | | +--rw oc-ip:config + | | | +--rw oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | | +--rw oc-ip:priority-decrement? uint8 + | | +--ro oc-ip:state + | | +--ro oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | +--ro oc-ip:priority-decrement? uint8 + | +--rw oc-ip:router-advertisement + | | +--rw oc-ip:config + | | | +--rw oc-ip:enable? boolean + | | | +--rw oc-ip:interval? uint32 + | | | +--rw oc-ip:lifetime? uint32 + | | | x--rw oc-ip:suppress? boolean + | | | +--rw oc-ip:mode? enumeration + | | | +--rw oc-ip:managed? boolean + | | | +--rw oc-ip:other-config? boolean + | | +--ro oc-ip:state + | | | +--ro oc-ip:enable? boolean + | | | +--ro oc-ip:interval? uint32 + | | | +--ro oc-ip:lifetime? uint32 + | | | x--ro oc-ip:suppress? boolean + | | | +--ro oc-ip:mode? enumeration + | | | +--ro oc-ip:managed? boolean + | | | +--ro oc-ip:other-config? boolean + | | +--rw oc-ip:prefixes + | | +--rw oc-ip:prefix* [prefix] + | | +--rw oc-ip:prefix -> ../config/prefix + | | +--rw oc-ip:config + | | | +--rw oc-ip:prefix? oc-inet:ipv6-prefix + | | | +--rw oc-ip:valid-lifetime? uint32 + | | | +--rw oc-ip:preferred-lifetime? uint32 + | | | +--rw oc-ip:disable-advertisement? boolean + | | | +--rw oc-ip:disable-autoconfiguration? boolean + | | | +--rw oc-ip:enable-onlink? boolean + | | +--ro oc-ip:state + | | +--ro oc-ip:prefix? oc-inet:ipv6-prefix + | | +--ro oc-ip:valid-lifetime? uint32 + | | +--ro oc-ip:preferred-lifetime? uint32 + | | +--ro oc-ip:disable-advertisement? boolean + | | +--ro oc-ip:disable-autoconfiguration? boolean + | | +--ro oc-ip:enable-onlink? boolean + | +--rw oc-ip:neighbors + | | +--rw oc-ip:neighbor* [ip] + | | +--rw oc-ip:ip -> ../config/ip + | | +--rw oc-ip:config + | | | +--rw oc-ip:ip? oc-inet:ipv6-address + | | | +--rw oc-ip:link-layer-address oc-yang:phys-address + | | +--ro oc-ip:state + | | +--ro oc-ip:ip? oc-inet:ipv6-address + | | +--ro oc-ip:link-layer-address oc-yang:phys-address + | | +--ro oc-ip:origin? neighbor-origin + | | +--ro oc-ip:is-router? boolean + | | +--ro oc-ip:neighbor-state? enumeration + | +--rw oc-ip:unnumbered + | | +--rw oc-ip:config + | | | +--rw oc-ip:enabled? boolean + | | +--ro oc-ip:state + | | | +--ro oc-ip:enabled? boolean + | | +--rw oc-ip:interface-ref + | | +--rw oc-ip:config + | | | +--rw oc-ip:interface? -> /oc-if:interfaces/interface/name + | | | +--rw oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | | +--ro oc-ip:state + | | +--ro oc-ip:interface? -> /oc-if:interfaces/interface/name + | | +--ro oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | +--rw oc-ip:config + | | +--rw oc-ip:enabled? boolean + | | +--rw oc-ip:mtu? uint32 + | | +--rw oc-ip:dup-addr-detect-transmits? uint32 + | | +--rw oc-ip:dhcp-client? boolean + | +--ro oc-ip:state + | +--ro oc-ip:enabled? boolean + | +--ro oc-ip:mtu? uint32 + | +--ro oc-ip:dup-addr-detect-transmits? uint32 + | +--ro oc-ip:dhcp-client? boolean + | +--ro oc-ip:counters + | +--ro oc-ip:in-pkts? oc-yang:counter64 + | +--ro oc-ip:in-octets? oc-yang:counter64 + | +--ro oc-ip:in-multicast-pkts? oc-yang:counter64 + | +--ro oc-ip:in-multicast-octets? oc-yang:counter64 + | +--ro oc-ip:in-error-pkts? oc-yang:counter64 + | +--ro oc-ip:in-forwarded-pkts? oc-yang:counter64 + | +--ro oc-ip:in-forwarded-octets? oc-yang:counter64 + | +--ro oc-ip:in-discarded-pkts? oc-yang:counter64 + | +--ro oc-ip:out-pkts? oc-yang:counter64 + | +--ro oc-ip:out-octets? oc-yang:counter64 + | +--ro oc-ip:out-multicast-pkts? oc-yang:counter64 + | +--ro oc-ip:out-multicast-octets? oc-yang:counter64 + | +--ro oc-ip:out-error-pkts? oc-yang:counter64 + | +--ro oc-ip:out-forwarded-pkts? oc-yang:counter64 + | +--ro oc-ip:out-forwarded-octets? oc-yang:counter64 + | +--ro oc-ip:out-discarded-pkts? oc-yang:counter64 + +--rw oc-eth:ethernet + | +--rw oc-eth:config + | | +--rw oc-eth:mac-address? oc-yang:mac-address + | | +--rw oc-eth:auto-negotiate? boolean + | | +--rw oc-eth:standalone-link-training? boolean + | | +--rw oc-eth:duplex-mode? enumeration + | | +--rw oc-eth:port-speed? identityref + | | +--rw oc-eth:enable-flow-control? boolean + | | +--rw oc-eth:fec-mode? identityref + | | +--rw oc-lag:aggregate-id? -> /oc-if:interfaces/interface/name + | +--ro oc-eth:state + | | +--ro oc-eth:mac-address? oc-yang:mac-address + | | +--ro oc-eth:auto-negotiate? boolean + | | +--ro oc-eth:standalone-link-training? boolean + | | +--ro oc-eth:duplex-mode? enumeration + | | +--ro oc-eth:port-speed? identityref + | | +--ro oc-eth:enable-flow-control? boolean + | | +--ro oc-eth:fec-mode? identityref + | | +--ro oc-eth:hw-mac-address? oc-yang:mac-address + | | +--ro oc-eth:negotiated-duplex-mode? enumeration + | | +--ro oc-eth:negotiated-port-speed? identityref + | | +--ro oc-eth:counters + | | | +--ro oc-eth:in-mac-control-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-mac-pause-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-oversize-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-undersize-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-jabber-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-fragment-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-8021q-frames? oc-yang:counter64 + | | | +--ro oc-eth:in-crc-errors? oc-yang:counter64 + | | | +--ro oc-eth:in-block-errors? oc-yang:counter64 + | | | +--ro oc-eth:in-carrier-errors? oc-yang:counter64 + | | | +--ro oc-eth:in-interrupted-tx? oc-yang:counter64 + | | | +--ro oc-eth:in-late-collision? oc-yang:counter64 + | | | +--ro oc-eth:in-mac-errors-rx? oc-yang:counter64 + | | | +--ro oc-eth:in-single-collision? oc-yang:counter64 + | | | +--ro oc-eth:in-symbol-error? oc-yang:counter64 + | | | +--ro oc-eth:in-maxsize-exceeded? oc-yang:counter64 + | | | +--ro oc-eth:out-mac-control-frames? oc-yang:counter64 + | | | +--ro oc-eth:out-mac-pause-frames? oc-yang:counter64 + | | | +--ro oc-eth:out-8021q-frames? oc-yang:counter64 + | | | +--ro oc-eth:out-mac-errors-tx? oc-yang:counter64 + | | +--ro oc-lag:aggregate-id? -> /oc-if:interfaces/interface/name + | +--rw oc-vlan:switched-vlan + | +--rw oc-vlan:config + | | +--rw oc-vlan:interface-mode? oc-vlan-types:vlan-mode-type + | | +--rw oc-vlan:native-vlan? oc-vlan-types:vlan-id + | | +--rw oc-vlan:access-vlan? oc-vlan-types:vlan-id + | | +--rw oc-vlan:trunk-vlans* union + | +--ro oc-vlan:state + | +--ro oc-vlan:interface-mode? oc-vlan-types:vlan-mode-type + | +--ro oc-vlan:native-vlan? oc-vlan-types:vlan-id + | +--ro oc-vlan:access-vlan? oc-vlan-types:vlan-id + | +--ro oc-vlan:trunk-vlans* union + +--rw oc-lag:aggregation + | +--rw oc-lag:config + | | +--rw oc-lag:lag-type? aggregation-type + | | +--rw oc-lag:min-links? uint16 + | +--ro oc-lag:state + | | +--ro oc-lag:lag-type? aggregation-type + | | +--ro oc-lag:min-links? uint16 + | | +--ro oc-lag:lag-speed? uint32 + | | +--ro oc-lag:member* oc-if:base-interface-ref + | +--rw oc-vlan:switched-vlan + | +--rw oc-vlan:config + | | +--rw oc-vlan:interface-mode? oc-vlan-types:vlan-mode-type + | | +--rw oc-vlan:native-vlan? oc-vlan-types:vlan-id + | | +--rw oc-vlan:access-vlan? oc-vlan-types:vlan-id + | | +--rw oc-vlan:trunk-vlans* union + | +--ro oc-vlan:state + | +--ro oc-vlan:interface-mode? oc-vlan-types:vlan-mode-type + | +--ro oc-vlan:native-vlan? oc-vlan-types:vlan-id + | +--ro oc-vlan:access-vlan? oc-vlan-types:vlan-id + | +--ro oc-vlan:trunk-vlans* union + +--rw oc-vlan:routed-vlan + +--rw oc-vlan:config + | +--rw oc-vlan:vlan? union + +--ro oc-vlan:state + | +--ro oc-vlan:vlan? union + +--rw oc-ip:ipv4 + | +--rw oc-ip:addresses + | | +--rw oc-ip:address* [ip] + | | +--rw oc-ip:ip -> ../config/ip + | | +--rw oc-ip:config + | | | +--rw oc-ip:ip? oc-inet:ipv4-address + | | | +--rw oc-ip:prefix-length? uint8 + | | | +--rw oc-ip:type? ipv4-address-type + | | +--ro oc-ip:state + | | | +--ro oc-ip:ip? oc-inet:ipv4-address + | | | +--ro oc-ip:prefix-length? uint8 + | | | +--ro oc-ip:type? ipv4-address-type + | | | +--ro oc-ip:origin? ip-address-origin + | | +--rw oc-ip:vrrp + | | +--rw oc-ip:vrrp-group* [virtual-router-id] + | | +--rw oc-ip:virtual-router-id -> ../config/virtual-router-id + | | +--rw oc-ip:config + | | | +--rw oc-ip:virtual-router-id? uint8 + | | | +--rw oc-ip:virtual-address* oc-inet:ip-address + | | | +--rw oc-ip:priority? uint8 + | | | +--rw oc-ip:preempt? boolean + | | | +--rw oc-ip:preempt-delay? uint16 + | | | +--rw oc-ip:accept-mode? boolean + | | | +--rw oc-ip:advertisement-interval? uint16 + | | +--ro oc-ip:state + | | | +--ro oc-ip:virtual-router-id? uint8 + | | | +--ro oc-ip:virtual-address* oc-inet:ip-address + | | | +--ro oc-ip:priority? uint8 + | | | +--ro oc-ip:preempt? boolean + | | | +--ro oc-ip:preempt-delay? uint16 + | | | +--ro oc-ip:accept-mode? boolean + | | | +--ro oc-ip:advertisement-interval? uint16 + | | | +--ro oc-ip:current-priority? uint8 + | | +--rw oc-ip:interface-tracking + | | +--rw oc-ip:config + | | | +--rw oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | | +--rw oc-ip:priority-decrement? uint8 + | | +--ro oc-ip:state + | | +--ro oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | +--ro oc-ip:priority-decrement? uint8 + | +--rw oc-ip:proxy-arp + | | +--rw oc-ip:config + | | | +--rw oc-ip:mode? enumeration + | | +--ro oc-ip:state + | | +--ro oc-ip:mode? enumeration + | +--rw oc-ip:neighbors + | | +--rw oc-ip:neighbor* [ip] + | | +--rw oc-ip:ip -> ../config/ip + | | +--rw oc-ip:config + | | | +--rw oc-ip:ip? oc-inet:ipv4-address + | | | +--rw oc-ip:link-layer-address oc-yang:phys-address + | | +--ro oc-ip:state + | | +--ro oc-ip:ip? oc-inet:ipv4-address + | | +--ro oc-ip:link-layer-address oc-yang:phys-address + | | +--ro oc-ip:origin? neighbor-origin + | +--rw oc-ip:unnumbered + | | +--rw oc-ip:config + | | | +--rw oc-ip:enabled? boolean + | | +--ro oc-ip:state + | | | +--ro oc-ip:enabled? boolean + | | +--rw oc-ip:interface-ref + | | +--rw oc-ip:config + | | | +--rw oc-ip:interface? -> /oc-if:interfaces/interface/name + | | | +--rw oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | | +--ro oc-ip:state + | | +--ro oc-ip:interface? -> /oc-if:interfaces/interface/name + | | +--ro oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | +--rw oc-ip:config + | | +--rw oc-ip:enabled? boolean + | | +--rw oc-ip:mtu? uint16 + | | +--rw oc-ip:dhcp-client? boolean + | +--ro oc-ip:state + | +--ro oc-ip:enabled? boolean + | +--ro oc-ip:mtu? uint16 + | +--ro oc-ip:dhcp-client? boolean + | +--ro oc-ip:counters + | +--ro oc-ip:in-pkts? oc-yang:counter64 + | +--ro oc-ip:in-octets? oc-yang:counter64 + | +--ro oc-ip:in-multicast-pkts? oc-yang:counter64 + | +--ro oc-ip:in-multicast-octets? oc-yang:counter64 + | +--ro oc-ip:in-error-pkts? oc-yang:counter64 + | +--ro oc-ip:in-forwarded-pkts? oc-yang:counter64 + | +--ro oc-ip:in-forwarded-octets? oc-yang:counter64 + | +--ro oc-ip:in-discarded-pkts? oc-yang:counter64 + | +--ro oc-ip:out-pkts? oc-yang:counter64 + | +--ro oc-ip:out-octets? oc-yang:counter64 + | +--ro oc-ip:out-multicast-pkts? oc-yang:counter64 + | +--ro oc-ip:out-multicast-octets? oc-yang:counter64 + | +--ro oc-ip:out-error-pkts? oc-yang:counter64 + | +--ro oc-ip:out-forwarded-pkts? oc-yang:counter64 + | +--ro oc-ip:out-forwarded-octets? oc-yang:counter64 + | +--ro oc-ip:out-discarded-pkts? oc-yang:counter64 + +--rw oc-ip:ipv6 + +--rw oc-ip:addresses + | +--rw oc-ip:address* [ip] + | +--rw oc-ip:ip -> ../config/ip + | +--rw oc-ip:config + | | +--rw oc-ip:ip? oc-inet:ipv6-address + | | +--rw oc-ip:prefix-length uint8 + | | +--rw oc-ip:type? oc-inet:ipv6-address-type + | +--ro oc-ip:state + | | +--ro oc-ip:ip? oc-inet:ipv6-address + | | +--ro oc-ip:prefix-length uint8 + | | +--ro oc-ip:type? oc-inet:ipv6-address-type + | | +--ro oc-ip:origin? ip-address-origin + | | +--ro oc-ip:status? enumeration + | +--rw oc-ip:vrrp + | +--rw oc-ip:vrrp-group* [virtual-router-id] + | +--rw oc-ip:virtual-router-id -> ../config/virtual-router-id + | +--rw oc-ip:config + | | +--rw oc-ip:virtual-router-id? uint8 + | | +--rw oc-ip:virtual-address* oc-inet:ip-address + | | +--rw oc-ip:priority? uint8 + | | +--rw oc-ip:preempt? boolean + | | +--rw oc-ip:preempt-delay? uint16 + | | +--rw oc-ip:accept-mode? boolean + | | +--rw oc-ip:advertisement-interval? uint16 + | | +--rw oc-ip:virtual-link-local? oc-inet:ip-address + | +--ro oc-ip:state + | | +--ro oc-ip:virtual-router-id? uint8 + | | +--ro oc-ip:virtual-address* oc-inet:ip-address + | | +--ro oc-ip:priority? uint8 + | | +--ro oc-ip:preempt? boolean + | | +--ro oc-ip:preempt-delay? uint16 + | | +--ro oc-ip:accept-mode? boolean + | | +--ro oc-ip:advertisement-interval? uint16 + | | +--ro oc-ip:current-priority? uint8 + | | +--ro oc-ip:virtual-link-local? oc-inet:ip-address + | +--rw oc-ip:interface-tracking + | +--rw oc-ip:config + | | +--rw oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | | +--rw oc-ip:priority-decrement? uint8 + | +--ro oc-ip:state + | +--ro oc-ip:track-interface* -> /oc-if:interfaces/interface/name + | +--ro oc-ip:priority-decrement? uint8 + +--rw oc-ip:router-advertisement + | +--rw oc-ip:config + | | +--rw oc-ip:enable? boolean + | | +--rw oc-ip:interval? uint32 + | | +--rw oc-ip:lifetime? uint32 + | | x--rw oc-ip:suppress? boolean + | | +--rw oc-ip:mode? enumeration + | | +--rw oc-ip:managed? boolean + | | +--rw oc-ip:other-config? boolean + | +--ro oc-ip:state + | | +--ro oc-ip:enable? boolean + | | +--ro oc-ip:interval? uint32 + | | +--ro oc-ip:lifetime? uint32 + | | x--ro oc-ip:suppress? boolean + | | +--ro oc-ip:mode? enumeration + | | +--ro oc-ip:managed? boolean + | | +--ro oc-ip:other-config? boolean + | +--rw oc-ip:prefixes + | +--rw oc-ip:prefix* [prefix] + | +--rw oc-ip:prefix -> ../config/prefix + | +--rw oc-ip:config + | | +--rw oc-ip:prefix? oc-inet:ipv6-prefix + | | +--rw oc-ip:valid-lifetime? uint32 + | | +--rw oc-ip:preferred-lifetime? uint32 + | | +--rw oc-ip:disable-advertisement? boolean + | | +--rw oc-ip:disable-autoconfiguration? boolean + | | +--rw oc-ip:enable-onlink? boolean + | +--ro oc-ip:state + | +--ro oc-ip:prefix? oc-inet:ipv6-prefix + | +--ro oc-ip:valid-lifetime? uint32 + | +--ro oc-ip:preferred-lifetime? uint32 + | +--ro oc-ip:disable-advertisement? boolean + | +--ro oc-ip:disable-autoconfiguration? boolean + | +--ro oc-ip:enable-onlink? boolean + +--rw oc-ip:neighbors + | +--rw oc-ip:neighbor* [ip] + | +--rw oc-ip:ip -> ../config/ip + | +--rw oc-ip:config + | | +--rw oc-ip:ip? oc-inet:ipv6-address + | | +--rw oc-ip:link-layer-address oc-yang:phys-address + | +--ro oc-ip:state + | +--ro oc-ip:ip? oc-inet:ipv6-address + | +--ro oc-ip:link-layer-address oc-yang:phys-address + | +--ro oc-ip:origin? neighbor-origin + | +--ro oc-ip:is-router? boolean + | +--ro oc-ip:neighbor-state? enumeration + +--rw oc-ip:unnumbered + | +--rw oc-ip:config + | | +--rw oc-ip:enabled? boolean + | +--ro oc-ip:state + | | +--ro oc-ip:enabled? boolean + | +--rw oc-ip:interface-ref + | +--rw oc-ip:config + | | +--rw oc-ip:interface? -> /oc-if:interfaces/interface/name + | | +--rw oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + | +--ro oc-ip:state + | +--ro oc-ip:interface? -> /oc-if:interfaces/interface/name + | +--ro oc-ip:subinterface? -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index + +--rw oc-ip:config + | +--rw oc-ip:enabled? boolean + | +--rw oc-ip:mtu? uint32 + | +--rw oc-ip:dup-addr-detect-transmits? uint32 + | +--rw oc-ip:dhcp-client? boolean + +--ro oc-ip:state + +--ro oc-ip:enabled? boolean + +--ro oc-ip:mtu? uint32 + +--ro oc-ip:dup-addr-detect-transmits? uint32 + +--ro oc-ip:dhcp-client? boolean + +--ro oc-ip:counters + +--ro oc-ip:in-pkts? oc-yang:counter64 + +--ro oc-ip:in-octets? oc-yang:counter64 + +--ro oc-ip:in-multicast-pkts? oc-yang:counter64 + +--ro oc-ip:in-multicast-octets? oc-yang:counter64 + +--ro oc-ip:in-error-pkts? oc-yang:counter64 + +--ro oc-ip:in-forwarded-pkts? oc-yang:counter64 + +--ro oc-ip:in-forwarded-octets? oc-yang:counter64 + +--ro oc-ip:in-discarded-pkts? oc-yang:counter64 + +--ro oc-ip:out-pkts? oc-yang:counter64 + +--ro oc-ip:out-octets? oc-yang:counter64 + +--ro oc-ip:out-multicast-pkts? oc-yang:counter64 + +--ro oc-ip:out-multicast-octets? oc-yang:counter64 + +--ro oc-ip:out-error-pkts? oc-yang:counter64 + +--ro oc-ip:out-forwarded-pkts? oc-yang:counter64 + +--ro oc-ip:out-forwarded-octets? oc-yang:counter64 + +--ro oc-ip:out-discarded-pkts? oc-yang:counter64 + diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang new file mode 100644 index 000000000..6b3977907 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang @@ -0,0 +1,935 @@ +module openconfig-acl { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/acl"; + + prefix "oc-acl"; + + import openconfig-packet-match { prefix oc-match; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state + data for network access control lists (i.e., filters, rules, + etc.). ACLs are organized into ACL sets, with each set + containing one or more ACL entries. ACL sets are identified + by a unique name, while each entry within a set is assigned + a sequence-id that determines the order in which the ACL + rules are applied to a packet. Note that ACLs are evaluated + in ascending order based on the sequence-id (low to high). + + Individual ACL rules specify match criteria based on fields in + the packet, along with an action that defines how matching + packets should be handled. Entries have a type that indicates + the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc."; + + oc-ext:openconfig-version "1.3.3"; + + revision "2023-02-06" { + description + "Add clarifying comments on use of interface-ref."; + reference "1.3.3"; + } + + revision "2023-01-29" { + description + "Update sequence-id reference to allow model to be re-used + outside of ACL context."; + reference "1.3.2"; + } + + revision "2022-12-20" { + description + "Remove unused openconfig-inet-types import"; + reference "1.3.1"; + } + + revision "2022-06-01" { + description + "Add the management of prefix lists + that can be used in matches"; + reference "1.3.0"; + } + + revision "2022-01-14" { + description + "Fix when statements for MIXED mode ACLs"; + reference "1.2.2"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace"; + reference "1.2.1"; + } + + revision "2021-03-17" { + description + "Add MPLS filter Support."; + reference "1.2.0"; + } + + revision "2019-11-27" { + description + "Fix xpaths in when statements."; + reference "1.1.1"; + } + + revision "2019-10-25" { + description + "Update when statements."; + reference "1.1.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "1.0.2"; + } + + revision "2018-04-24" { + description + "Clarified order of ACL evaluation"; + reference "1.0.1"; + } + + revision "2017-05-26" { + description + "Separated ACL entries by type"; + reference "1.0.0"; + } + + revision "2016-08-08" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + revision "2016-01-22" { + description + "Initial revision"; + reference "TBD"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + identity ACL_TYPE { + description + "Base identity for types of ACL sets"; + } + + identity ACL_IPV4 { + base ACL_TYPE; + description + "IP-layer ACLs with IPv4 addresses"; + } + + identity ACL_IPV6 { + base ACL_TYPE; + description + "IP-layer ACLs with IPv6 addresses"; + } + + identity ACL_L2 { + base ACL_TYPE; + description + "MAC-layer ACLs"; + } + + identity ACL_MIXED { + base ACL_TYPE; + description + "Mixed-mode ACL that specifies L2 and L3 protocol + fields. This ACL type is not implemented by many + routing/switching devices."; + } + + identity ACL_MPLS { + base ACL_TYPE; + description + "An ACL that matches on fields from the MPLS header."; + } + + // ACL action type + + identity FORWARDING_ACTION { + description + "Base identity for actions in the forwarding category"; + } + + identity ACCEPT { + base FORWARDING_ACTION; + description + "Accept the packet"; + } + + identity DROP { + base FORWARDING_ACTION; + description + "Drop packet without sending any ICMP error message"; + } + + identity REJECT { + base FORWARDING_ACTION; + description + "Drop the packet and send an ICMP error message to the source"; + } + + identity LOG_ACTION { + description + "Base identity for defining the destination for logging + actions"; + } + + identity LOG_SYSLOG { + base LOG_ACTION; + description + "Log the packet in Syslog"; + } + + identity LOG_NONE { + base LOG_ACTION; + description + "No logging"; + } + + identity ACL_COUNTER_CAPABILITY { + description + "Base identity for system to indicate how it is able to report + counters"; + } + + identity INTERFACE_ONLY { + base ACL_COUNTER_CAPABILITY; + description + "ACL counters are available and reported only per interface"; + } + + identity AGGREGATE_ONLY { + base ACL_COUNTER_CAPABILITY; + description + "ACL counters are aggregated over all interfaces, and reported + only per ACL entry"; + } + + identity INTERFACE_AGGREGATE { + base ACL_COUNTER_CAPABILITY; + description + "ACL counters are reported per interface, and also aggregated + and reported per ACL entry."; + } + + // grouping statements + + // input interface + grouping input-interface-config { + description + "Config of interface"; + + } + + grouping input-interface-state { + description + "State information of interface"; + } + + grouping input-interface-top { + description + "Input interface top level container"; + + container input-interface { + description + "Input interface container. The interface is resolved based + on the interface and subinterface leaves of the interface-ref + container, which are references to entries in the /interfaces + list."; + + container config { + description + "Config data"; + uses input-interface-config; + } + + container state { + config false; + description + "State information"; + uses input-interface-config; + uses input-interface-state; + } + + uses oc-if:interface-ref; + + } + } + + // Action Type + grouping action-config { + description + "Config of action type"; + + + leaf forwarding-action { + type identityref { + base FORWARDING_ACTION; + } + mandatory true; + description + "Specifies the forwarding action. One forwarding action + must be specified for each ACL entry"; + } + + leaf log-action { + type identityref { + base LOG_ACTION; + } + default LOG_NONE; + description + "Specifies the log action and destination for + matched packets. The default is not to log the + packet."; + } + + + } + + grouping action-state { + description + "State information of action type"; + + } + + grouping action-top { + description + "ACL action type top level container"; + + container actions { + description + "Enclosing container for list of ACL actions associated + with an entry"; + + container config { + description + "Config data for ACL actions"; + uses action-config; + } + + container state { + config false; + description + "State information for ACL actions"; + uses action-config; + uses action-state; + } + } + } + + grouping acl-counters-state { + description + "Common grouping for ACL counters"; + + leaf matched-packets { + type oc-yang:counter64; + description + "Count of the number of packets matching the current ACL + entry. + + An implementation should provide this counter on a + per-interface per-ACL-entry if possible. + + If an implementation only supports ACL counters per entry + (i.e., not broken out per interface), then the value + should be equal to the aggregate count across all interfaces. + + An implementation that provides counters per entry per + interface is not required to also provide an aggregate count, + e.g., per entry -- the user is expected to be able implement + the required aggregation if such a count is needed."; + } + + leaf matched-octets { + type oc-yang:counter64; + description + "Count of the number of octets (bytes) matching the current + ACL entry. + + An implementation should provide this counter on a + per-interface per-ACL-entry if possible. + + If an implementation only supports ACL counters per entry + (i.e., not broken out per interface), then the value + should be equal to the aggregate count across all interfaces. + + An implementation that provides counters per entry per + interface is not required to also provide an aggregate count, + e.g., per entry -- the user is expected to be able implement + the required aggregation if such a count is needed."; + } + + } + + // Access List Entries + + grouping access-list-entries-config { + description + "Access List Entries (ACE) config."; + + leaf sequence-id { + type uint32; + description + "The sequence id determines the order in which ACL entries + are applied. The sequence id must be unique for each entry + in an ACL set. Target devices should apply the ACL entry + rules in ascending order determined by sequence id (low to + high), rather than the relying only on order in the list."; + } + + leaf description { + type string; + description + "A user-defined description, or comment, for this Access List + Entry."; + } + + } + + grouping access-list-entries-state { + description + "Access List Entries state."; + + uses acl-counters-state; + + } + + grouping access-list-entries-top { + description + "Access list entries to level container"; + + container acl-entries { + description + "Access list entries container"; + + list acl-entry { + key "sequence-id"; + description + "List of ACL entries comprising an ACL set"; + + leaf sequence-id { + type leafref { + path "../config/sequence-id"; + } + description + "references the list key"; + } + + container config { + description + "Access list entries config"; + uses access-list-entries-config; + } + + container state { + config false; + description + "State information for ACL entries"; + uses access-list-entries-config; + uses access-list-entries-state; + } + + uses oc-match:ethernet-header-top { + when "../../config/type='ACL_L2' or " + + "../../config/type='ACL_MIXED'" { + description + "MAC-layer fields are valid when the ACL type is L2 or + MIXED"; + } + } + + uses oc-match:ipv4-protocol-fields-top { + when "../../config/type='ACL_IPV4' or " + + "../../config/type='ACL_MIXED'" { + description + "IPv4-layer fields are valid when the ACL type is + IPv4 or MIXED"; + } + } + + uses oc-match:mpls-header-top { + when "../../config/type='ACL_MPLS' or " + + "../../config/type='ACL_MIXED'" { + description + "MPLS-layer fields are valid when the ACL type is + MPLS or MIXED"; + } + } + + uses oc-match:ipv6-protocol-fields-top { + when "../../config/type='ACL_IPV6' or " + + "../../config/type='ACL_MIXED'" { + description + "IPv6-layer fields are valid when the ACL type is + IPv6 or MIXED"; + } + } + + uses oc-match:transport-fields-top { + when "../../config/type='ACL_IPV6' or " + + "../../config/type='ACL_IPV4' or " + + "../../config/type='ACL_MIXED'" { + description + "Transport-layer fields are valid when specifying + L3 or MIXED ACL types"; + } + } + + uses input-interface-top; + uses action-top; + } + } + } + + grouping acl-set-config { + description + "Access Control List config"; + + leaf name { + type string; + description + "The name of the access-list set"; + } + + leaf type { + type identityref { + base ACL_TYPE; + } + description + "The type determines the fields allowed in the ACL entries + belonging to the ACL set (e.g., IPv4, IPv6, etc.)"; + } + + leaf description { + type string; + description + "Description, or comment, for the ACL set"; + } + + } + + grouping acl-set-state { + description + "Access Control List state"; + } + + grouping acl-set-top { + description + "Access list entries variables top level container"; + + container acl-sets { + description + "Access list entries variables enclosing container"; + + list acl-set { + key "name type"; + description + "List of ACL sets, each comprising of a list of ACL + entries"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the name list key"; + } + + leaf type { + type leafref { + path "../config/type"; + } + description + "Reference to the type list key"; + } + + container config { + description + "Access list config"; + uses acl-set-config; + } + + container state { + config false; + description + "Access list state information"; + uses acl-set-config; + uses acl-set-state; + } + uses access-list-entries-top; + } + } + } + + grouping interface-acl-entries-config { + description + "Configuration data for per-interface ACLs"; + + } + + grouping interface-acl-entries-state { + description + "Operational state data for per-interface ACL entries"; + + leaf sequence-id { + type leafref { + path "/oc-acl:acl/oc-acl:acl-sets/" + + "oc-acl:acl-set[oc-acl:name=current()/../../../../set-name]" + + "[oc-acl:type=current()/../../../../type]/" + + "oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:sequence-id"; + } + description + "Reference to an entry in the ACL set applied to an + interface"; + } + + uses acl-counters-state; + + } + + grouping interface-acl-entries-top { + description + "Top-level grouping for per-interface ACL entries"; + + container acl-entries { + config false; + description + "Enclosing container for list of references to ACLs"; + + list acl-entry { + key "sequence-id"; + description + "List of ACL entries assigned to an interface"; + + leaf sequence-id { + type leafref { + path "../state/sequence-id"; + } + description + "Reference to per-interface acl entry key"; + } + + // no config container since the enclosing container is + // read-only + + container state { + + config false; + + description + "Operational state data for per-interface ACL entries"; + + uses interface-acl-entries-config; + uses interface-acl-entries-state; + } + } + } + } + + grouping interface-ingress-acl-config { + description + "Configuration data for per-interface ingress ACLs"; + + leaf set-name { + type leafref { + path "../../../../../../acl-sets/acl-set/config/name"; + } + description + "Reference to the ACL set name applied on ingress"; + } + + leaf type { + type leafref { + path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" + + "/config/type"; + } + description + "Reference to the ACL set type applied on ingress"; + } + } + + grouping interface-ingress-acl-state { + description + "Operational state data for the per-interface ingress ACL"; + } + + grouping interface-ingress-acl-top { + description + "Top-level grouping for per-interface ingress ACL data"; + + container ingress-acl-sets { + description + "Enclosing container the list of ingress ACLs on the + interface"; + + list ingress-acl-set { + key "set-name type"; + description + "List of ingress ACLs on the interface"; + + leaf set-name { + type leafref { + path "../config/set-name"; + } + description + "Reference to set name list key"; + } + + leaf type { + type leafref { + path "../config/type"; + } + description + "Reference to type list key"; + } + + container config { + description + "Configuration data "; + + uses interface-ingress-acl-config; + } + + container state { + + config false; + + description + "Operational state data for interface ingress ACLs"; + + uses interface-ingress-acl-config; + uses interface-ingress-acl-state; + } + + uses interface-acl-entries-top; + } + } + } + + grouping interface-egress-acl-config { + description + "Configuration data for per-interface egress ACLs"; + + leaf set-name { + type leafref { + path "../../../../../../acl-sets/acl-set/config/name"; + } + description + "Reference to the ACL set name applied on egress"; + } + + leaf type { + type leafref { + path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" + + "/config/type"; + } + description + "Reference to the ACL set type applied on egress."; + } + } + + grouping interface-egress-acl-state { + description + "Operational state data for the per-interface egress ACL"; + } + + grouping interface-egress-acl-top { + description + "Top-level grouping for per-interface egress ACL data"; + + container egress-acl-sets { + description + "Enclosing container the list of egress ACLs on the + interface"; + + list egress-acl-set { + key "set-name type"; + description + "List of egress ACLs on the interface"; + + leaf set-name { + type leafref { + path "../config/set-name"; + } + description + "Reference to set name list key"; + } + + leaf type { + type leafref { + path "../config/type"; + } + description + "Reference to type list key"; + } + + container config { + description + "Configuration data "; + + uses interface-egress-acl-config; + } + + container state { + + config false; + + description + "Operational state data for interface egress ACLs"; + + uses interface-egress-acl-config; + uses interface-egress-acl-state; + } + + uses interface-acl-entries-top; + } + } + } + + grouping acl-interfaces-config { + description + "Configuration data for interface references"; + + leaf id { + type oc-if:interface-id; + description + "User-defined identifier for the interface -- a common + convention could be '.'"; + } + } + + grouping acl-interfaces-state { + description + "Operational state data for interface references"; + } + + grouping acl-interfaces-top { + description + "Top-level grouping for interface-specific ACL data"; + + container interfaces { + description + "Enclosing container for the list of interfaces on which + ACLs are set"; + + list interface { + key "id"; + description + "List of interfaces on which ACLs are set. The interface is resolved + based on the interface and subinterface leaves of the interface-ref + container, which are references to entries in the /interfaces + list. The key of the list is an arbitrary value that the + implementation should not use to resolve an interface name."; + + leaf id { + type leafref { + path "../config/id"; + } + description + "Reference to the interface id list key"; + } + + container config { + description + "Configuration for ACL per-interface data"; + + uses acl-interfaces-config; + } + + container state { + + config false; + + description + "Operational state for ACL per-interface data"; + + uses acl-interfaces-config; + uses acl-interfaces-state; + } + + uses oc-if:interface-ref; + uses interface-ingress-acl-top; + uses interface-egress-acl-top; + } + } + } + + + grouping acl-config { + description + "Global configuration data for ACLs"; + } + + grouping acl-state { + description + "Global operational state data for ACLs"; + + leaf counter-capability { + type identityref { + base ACL_COUNTER_CAPABILITY; + } + description + "System reported indication of how ACL counters are reported + by the target"; + } + } + grouping acl-top { + description + "Top level grouping for ACL data and structure"; + + container acl { + description + "Top level enclosing container for ACL model config + and operational state data"; + + container config { + description + "Global config data for ACLs"; + + uses acl-config; + } + + container state { + + config false; + + description + "Global operational state data for ACLs"; + + uses acl-config; + uses acl-state; + } + + uses acl-set-top; + uses acl-interfaces-top; + } + } + + // data definition statements + uses acl-top; + + // augment statements + + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang new file mode 100644 index 000000000..486f3e157 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang @@ -0,0 +1,540 @@ +module openconfig-icmpv4-types { + + yang-version "1"; + namespace "http://openconfig.net/yang/openconfig-icmpv4-types"; + + prefix "oc-icmpv4-types"; + + import openconfig-extensions { prefix oc-ext; } + + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "OpenConfig module defining the types and coresponding codes for + ICMPv4."; + + oc-ext:openconfig-version "0.1.0"; + + revision "2023-01-26" { + description + "Initial revision of ICMPv4 types module."; + reference "0.1.0"; + } + + identity TYPE { + description + "Base identity for ICMPv4 codes"; + } + + identity CODE { + description + "Base identity for ICMPv4 codes."; + } + + identity ECHO_REPLY { + description + "ICMP echo reply, value 0."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE { + description + "ICMP destination unreachable, value 3."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity REDIRECT { + description + "ICMP redirect, value 5."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity ECHO { + description + "ICMP echo, value 8."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity ROUTER_ADVERTISEMENT { + description + "ICMP router advertisement, value 9."; + base TYPE; + reference "RFC1256: ICMP Router Discovery Messages"; + } + + identity ROUTER_SOLICITATION { + description + "ICMP Router Solicitation, value 10."; + base TYPE; + reference "RFC1256: ICMP Router Discovery Messages"; + } + + identity TIME_EXCEEDED { + description + "ICMP TTL exceede, value 11."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity PARAM_PROBLEM { + description + "ICMP parameter problem, value 12."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity TIMESTAMP { + description + "ICMP timestamp, value 13."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity TIMESTAMP_REPLY { + description + "ICMP timestamp reply, value 14."; + base TYPE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + identity TRACEROUTE{ + description + "Traceroute (deprecated), value 30."; + base TYPE; + reference "RFC1393: Traceroute Using an IP Option"; + } + identity PHOTURIS { + description + "ICMP Photuris, value 40."; + base TYPE; + reference "RFC2521: CMP Security Failures Messages"; + } + + identity EXT_ECHO_REQUEST { + description + "ICMP extended echo request, value 42."; + base TYPE; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY { + description + "ICMP extended echo reply, value 43."; + base TYPE; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity ECHO_REPLY_CODE { + description + "CODE for ICMPv4 Echo Reply."; + base CODE; + } + + identity ECHO_REPLY_NONE { + description + "No code, type 0 for Echo Reply."; + base ECHO_REPLY_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_CODE { + description + "Codes for ICMPv4 Destination Unreachable."; + base CODE; + } + + identity DST_UNREACHABLE_NET { + description + "ICMPv4 destination network unreachable, code 0."; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_HOST { + description + "ICMPv4 destination host unreachable, code 1"; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_PROTOCOL { + description + "ICMPv4 destination protocol unreachable, code 2."; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_PORT { + description + "ICMPv4 Port unreachable, code 3."; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_CANNOT_FRAGMENT { + description + "ICMPv4 destination unreachable due to inability to fragment. The df-bit + is set but the packet requires fragmentation, code 4."; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_SRC_ROUTE_FAILED { + description + "ICMPv4 destination is unreachable as source routing failed, code 5."; + base DST_UNREACHABLE_CODE; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity DST_UNREACHABLE_DST_NET_UNKNOWN { + description + "ICMPv4 destination is unreachable as the destination network is + unknown, code 6."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_DST_HOST_UNKNOWN { + description + "ICMPv4 destination is unreachable as the destination host is unknown, code 7."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_SRC_HOST_ISOLATED { + description + "ICMPv4 destination unreachable as the source host is isolated, code 8."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_DST_NET_ADMIN_PROHIBITED { + description + "ICMPv4 destination is unreachable as communication with the destination + network is administratively prohibited, code 9."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_DST_HOST_ADMIN_PROHIBITED { + description + "ICMPv4 destination is unreachable as communication with the destination + host is adminstratively prohibited, code 10."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_NET_UNREACHABLE_FOR_TOS { + description + "ICMPv4 destination network is unreachable for the specified type of + service, code 11."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_HOST_UNREACHABLE_FOR_TOS { + description + "ICMPv4 destination host is unreachable for the specified type of + service, code 12."; + base DST_UNREACHABLE_CODE; + reference "RFC1122: Requirements for Internet Hosts -- + Communication Layers"; + } + + identity DST_UNREACHABLE_ADMIN_PROHIBITED { + description + "ICMPv4 destination is unreacable as packets were adminstratively + filtered."; + base DST_UNREACHABLE_CODE; + reference "RFC1812: Requirements for IP Version 4 Routers"; + } + + identity DST_UNREACHABLE_HOST_PRECEDENCE_VIOLATION { + description + "ICMPv4 destination is unreachable as the first-hop router has determined + that the destination cannot be reached for the specified source/ + destination host, network, upper-layer protocol and source/destination + port. Code 14"; + base DST_UNREACHABLE_CODE; + } + + identity DST_UNREACHABLE_PRECEDENCE_CUTOFF { + description + "ICMPv4 Precedence cutoff in effect. The network operators have imposed + a minimum level of precedence required for operation, the + datagram was sent with a precedence below this level. + Code 15."; + base DST_UNREACHABLE_CODE; + reference "RFC1812: Requirements for IP Version 4 Routers"; + } + + identity REDIRECT_CODE { + base CODE; + description + "Codes for the ICMPv4 Redirect type."; + } + + identity REDIRECT_NETWORK { + base REDIRECT_CODE; + description + "ICMP redirect is being issued for the network or subnet, + code 0"; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity REDIRECT_HOST { + base REDIRECT_CODE; + description + "ICMP redirect is being issued for the host, code 1."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity REDIRECT_TOS_NETWORK { + base REDIRECT_CODE; + description + "ICMP redirect is being issued for the network and type of service. code 2."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity REDIRECT_TOS_HOST { + base REDIRECT_CODE; + description + "ICMP redirect is being issued for the host and type of service, + code 3"; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity ECHO_CODE { + base CODE; + description + "Codes for ICMPv4 echo messages."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity ECHO_NO_CODE { + base ECHO_CODE; + description + "No code."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity ROUTER_ADVERTISEMENT_CODE { + base CODE; + description + "Code for the ICMPv4 router advertisement message."; + } + identity ROUTER_ADVERTISEMENT_NORMAL { + base ROUTER_ADVERTISEMENT_CODE; + description + "Code 0: Normal router advertisement."; + reference "RFC3344: IP Mobility Support for IPv4"; + } + + identity ROUTER_ADVERTISEMENT_DOES_NOT_ROUTE_COMMON { + base ROUTER_ADVERTISEMENT_CODE; + description + "Code 16: Does not route common traffic."; + reference "RFC3344: IP Mobility Support for IPv4"; + } + + identity ROUTER_SELECTION_CODE { + base CODE; + description + "Codes for the ICMPv4 router selection message."; + } + + identity ROUTER_SELECTION_NO_CODE { + base ROUTER_SELECTION_CODE; + description + "No code."; + reference "RFC1256: ICMP Router Discovery Messages"; + } + + identity TIME_EXCEEDED_CODE { + base CODE; + description + "Codes for the ICMPv4 time exceeded code."; + } + + identity TIME_EXCEEDED_IN_TRANSIT { + base TIME_EXCEEDED_CODE; + description + "Code 0: Time to Live exceeded in Transit."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity TIME_EXCEEDED_FRAGMENT_REASSEMBLY_IN_TRANSIT { + base TIME_EXCEEDED_CODE; + description + "Code 1: Fragment reassembly time exceeded."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity PARAM_PROBLEM_CODE { + base CODE; + description + "Codes for the ICMPv4 parameter problem message (Type 12)."; + } + + identity PARAM_PROBLEM_POINTER_INDICATES_ERR { + base PARAM_PROBLEM_CODE; + description + "Code 0: Pointer indicates the error."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity PARAM_PROBLEM_MISSING_REQ_OPTION { + base PARAM_PROBLEM_CODE; + description + "Code 1: Missing a required option."; + reference "RFC1108: U.S. Department of Defense + Security Options for the Internet Protocol"; + } + + identity PARAM_PROBLEM_BAD_LENGTH { + base PARAM_PROBLEM_CODE; + description + "Code 2: Bad Length."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity TIMESTAMP_CODE { + base CODE; + description + "Codes of the ICMPv4 timestamp message (Type 13)."; + } + identity TIMESTAMP_NO_CODE { + base TIMESTAMP_CODE; + description + "No code."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity TIMESTAMP_REPLY_CODE { + base CODE; + description + "Codes of the ICMPv4 timestamp reply message (Type 14)."; + } + + identity TIMESTAMP_REPLY_NO_CODE { + base TIMESTAMP_REPLY_CODE; + description + "No code."; + reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL"; + } + + identity PHOTURIS_CODE { + base CODE; + description + "Codes of the ICMPv4 Photuris message (type 40)."; + } + + identity PHOTURIS_BAD_SPI { + base PHOTURIS_CODE; + description + "Code 0: Bad SPI."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity PHOTURIS_AUTH_FAILED { + base PHOTURIS_CODE; + description + "Code 1: Authentication failed."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity PHOTURIS_DECOMPRESS_FAILED { + base PHOTURIS_CODE; + description + "Code 2: Decompression failed."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity PHOTURIS_DECRYPTION_FAILED { + base PHOTURIS_CODE; + description + "Code 3: Decryption failed."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity PHOTURIS_NEED_AUTHENTICATION { + base PHOTURIS_CODE; + description + "Code 4: Need authentication."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity PHOTURIS_NEED_AUTHORIZATION { + base PHOTURIS_CODE; + description + "Code 5: Need authorization."; + reference "RFC2521: ICMP Security Failures Messages"; + } + + identity EXT_ECHO_REQUEST_CODE { + description + "Codes of the extended echo request ICMP message."; + base CODE; + } + + identity EXT_ECHO_REQUEST_NO_ERROR { + base EXT_ECHO_REQUEST_CODE; + description + "Code 0: No error."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_CODE { + description + "Codes of the extended echo reply ICMP message (Type 43)."; + base CODE; + } + + identity EXT_ECHO_REPLY_NO_ERROR { + base EXT_ECHO_REPLY_CODE; + description + "Code 0: No error."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_MALFORMED_QUERY { + base EXT_ECHO_REPLY_CODE; + description + "Code 1: Malformed query."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_NO_SUCH_INTF { + base EXT_ECHO_REPLY_CODE; + description + "Code 2: No such interface."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_NO_SUB_TABLE_ENTRY { + base EXT_ECHO_REPLY_CODE; + description + "Code 3: No such table entry."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_MULTIPLE_INTF_SATISFY_QUERY { + base EXT_ECHO_REPLY_CODE; + description + "Code 4: Multiple interfaces satisfy query."; + reference "RFC8335: PROBE: A Utility for Probing Interfaces"; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang new file mode 100644 index 000000000..ecd77cabf --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang @@ -0,0 +1,1010 @@ +module openconfig-icmpv6-types { + + yang-version "1"; + namespace "http://openconfig.net/yang/openconfig-icmpv6-types"; + + prefix "oc-icmpv6-types"; + + import openconfig-extensions { prefix oc-ext; } + + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "OpenConfig module defining the types and coresponding subcodes for + ICMPv6."; + + oc-ext:openconfig-version "0.1.1"; + + revision "2023-05-02" { + description + "Fix module prefix."; + reference "0.1.1"; + } + + revision "2023-01-26" { + description + "Initial revision of ICMPv6 types module."; + reference "0.1.0"; + } + + identity TYPE { + description + "Base identity for ICMPv6 codes"; + } + + identity CODE { + description + "Base identity for ICMPv6 subcodes."; + } + + identity DESTINATION_UNREACHABLE { + base TYPE; + description + "Type 1: Destination unreachable."; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PACKET_TOO_BIG { + base TYPE; + description + "Type 2: Packet too big."; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity TIME_EXCEEDED { + base TYPE; + description + "Type 3: Time exceeded."; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PARAMETER_PROBLEM { + base TYPE; + description + "Type 4: Parameter problem."; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity ECHO_REQUEST { + base TYPE; + description + "Type 128: Echo request."; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity ECHO_REPLY { + base TYPE; + description + "Type 129: Echo reply"; + reference + "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity MULTICAST_LISTENER_QUERY { + base TYPE; + description + "Type 130: Multicast listener query"; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity MULTICAST_LISTENER_REPORT { + base TYPE; + description + "Type 131: Multicast listener report"; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity MULTICAST_LISTENER_DONE { + base TYPE; + description + "Type 132: Multicast listener done"; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity ROUTER_SOLICITATION { + base TYPE; + description + "Type 133: IPv6 router soliciation."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity ROUTER_ADVERTISEMENT { + base TYPE; + description + "Type 134: IPv6 router advertisement."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity NEIGHBOR_SOLICITATION { + base TYPE; + description + "Type 135: IPv6 neighbor solicitation."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity NEIGHBOR_ADVERTISEMENT { + base TYPE; + description + "Type 136: IPv6 neighbor advertisement."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity REDIRECT { + base TYPE; + description + "Type 137: IPv6 ICMP redirect message."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity RENUNBERING { + base TYPE; + description + "Type 138: Router renumbering."; + reference + "RFC2894: Router Renumbering for IPv6"; + } + + identity NODE_INFORMATION_QUERY { + base TYPE; + description + "Type 139: ICMP Node Information Query."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + identity NODE_INFORMATION_RESPONSE { + base TYPE; + description + "Type 140: ICMP Node Information Response."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity INVERSE_NEIGHBOR_SOLICITATION { + base TYPE; + description + "Type 141: Inverse Neighbor Discovery Solicitation Message."; + reference "RFC3122: Extensions to IPv6 Neighbor Discovery for + Inverse Discovery Specification"; + } + + identity INVERSE_NEIGHBOR_ADVERTISEMENT { + base TYPE; + description + "Type 142: Inverse Neighbor Discovery Advertisement Message."; + reference "RFC3122: Extensions to IPv6 Neighbor Discovery for + Inverse Discovery Specification"; + } + + identity VERSION2_MULTICAST_LISTENER { + base TYPE; + description + "Type 143: Version 2 Multicast Listener Report"; + reference + "RFC3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6"; + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST { + base TYPE; + description + "Type 144: Home Agent Address Discovery Request Message."; + reference "RFC6275: Mobility Support in IPv6"; + + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY { + base TYPE; + description + "Type 145: Home Agent Address Discovery Reply Message."; + reference "RFC6275: Mobility Support in IPv6"; + + } + + identity MOBILE_PREFIX_SOLICITATION { + base TYPE; + description + "Type 147: Mobile Prefix Solicitation."; + reference "RFC6275: Mobility Support in IPv6"; + } + + identity MOBILE_PREFIX_ADVERTISEMENT { + base TYPE; + description + "Type 147: Mobile Prefix Advertisement."; + reference "RFC6275: Mobility Support in IPv6"; + } + + identity CERTIFICATION_PATH_SOLICITATION { + base TYPE; + description + "Type 148: Certification Path Soliciation Message."; + reference "RFC3971: SEcure Neighbor Discovery (SEND)"; + } + + identity CERTIFICATION_PATH_ADVERTISEMENT { + base TYPE; + description + "Type 149: Certification Path Advertisement Message."; + reference "RFC3971: SEcure Neighbor Discovery (SEND)"; + } + + identity MULTICAST_ROUTER_ADVERTISEMENT { + base TYPE; + description + "Type 151: Multicast Router Advertisement."; + reference "RFC4286: Multicast Router Discovery"; + } + + identity MULTICAST_ROUTER_SOLICITATION { + base TYPE; + description + "Type 152: Multicast Router Solicitation."; + reference "RFC4286: Multicast Router Discovery"; + } + + identity MULTICAST_ROUTER_TERMINATION { + base TYPE; + description + "Type 153: Multicast Router Termination."; + reference "RFC4286: Multicast Router Discovery"; + } + + identity FMIPV6 { + base TYPE; + description + "Type 154: Fast handover mode for IPv6."; + reference + "RFC5568: Mobile IPv6 Fast Handovers"; + } + + identity RPL_CONTROL { + base TYPE; + description + "Type 155: RPL Control Message."; + reference + "RFC6550: RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks"; + } + + identity ILNPV6_LOCATOR_UPDATE { + base TYPE; + description + "Type 156: ILNPv6 Locator Update Message."; + reference + "RFC6743: ICMP Locator Update Message for + the Identifier-Locator Network Protocol for IPv6 (ILNPv6)"; + } + + identity DUPLICATE_ADDRESS_REQUEST { + base TYPE; + description + "Type 157: Duplicate address request."; + reference + "RFC6775: Neighbor Discovery Optimization for IPv6 over Low-Power Wireless + Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_CONFIRMATION { + base TYPE; + description + "Type 158: Duplicate address confirmation."; + reference + "RFC6775: Neighbor Discovery Optimization for IPv6 over Low-Power Wireless + Personal Area Networks (6LoWPANs)"; + } + + identity MPL_CONTROL { + base TYPE; + description + "Type 159: MPL Control Message."; + reference + "RFC7731: Multicast Protocol for Low-Power and Lossy Networks (MPL)"; + } + + identity EXT_ECHO_REQUEST { + base TYPE; + description + "Type 160: Extended echo request."; + reference + "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY { + base TYPE; + description + "Type 161: Extended echo reply."; + reference + "RFC8335: PROBE: A Utility for Probing Interfaces"; + } + + identity DST_UNREACHABLE_CODE { + base CODE; + description + "ICMPv6 destination unreachable subcodes."; + } + identity DST_UNREACHABLE_NO_ROUTE_TO_DST { + base DST_UNREACHABLE_CODE; + description + "Code 0: No route to destination."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + identity DST_UNREACHABLE_DST_ADMIN_PROHIBITED { + base DST_UNREACHABLE_CODE; + description + "Code 1: Communication with destination adminstratively prohibited."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_BEYOND_SCOPE_OF_SRC { + base DST_UNREACHABLE_CODE; + description + "Code 2: Beyond scope of source address."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_ADDR { + base DST_UNREACHABLE_CODE; + description + "Code 3: Address unreachable."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_PORT { + base DST_UNREACHABLE_CODE; + description + "Code 4: Port unreachable."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_SRC_ADDR_FAILED_POLICY { + base DST_UNREACHABLE_CODE; + description + "Code 5: Source address failed ingress/egress policy."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_REJECT_ROUTE_TO_DST { + base DST_UNREACHABLE_CODE; + description + "Code 6: Reject route to destination."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity DST_UNREACHABLE_ERR_IN_SRC_ROUTING_HDR { + base DST_UNREACHABLE_CODE; + description + "Code 7: Error in Source Routing Header."; + reference "RFC8554: An IPv6 Routing Header for Source Routes with + the Routing Protocol for Low-Power and Lossy Networks (RPL)"; + } + + identity DST_UNREACHABLE_HDRS_TOO_LONG { + base DST_UNREACHABLE_CODE; + description + "Type 8: Headers too long"; + reference "RFC8883: ICMPv6 Errors for Discarding Packets Due to + Processing Limits"; + } + + identity PACKET_TOO_BIG_CODE { + base CODE; + description + "Subcodes for the ICMPv6 Packet Too Big type."; + } + + identity PACKET_TOO_BIG_NO_CODE { + base PACKET_TOO_BIG_CODE; + description + "No code, value 0."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity TIME_EXCEEDED_CODE { + base CODE; + description + "Subcodes for the Time Exceeded ICMPv6 type."; + } + + identity TIME_EXCEEDED_HOP_LIMIT { + base TIME_EXCEEDED_CODE; + description + "Code 0: Hop limit exceeded in transit."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + identity TIME_EXCEEDED_FRAGMENT_REASSEMBLY { + base TIME_EXCEEDED_CODE; + description + "Code 1: Fragment reassembly time exceeded."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PARAM_PROBLEM_CODE { + base CODE; + description + "Subcodes for the Parameter Problem ICMPv6 type."; + } + + identity PARAM_PROBLEM_ERR_HDR_FIELD { + base PARAM_PROBLEM_CODE; + description + "Erroneous header field encountered."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PARAM_PROBLEM_UNRECOGNIZED_NET_HDR_TYPE { + base PARAM_PROBLEM_CODE; + description + "Unrecognized Next Header type encountered."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PARAM_PROBLEM_UNRECOGNIZED_IPV6_OPT { + base PARAM_PROBLEM_CODE; + description + "Unrecognized IPv6 option encountered."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity PARAM_PROBLEM_INCOMPLETE_HDR_CHAIN { + base PARAM_PROBLEM_CODE; + description + "IPv6 First Fragment has incomplete IPv6 Header Chain."; + reference + "RFC7112: Implications of Oversized IPv6 Header Chains"; + } + + identity PARAM_PROBLEM_SR_UPPER_HDR_ERR { + base PARAM_PROBLEM_CODE; + description + "SR Upper-layer Header Error"; + reference + "RFC8754: IPv6 Segment Routing Header (SRH)"; + } + + identity PARAM_PROBLEM_UNRECOGNIZED_NEXT_HDR_TYPE { + base PARAM_PROBLEM_CODE; + description + "Unrecognized Next Header type encountered by intermediate node"; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity PARAM_PROBLEM_EXT_HDR_TOO_BIG { + base PARAM_PROBLEM_CODE; + description + "Extension header too big."; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity PARAM_PROBLEM_EXT_HDR_CHAIN_TOO_LONG { + base PARAM_PROBLEM_CODE; + description + "Extension header chain too long."; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity PARAM_PROBLEM_TOO_MANY_EXT_HDRS { + base PARAM_PROBLEM_CODE; + description + "Too many extension headers."; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity PARAM_PROBLEM_TOO_MANY_OPTS { + base PARAM_PROBLEM_CODE; + description + "Too many options in extension header."; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity PARAM_PROBLEM_OPT_TOO_BIG { + base PARAM_PROBLEM_CODE; + description + "Option too big."; + reference + "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits"; + } + + identity ECHO_REQUEST_CODE { + base CODE; + description + "Subcodes for the ICMPv6 echo request type."; + } + + identity ECHO_REQUEST_NO_CODE { + base ECHO_REQUEST_CODE; + description + "No code."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity ECHO_REPLY_CODE { + base CODE; + description + "Subcodes for the ICMPv6 echo reply subcode."; + } + + identity ECHO_REPLY_NO_CODE { + base ECHO_REPLY_CODE; + description + "No code."; + reference "RFC4443: Internet Control Message Protocol (ICMPv6) + for the Internet Protocol Version 6 (IPv6) Specification"; + } + + identity MULTICAST_LISTENER_QUERY_CODE { + base CODE; + description + "Subcodes for the multicast listener query ICMPv6 type."; + } + + identity MULTICAST_LISTENER_QUERY_NO_CODE { + base MULTICAST_LISTENER_QUERY_CODE; + description + "No code."; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity MULTICAST_LISTENER_REPORT_CODE { + base CODE; + description + "Subcodes for the multicast listener report ICMPv6 type."; + } + + identity MULTICAST_LISTENER_REPORT_NO_CODE { + base MULTICAST_LISTENER_REPORT_CODE; + description + "No code."; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity MULTICAST_LISTENER_DONE_CODE { + base CODE; + description + "Subcodes for the multicast listener done ICMPv6 type."; + } + + identity MULTICAST_LISTENER_DONE_NO_CODE { + base MULTICAST_LISTENER_DONE_CODE; + description + "No code."; + reference + "RFC2710: Multicast Listener Discovery (MLD) for IPv6"; + } + + identity ROUTER_SOLICITATION_CODE { + base CODE; + description + "Subcodes for the router solicitation ICMPv6 type."; + } + identity ROUTER_SOLICITATION_NO_CODE { + base ROUTER_SOLICITATION_CODE; + description + "No code."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity ROUTER_ADVERTISEMENT_CODE { + base CODE; + description + "Subcodes for the router advertisement ICMPv6 type."; + } + + identity ROUTER_ADVERTISEMENT_NO_CODE { + base ROUTER_ADVERTISEMENT_CODE; + description + "No code."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity NEIGHBOR_SOLICITATION_CODE { + base CODE; + description + "Subcodes for the router solicitation ICMPv6 type."; + } + + identity NEIGHBOR_SOLICITATION_NO_CODE { + base NEIGHBOR_SOLICITATION_CODE; + description + "No code."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity NEIGHBOR_ADVERTISEMENT_CODE { + base CODE; + description + "Subcodes for the neighbor advertisement ICMPv6 type."; + } + + identity NEIGHBOR_ADVERTISEMENT_NO_CODE { + base NEIGHBOR_ADVERTISEMENT_CODE; + description + "No code."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity REDIRECT_CODE { + base CODE; + description + "Subcodes for the redirect ICMPv6 type."; + } + + identity REDIRECT_NO_CODE { + base REDIRECT_CODE; + description + "No code."; + reference + "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + identity RENUMBERING_CODE { + base CODE; + description + "Subcodes for the redirect ICMPv6 type for renumbering."; + } + + identity RENUMBERING_COMMAND { + base RENUMBERING_CODE; + description + "Router renumbering command."; + reference + "RFC2894: Router Renumbering for IPv6"; + } + + identity RENUNBERING_RESULT { + base RENUMBERING_CODE; + description + "Router renumbering result."; + reference + "RFC2894: Router Renumbering for IPv6"; + } + + identity RENUNBERING_SEQ_NUM_RESET { + base RENUMBERING_CODE; + description + "Router renumbering sequence number reset."; + reference + "RFC2894: Router Renumbering for IPv6"; + } + + identity NODE_INFORMATION_QUERY_CODE { + base CODE; + description + "Subcodes for the node information query ICMPv6 type."; + } + + identity NODE_INFORMATION_QUERY_IPV6_ADDR { + base NODE_INFORMATION_QUERY_CODE; + description + "The data field contains an IPv6 address which is the subject of the + query."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity NODE_INFORMATION_QUERY_NAME { + base NODE_INFORMATION_QUERY_CODE; + description + "The data field contains a name which is the subject of the + query."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity NODE_INFORMATION_QUERY_IPV4_ADDR { + base NODE_INFORMATION_QUERY_CODE; + description + "The data field contains an IPv4 address which is the subject of the + query."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity NDDE_INFORMATION_RESPONSE_CODE { + base CODE; + description + "Subcodes for the node information response ICMPv6 type."; + } + + identity NODE_INFORMATION_RESPONSE_SUCCESS { + base NDDE_INFORMATION_RESPONSE_CODE; + description + "A successful reply."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity NODE_INFORMATION_RESPONSE_REFUSED { + base NDDE_INFORMATION_RESPONSE_CODE; + description + "The responder refuses to supply the answer."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity NODE_INFORMATION_RESPONSE_UNKNOWN { + base NDDE_INFORMATION_RESPONSE_CODE; + description + "The query type is unknown to the responder."; + reference + "RFC4620: IPv6 Node Information Queries"; + } + + identity INVERSE_NEIGHBOR_ADVERTISEMENT_CODE { + base CODE; + description + "Subcodes for the Inverse Neighbor Discovery ICMPv6 type."; + } + + identity INVERSE_NEIGHBOR_ADVERTISEMENT_NO_CODE { + base INVERSE_NEIGHBOR_ADVERTISEMENT_CODE; + description + "No code."; + reference + "RFC3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery + Specification"; + } + + identity INVERSE_NEIGHBOR_SOLICITATION_CODE { + base CODE; + description + "Subcode for the inverse neighbor solicitation ICMP6 type."; + } + + identity INVERSE_NEIGHBOR_SOLICITATION_NO_CODE { + base INVERSE_NEIGHBOR_SOLICITATION_CODE; + description + "No code."; + reference + "RFC3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery + Specification"; + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_CODE { + base CODE; + description + "Subcodes for the Home Agent Address Discovery Request ICMPv6 type."; + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_NO_CODE { + base HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_CODE; + description + "No code."; + reference "RFC3775: Mobility Support in IPv6"; + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY_CODE { + base CODE; + description + "Subcodes for the Home Agent Address Discovery Reply ICMPv6 type."; + } + + identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY_NO_CODE { + base HOME_AGENT_ADDRESS_DISCOVERY_REPLY_CODE; + description + "No code."; + reference "RFC3775: Mobility Support in IPv6"; + } + + identity MOBILE_PREFIX_SOLICITATION_CODE { + base CODE; + description + "Subcodes for the Mobile Prefix Solicitation ICMPv6 type."; + } + + identity MOBILE_PREFIX_SOLICITATION_NO_CODE { + base MOBILE_PREFIX_SOLICITATION_CODE; + description + "No code."; + reference "RFC3775: Mobility Support in IPv6"; + } + + identity MOBILE_PREFIX_ADVERTISEMENT_CODE { + base CODE; + description + "Subcodes for the Mobile Prefix Advertisement ICMPv6 type."; + } + + identity MOBILE_PREFIX_ADVERTISEMENT_NO_CODE { + base MOBILE_PREFIX_ADVERTISEMENT_CODE; + description + "No code."; + reference "RFC3775: Mobility Support in IPv6"; + } + + identity DUPLICATE_ADDRESS_REQUEST_CODE { + base CODE; + description + "Subcodes for the Duplicate Address Request ICMPv6 type."; + } + + identity DUPLICATE_ADDRESS_REQUEST_DAR { + base DUPLICATE_ADDRESS_REQUEST_CODE; + description + "DAR message"; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR64 { + base DUPLICATE_ADDRESS_REQUEST_CODE; + description + "EDAR message with 64-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR128 { + base DUPLICATE_ADDRESS_REQUEST_CODE; + description + "EDAR message with 128-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR192 { + base DUPLICATE_ADDRESS_REQUEST_CODE; + description + "EDAR message with 192-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR256 { + base DUPLICATE_ADDRESS_REQUEST_CODE; + description + "EDAR message with 256-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REPLY_CODE { + base CODE; + description + "Subcodes for the Duplicate Address Confirmation Code ICMPv6 type."; + } + + identity DUPLICATE_ADDRESS_REPLY_DAC { + base DUPLICATE_ADDRESS_REPLY_CODE; + description + "DAC message"; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR64 { + base DUPLICATE_ADDRESS_REPLY_CODE; + description + "EDAC message with 64-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR128 { + base DUPLICATE_ADDRESS_REPLY_CODE; + description + "EDAC message with 128-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR192 { + base DUPLICATE_ADDRESS_REPLY_CODE; + description + "EDAC message with 192-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR256 { + base DUPLICATE_ADDRESS_REPLY_CODE; + description + "EDAC message with 256-bit ROVR field."; + reference "RFC6775: Neighbor Discovery Optimization for IPv6 over + Low-Power Wireless Personal Area Networks (6LoWPANs)"; + } + + identity EXT_ECHO_REQUEST_CODE { + base CODE; + description + "Subcodes for the extended echo request ICMPv6 type."; + } + + identity EXT_ECHO_REQUEST_NO_ERROR { + base EXT_ECHO_REQUEST_CODE; + description + "No error."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_CODE { + base CODE; + description + "Subcodes for the extended echo reply ICMPv6 type."; + } + + identity EXT_ECHO_REPLY_NO_ERROR { + base EXT_ECHO_REPLY_CODE; + description + "No error."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_MALFORMED_QUERY { + base EXT_ECHO_REPLY_CODE; + description + "Malformed query."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_NO_SUCH_INTERFACE { + base EXT_ECHO_REPLY_CODE; + description + "No such interface."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_NO_SUCH_TABLE_ENTRY { + base EXT_ECHO_REPLY_CODE; + description + "No such table entry."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } + + identity EXT_ECHO_REPLY_MULTIPLE_INTF_SATISFY_QUERY { + base EXT_ECHO_REPLY_CODE; + description + "Multiple interfaces satisfy query."; + reference + "RFC8355: PROBE: A Utility for Probing Interfaces"; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang new file mode 100644 index 000000000..b5f467a74 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang @@ -0,0 +1,374 @@ +module openconfig-packet-match-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/packet-match-types"; + + prefix "oc-pkt-match-types"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-extensions { prefix oc-ext; } + + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines common types for use in models requiring + data definitions related to packet matches."; + + oc-ext:openconfig-version "1.3.3"; + + revision "2023-01-29" { + description + "Whitespace cleanup."; + reference "1.3.3"; + } + + revision "2021-07-14" { + description + "Use auto-generated regex for port-num-range pattern statements"; + reference "1.3.2"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace."; + reference "1.3.1"; + } + + revision "2021-05-19" { + description + "Add IP-in-IP protocol."; + reference "1.3.0"; + } + + revision "2021-03-17" { + description + "Add MPLS filter Support."; + reference "1.2.0"; + } + + revision "2021-01-07" { + description + "Remove module extension oc-ext:regexp-posix by making pattern regexes + conform to RFC7950. + + Types impacted: + - port-num-range"; + reference "1.1.0"; + } + + revision "2020-10-20" { + description + "Fix pattern regex for port-num-range."; + reference "1.0.4"; + } + + revision "2020-06-30" { + description + "Add OpenConfig POSIX pattern extensions."; + reference "1.0.3"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "1.0.2"; + } + + revision "2018-04-15" { + description + "Corrected description and range for ethertype typedef"; + reference "1.0.1"; + } + + revision "2017-05-26" { + description + "Separated IP matches into AFs"; + reference "1.0.0"; + } + + revision "2016-08-08" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + revision "2016-04-27" { + description + "Initial revision"; + reference "TBD"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + + // extension statements + + // feature statements + + // identity statements + + + //TODO: should replace this with an official IEEE module + // when available. Only a select number of types are + // defined in this identity. + identity ETHERTYPE { + description + "Base identity for commonly used Ethertype values used + in packet header matches on Ethernet frames. The Ethertype + indicates which protocol is encapsulated in the Ethernet + payload."; + reference + "IEEE 802.3"; + } + + identity ETHERTYPE_IPV4 { + base ETHERTYPE; + description + "IPv4 protocol (0x0800)"; + } + + identity ETHERTYPE_ARP { + base ETHERTYPE; + description + "Address resolution protocol (0x0806)"; + } + + identity ETHERTYPE_VLAN { + base ETHERTYPE; + description + "VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note + that this value is also used to represent Shortest Path + Bridging (IEEE 801.1aq) frames."; + } + + identity ETHERTYPE_IPV6 { + base ETHERTYPE; + description + "IPv6 protocol (0x86DD)"; + } + + identity ETHERTYPE_MPLS { + base ETHERTYPE; + description + "MPLS unicast (0x8847)"; + } + + identity ETHERTYPE_LLDP { + base ETHERTYPE; + description + "Link Layer Discovery Protocol (0x88CC)"; + } + + identity ETHERTYPE_ROCE { + base ETHERTYPE; + description + "RDMA over Converged Ethernet (0x8915)"; + } + + + //TODO: should replace this with an official IANA module when + //available. Only a select set of protocols are defined with + //this identity. + identity IP_PROTOCOL { + description + "Base identity for commonly used IP protocols used in + packet header matches"; + reference + "IANA Assigned Internet Protocol Numbers"; + } + + identity IP_TCP { + base IP_PROTOCOL; + description + "Transmission Control Protocol (6)"; + } + + identity IP_UDP { + base IP_PROTOCOL; + description + "User Datagram Protocol (17)"; + } + + identity IP_ICMP { + base IP_PROTOCOL; + description + "Internet Control Message Protocol (1)"; + } + + identity IP_IGMP { + base IP_PROTOCOL; + description + "Internet Group Membership Protocol (2)"; + } + + identity IP_PIM { + base IP_PROTOCOL; + description + "Protocol Independent Multicast (103)"; + } + + identity IP_RSVP { + base IP_PROTOCOL; + description + "Resource Reservation Protocol (46)"; + } + + identity IP_GRE { + base IP_PROTOCOL; + description + "Generic Routing Encapsulation (47)"; + } + + identity IP_AUTH { + base IP_PROTOCOL; + description + "Authentication header, e.g., for IPSEC (51)"; + } + + identity IP_L2TP { + base IP_PROTOCOL; + description + "Layer Two Tunneling Protocol v.3 (115)"; + } + + identity IP_IN_IP { + base IP_PROTOCOL; + description + "IP-in-IP tunneling (4)"; + reference + "RFC2003: IP Encapsulation within IP"; + } + + identity TCP_FLAGS { + description + "Common TCP flags used in packet header matches"; + reference + "IETF RFC 793 - Transmission Control Protocol + IETF RFC 3168 - The Addition of Explicit Congestion + Notification (ECN) to IP"; + } + + identity TCP_SYN { + base TCP_FLAGS; + description + "TCP SYN flag"; + } + + identity TCP_FIN { + base TCP_FLAGS; + description + "TCP FIN flag"; + } + + identity TCP_RST { + base TCP_FLAGS; + description + "TCP RST flag"; + } + + identity TCP_PSH { + base TCP_FLAGS; + description + "TCP push flag"; + } + + identity TCP_ACK { + base TCP_FLAGS; + description + "TCP ACK flag"; + } + + identity TCP_URG { + base TCP_FLAGS; + description + "TCP urgent flag"; + } + + identity TCP_ECE { + base TCP_FLAGS; + description + "TCP ECN-Echo flag. If the SYN flag is set, indicates that + the TCP peer is ECN-capable, otherwise indicates that a + packet with Congestion Experienced flag in the IP header + is set"; + } + + identity TCP_CWR { + base TCP_FLAGS; + description + "TCP Congestion Window Reduced flag"; + } + + // typedef statements + + typedef port-num-range { + type union { + type string { + pattern + '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|' + + '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|' + + '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|' + + '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|' + + '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'; + oc-ext:posix-pattern + '^((0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|' + + '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|' + + '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|' + + '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|' + + '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))$'; + } + type oc-inet:port-number; + type enumeration { + enum ANY { + description + "Indicates any valid port number (e.g., wildcard)"; + } + } + } + description + "Port numbers may be represented as a single value, + an inclusive range as .., or as ANY to + indicate a wildcard."; + } + + typedef ip-protocol-type { + type union { + type uint8 { + range 0..254; + } + type identityref { + base IP_PROTOCOL; + } + } + description + "The IP protocol number may be expressed as a valid protocol + number (integer) or using a protocol type defined by the + IP_PROTOCOL identity"; + } + + typedef ethertype-type { + type union { + type uint16 { + range 1536..65535; + } + type identityref { + base ETHERTYPE; + } + } + description + "The Ethertype value may be expressed as a 16-bit number in + decimal notation, or using a type defined by the + ETHERTYPE identity"; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang new file mode 100644 index 000000000..c28798664 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang @@ -0,0 +1,727 @@ +module openconfig-packet-match { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/header-fields"; + + prefix "oc-pkt-match"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-packet-match-types { prefix oc-pkt-match-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-mpls-types { prefix oc-mpls; } + import openconfig-defined-sets { prefix oc-sets; } + import openconfig-icmpv4-types { prefix oc-icmpv4-types; } + import openconfig-icmpv6-types { prefix oc-icmpv6-types; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines data related to packet header fields + used in matching operations, for example in ACLs. When a + field is omitted from a match expression, the effect is a + wildcard ('any') for that field."; + + + oc-ext:openconfig-version "2.1.0"; + + revision "2023-03-01" { + description + "Add ICMP Fields for filtering."; + reference "2.1.0"; + } + + revision "2023-01-27" { + description + "Update the mechanism to match detailed transport flags, + adding means for AND/OR in the explicitly specified flags + and commonly supported match aliases."; + reference "2.0.0"; + } + + revision "2022-06-01" { + description + "Add the ability to match source/destination ipv4 and + ipv6 prefix list and source/destination port list "; + reference "1.4.0"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace."; + reference "1.3.1"; + } + + revision "2021-05-19" { + description + "Add the ability to match multiple DSCPs in a rule."; + reference "1.3.0"; + } + + revision "2021-03-17" { + description + "Add MPLS filter Support."; + reference "1.2.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "1.1.1"; + } + + revision "2017-12-15" { + description + "Add MPLS packet field matches"; + reference "1.1.0"; + } + + revision "2017-05-26" { + description + "Separated IP matches into AFs"; + reference "1.0.0"; + } + + revision "2016-08-08" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + revision "2016-04-27" { + description + "Initial revision"; + reference "TBD"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + + // Physical Layer fields + // ethernet-header + grouping ethernet-header-config { + description + "Configuration data of fields in Ethernet header."; + + leaf source-mac { + type oc-yang:mac-address; + description + "Source IEEE 802 MAC address."; + } + + leaf source-mac-mask { + type oc-yang:mac-address; + description + "Source IEEE 802 MAC address mask."; + } + + leaf destination-mac { + type oc-yang:mac-address; + description + "Destination IEEE 802 MAC address."; + } + + leaf destination-mac-mask { + type oc-yang:mac-address; + description + "Destination IEEE 802 MAC address mask."; + } + + leaf ethertype { + type oc-pkt-match-types:ethertype-type; + description + "Ethertype field to match in Ethernet packets"; + } + } + + grouping ethernet-header-state { + description + "State information of fields in Ethernet header."; + } + + grouping ethernet-header-top { + description + "Top level container for fields in Ethernet header."; + + container l2 { + description + "Ethernet header fields"; + + container config { + description + "Configuration data"; + uses ethernet-header-config; + } + + container state { + config false; + description + "State Information."; + uses ethernet-header-config; + uses ethernet-header-state; + } + } + } + + grouping mpls-header-top { + description + "Top-level container for fields in an MPLS header."; + + container mpls { + description + "MPLS header fields"; + + container config { + description + "Configuration parameters relating to fields within + the MPLS header."; + uses mpls-header-config; + } + + container state { + config false; + description + "Operational state parameters relating to fields + within the MPLS header"; + uses mpls-header-config; + } + } + } + + grouping mpls-header-config { + description + "Configuration parameters relating to matches within + MPLS header fields."; + + leaf traffic-class { + type oc-mpls:mpls-tc; + description + "The value of the MPLS traffic class (TC) bits, + formerly known as the EXP bits."; + } + + leaf start-label-value { + type oc-mpls:mpls-label; + description + "Match MPLS label value on the MPLS header. + The usage of this field indicated the upper + range value in the top of the stack. + The range that is used is inclusive. The match that + is done for a particular received pkt_label is: + start-label-value <= pkt_label <= end-label-value. + The 20-bit label value in an MPLS label + stack as specified in RFC 3032. + This label value does not include the + encodings of Traffic Class and TTL."; + } + + leaf end-label-value { + type oc-mpls:mpls-label; + description + "Match MPLS label value on the MPLS header. + The usage of this field indicated the upper + range value in the top of the stack. + The range that is used is inclusive. The match that + is done for a particular received pkt_label is: + start-label-value <= pkt_label <= end-label-value. + The 20-bit label value in an MPLS label + stack as specified in RFC 3032. + This label value does not include the + encodings of Traffic Class and TTL."; + } + + leaf ttl-value { + type uint8; + description + "Time-to-live MPLS packet value match."; + reference + "RFC 3032: MPLS Label Stack Encoding."; + } + } + + grouping ip-protocol-fields-common-config { + description + "IP protocol fields common to IPv4 and IPv6"; + + leaf dscp { + type oc-inet:dscp; + description + "Value of diffserv codepoint."; + } + + leaf-list dscp-set { + type oc-inet:dscp; + description + "A list of DSCP values to be matched for incoming packets. AN OR match should + be performed, such that a packet must match one of the values defined in this + list. If the field is left empty then any DSCP value matches unless the 'dscp' + leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'"; + } + + leaf length { + type uint16; + description + "In the IPv4 header field, this field is known as the Total + Length. Total Length is the length of the datagram, measured + in octets, including internet header and data. + In the IPv6 header field, this field is known as the Payload + Length, which is the length of the IPv6 payload, i.e., the rest + of the packet following the IPv6 header, in octets."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification."; + } + + leaf protocol { + type oc-pkt-match-types:ip-protocol-type; + description + "The protocol carried in the IP packet, expressed either + as its IP protocol number, or by a defined identity."; + } + + leaf hop-limit { + type uint8 { + range 0..255; + } + description + "The IP packet's hop limit -- known as TTL (in hops) in + IPv4 packets, and hop limit in IPv6"; + } + } + + // IP Layer + // ip-protocol-fields + grouping ipv4-protocol-fields-config { + description + "Configuration data of IP protocol fields + for IPv4"; + + leaf source-address { + type oc-inet:ipv4-prefix; + description + "Source IPv4 address prefix."; + } + + leaf source-address-prefix-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets" + + "/oc-sets:ipv4-prefix-set/oc-sets:name"; + } + description + "Reference to a IPv4 address prefix Set + to match the source address"; + } + + leaf destination-address { + type oc-inet:ipv4-prefix; + description + "Destination IPv4 address prefix."; + } + + leaf destination-address-prefix-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets" + + "/oc-sets:ipv4-prefix-set/oc-sets:name"; + } + description + "Reference to a IPv4 address prefix set + to match the destination address"; + } + + uses ip-protocol-fields-common-config; + + } + + grouping ipv4-protocol-fields-state { + description + "State information of IP header fields for IPv4"; + } + + grouping ipv4-protocol-fields-top { + description + "IP header fields for IPv4"; + + container ipv4 { + description + "Top level container for IPv4 match field data"; + + container config { + description + "Configuration data for IPv4 match fields"; + uses ipv4-protocol-fields-config; + } + + container state { + config false; + description + "State information for IPv4 match fields"; + uses ipv4-protocol-fields-config; + uses ipv4-protocol-fields-state; + } + uses ip-icmpv4-header-fields-top; + } + } + + grouping ipv6-protocol-fields-config { + description + "Configuration data for IPv6 match fields"; + + leaf source-address { + type oc-inet:ipv6-prefix; + description + "Source IPv6 address prefix."; + } + + leaf source-address-prefix-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets" + + "/oc-sets:ipv6-prefix-set/oc-sets:name"; + } + description + "Reference to a IPv6 address prefix set + to match the source address"; + } + + leaf source-flow-label { + type oc-inet:ipv6-flow-label; + description + "Source IPv6 Flow label."; + } + + leaf destination-address { + type oc-inet:ipv6-prefix; + description + "Destination IPv6 address prefix."; + } + + leaf destination-address-prefix-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets" + + "/oc-sets:ipv6-prefix-set/oc-sets:name"; + } + description + "Reference to a IPv6 address prefix set + to match the destination address"; + } + + leaf destination-flow-label { + type oc-inet:ipv6-flow-label; + description + "Destination IPv6 Flow label."; + } + + uses ip-protocol-fields-common-config; + } + + grouping ipv6-protocol-fields-state { + description + "Operational state data for IPv6 match fields"; + } + + grouping ipv6-protocol-fields-top { + description + "Top-level grouping for IPv6 match fields"; + + container ipv6 { + description + "Top-level container for IPv6 match field data"; + + container config { + description + "Configuration data for IPv6 match fields"; + + uses ipv6-protocol-fields-config; + } + + container state { + + config false; + + description + "Operational state data for IPv6 match fields"; + + uses ipv6-protocol-fields-config; + uses ipv6-protocol-fields-state; + } + uses ip-icmpv6-header-fields-top; + } + } + + // Transport fields + grouping transport-fields-config { + description + "Configuration data of transport-layer packet fields"; + + leaf source-port { + type oc-pkt-match-types:port-num-range; + description + "Source port or range"; + } + + leaf source-port-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:port-sets" + + "/oc-sets:port-set/oc-sets:name"; + } + description + "Reference to a port set + to match the source port"; + } + + leaf destination-port { + type oc-pkt-match-types:port-num-range; + description + "Destination port or range"; + } + + leaf destination-port-set { + type leafref { + path "/oc-sets:defined-sets/oc-sets:port-sets" + + "/oc-sets:port-set/oc-sets:name"; + } + description + "Reference to a port set + to match the destination port"; + } + + leaf detail-mode { + type enumeration { + enum EXPLICIT { + description + "Specifies that the mode for matching details at the transport + layer is to explicitly match transport flags."; + } + enum BUILTIN { + description + "Specifies that the mode for matching details at the transport + layer is to using implementation built-ins which may map to + multiple flags."; + } + } + description + "Mode that is used for matching detailed fields at the transport + layer. When EXPLICIT is specified, the implementation should + match based on the explicit flags that are specified in the + corresponding leaf. When BUILTIN is specified, the implementation + must expand the contents of the corresponding leaf to the flags + and/or fields that match the pre-defined built-in values."; + } + + leaf explicit-detail-match-mode { + type enumeration { + enum ANY { + description + "Matches of the explicit-detail-flags field are treated as + an OR between the values in the list."; + } + enum ALL { + description + "Matches of the explicit-details-flags field are treated + as an AND of the values in the list."; + } + } + description + "Specifies how the contents of the explicit-details-flags list + are to be treated. ANY implies that any of the flags may match, + where ALL indicates that all the flags must be matched."; + when "../detail-mode = 'EXPLICIT'" { + description + "This leaf is only valid when the mode for matches is specified to + be explicit."; + } + } + + leaf-list explicit-tcp-flags { + type identityref { + base oc-pkt-match-types:TCP_FLAGS; + } + description + "An explicit list of the TCP flags that are to be matched. The + mechanism for the match is specified by the explicit-detail-match-mode + leaf."; + when "../detail-mode = 'EXPLICIT'" { + description + "This leaf is only valid when the mode for matches is specified to + be explicit."; + } + } + + leaf builtin-detail { + type enumeration { + enum TCP_INITIAL { + description + "Matches the first packet of a TCP session based on a packet + not having the ACK flag set, and having the SYN flag set."; + } + enum TCP_ESTABLISHED { + description + "Matches an established TCP session based on a packet having + the ACK or RST flags set. This does not match the first + packet."; + } + enum FRAGMENT { + description + "Matches non-zero values of the fragment-offset field, indicating + this packet is a follow up to a fragmented datagram."; + } + } + description + "Specifies a built-in (alias) for a match condition that matches + multiple flags, or specifies particular logic as to the flag matches + to be implemented. This leaf is only valid when the detail-match-mode + leaf is BUILTIN."; + when "../detail-mode = 'BUILTIN'" { + description + "This leaf is only valid when the mode for matches is specified to + be builtin."; + } + } + } + + grouping transport-fields-state { + description + "State data of transport-fields"; + } + + grouping transport-fields-top { + description + "Destination transport-fields top level grouping"; + + container transport { + description + "Transport fields container"; + + container config { + description + "Configuration data"; + uses transport-fields-config; + } + + container state { + config false; + description + "State data"; + uses transport-fields-config; + uses transport-fields-state; + } + } + } + + grouping ip-icmpv4-header-fields-top { + description + "Top grouping for ICMPv4 filtering"; + + container icmpv4 { + description + "Top container for ICMPv4 filtering"; + + container config { + description + "Configuration attributes for ICMPv4 filtering"; + + uses ip-icmpv4-header-fields-config; + } + + container state { + description + "State attributes for ICMPv4 filtering"; + config false; + + uses ip-icmpv4-header-fields-config; + } + } + } + + grouping ip-icmpv6-header-fields-top { + description + "Top grouping for ICMPv6 filtering"; + + container icmpv6 { + description + "Top container for ICMPv6 filtering"; + + container config { + description + "Configuration attributes for ICMPv6 filtering"; + + uses ip-icmpv6-header-fields-config; + } + + container state { + description + "State attributes for ICMPv6 filtering"; + config false; + + uses ip-icmpv6-header-fields-config; + } + } + } + + grouping ip-icmpv4-header-fields-config { + description + "Collection of ICMPv4 header fields that can be + used to set up a match filter."; + + leaf type { + type identityref { + base oc-icmpv4-types:TYPE; + } + description + "ICMPv4 type to be matched."; + reference + "RFC 792: Internet Control Message Protocol"; + } + + leaf code { + type identityref { + base oc-icmpv4-types:CODE; + } + description + "ICMPv4 code to be matched."; + reference + "RFC 792: Internet Control Message Protocol"; + } + } + + grouping ip-icmpv6-header-fields-config { + description + "Collection of ICMPv6 header fields that can be + used to set up a match filter."; + + leaf type { + type identityref { + base oc-icmpv6-types:TYPE; + } + description + "ICMPv6 type to be matched."; + reference + "RFC 4443: Internet Control Message Protocol (ICMPv6) + for Internet Protocol Version 6 (IPv6) + Specification."; + } + + leaf code { + type identityref { + base oc-icmpv6-types:CODE; + } + description + "ICMP code to be matched."; + reference + "RFC 4443: Internet Control Message Protocol (ICMPv6) + for Internet Protocol Version 6 (IPv6) + Specification."; + } + } + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang new file mode 100644 index 000000000..0c2a92bec --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang @@ -0,0 +1,227 @@ +module openconfig-defined-sets { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/defined-sets"; + + prefix "oc-sets"; + + import openconfig-extensions { prefix oc-ext; } + import openconfig-inet-types { prefix oc-inet; } + import openconfig-packet-match-types { prefix oc-pkt-match-types; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines configuration and operational state + data for defined sets (sets of IPv4 prefixes, sets of + IPv6 prefixes, sets of ports, etc). These sets are used, + for example, in network access control lists (i.e., filters, + rules, etc.) in the matching fields."; + + oc-ext:openconfig-version "1.0.0"; + + revision "2022-12-14" { + description + "Initial version of the defined set model"; + reference "1.0.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + grouping ipv4-prefix-sets-config { + description "Configuration parameters of IPv4 prefix sets."; + + leaf name { + type string; + description + "A user defined name of the IPv4 prefix set."; + } + + leaf description { + type string; + description "A user defined IPv4 prefix set description."; + } + + leaf-list prefix { + type oc-inet:ipv4-prefix; + description + "A user defined list of IPv4 prefixes to be used in match + conditions. Each entry is a IPv4 + mask combination."; + } + } + + grouping ipv6-prefix-sets-config { + description "Configuration parameters of IPv6 prefix sets."; + + leaf name { + type string; + description + "Name of the IPv6 prefix set."; + } + + leaf description { + type string; + description + "A user defined IPv6 prefix set description."; + } + + leaf-list prefix { + type oc-inet:ipv6-prefix; + description + "A user defined list of IPv6 prefixes to be used in match + conditions. Each entry is a IPv6 + mask combination."; + } + } + + grouping port-sets-config { + description + "Configuration parameters of port sets."; + + leaf name { + type string; + description + "A user defined name of the port set."; + } + + leaf description { + type string; + description + "A user defined description for the port set"; + } + + leaf-list port { + type oc-pkt-match-types:port-num-range; + description + "A user defined set of ports to be + used in the match conditions."; + } + } + + grouping defined-sets { + description "Configuration of Defined Sets."; + + container ipv4-prefix-sets { + description + "Container to hold the list of IPv4 prefix sets."; + + list ipv4-prefix-set { + key "name"; + description + "List of IPv4 prefix sets."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the name of the IPv4 prefix set."; + } + + container config { + description + "Configuration data for IPv4 prefix sets."; + uses ipv4-prefix-sets-config; + } + + container state { + config false; + description + "State data for IPv4 prefix sets."; + uses ipv4-prefix-sets-config; + } + } + } + + container ipv6-prefix-sets { + description + "Container to hold the list of IPv4 prefix sets."; + + list ipv6-prefix-set { + key "name"; + description "List of IPv6 prefix sets. Each defined set + is uniquely identified by a name"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the name of the IPv6 prefix set."; + } + + container config { + description + "Configuration data for IPv6 prefix sets."; + uses ipv6-prefix-sets-config; + } + + container state { + config false; + description + "State data for prefix lists."; + uses ipv6-prefix-sets-config; + } + } + } + + container port-sets { + description + "Container to hold the list of port sets."; + + list port-set { + key "name"; + description + "List of port sets. Each por set is uniquely + identified by its name"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Name of the port set. The name is used to + reference the set in match conditions."; + } + + container config { + description + "Configuration data for port lists."; + uses port-sets-config; + } + + container state { + config false; + description + "State data for port lists."; + uses port-sets-config; + } + } + } + } + + + + grouping defined-sets-top { + description + "Top level grouping for defined-sets"; + + container defined-sets { + description + "Top level enclosing container for defined-set model + config and operational state data."; + uses defined-sets; + } + } + + uses defined-sets-top; + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang new file mode 100644 index 000000000..f6a577bb0 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang @@ -0,0 +1,249 @@ +module openconfig-if-aggregate { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/aggregate"; + + prefix "oc-lag"; + + // import some basic types + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import iana-if-type { prefix ianaift; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing aggregated (aka bundle, LAG) interfaces."; + + oc-ext:openconfig-version "2.4.4"; + + revision "2022-06-28" { + description + "Remove reference to invalid oc-ift type check"; + reference "2.4.4"; + } + + revision "2020-05-01" { + description + "Update when statements to reference config nodes + from config true elements."; + reference "2.4.3"; + } + + revision "2019-04-16" { + description + "Update import prefix for iana-if-type module"; + reference "2.4.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.3.2"; + } + + revision "2018-03-23" { + description + "Fix/cleanup when statements in aggregates model."; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-22" { + description + "Add IPv4 proxy ARP configuration."; + reference "2.2.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + // typedef statements + + typedef aggregation-type { + type enumeration { + enum LACP { + description "LAG managed by LACP"; + } + enum STATIC { + description "Statically configured bundle / LAG"; + } + } + description + "Type to define the lag-type, i.e., how the LAG is + defined and managed"; + } + + // grouping statements + + + grouping aggregation-logical-config { + description + "Configuration data for aggregate interfaces"; + + + leaf lag-type { + type aggregation-type; + description + "Sets the type of LAG, i.e., how it is + configured / maintained"; + } + + leaf min-links { + type uint16; + description + "Specifies the mininum number of member + interfaces that must be active for the aggregate interface + to be available"; + } + } + + grouping aggregation-logical-state { + description + "Operational state data for aggregate interfaces"; + + leaf lag-speed { + type uint32; + units Mbps; + description + "Reports effective speed of the aggregate interface, + based on speed of active member interfaces"; + } + + leaf-list member { + when "../../config/lag-type = 'STATIC'" { + description + "The simple list of member interfaces is active + when the aggregate is statically configured"; + } + type oc-if:base-interface-ref; + description + "List of current member interfaces for the aggregate, + expressed as references to existing interfaces"; + } + } + + grouping aggregation-logical-top { + description "Top-level data definitions for LAGs"; + + container aggregation { + + description + "Options for logical interfaces representing + aggregates"; + + container config { + description + "Configuration variables for logical aggregate / + LAG interfaces"; + + uses aggregation-logical-config; + } + + container state { + + config false; + description + "Operational state variables for logical + aggregate / LAG interfaces"; + + uses aggregation-logical-config; + uses aggregation-logical-state; + + } + } + } + + grouping ethernet-if-aggregation-config { + description + "Adds configuration items for Ethernet interfaces + belonging to a logical aggregate / LAG"; + + leaf aggregate-id { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Specify the logical aggregate interface to which + this interface belongs"; + } + } + + // data definition statements + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface" { + + description "Adds LAG configuration to the interface module"; + + uses aggregation-logical-top { + when "oc-if:config/oc-if:type = 'ianaift:ieee8023adLag'" { + description + "active when the interface is set to type LAG"; + } + } + } + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" + + "oc-eth:config" { + description + "Adds LAG settings to individual Ethernet interfaces"; + + uses ethernet-if-aggregation-config; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" + + "oc-eth:state" { + description + "Adds LAG settings to individual Ethernet interfaces"; + + uses ethernet-if-aggregation-config; + } + + // rpc statements + + // notification statements + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang new file mode 100644 index 000000000..3991923f6 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang @@ -0,0 +1,693 @@ +module openconfig-if-ethernet { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ethernet"; + + prefix "oc-eth"; + + // import some basic types + import openconfig-interfaces { prefix oc-if; } + import iana-if-type { prefix ianaift; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing Ethernet interfaces -- augments the OpenConfig + model for interface configuration and state."; + + oc-ext:openconfig-version "2.13.0"; + + revision "2023-03-10" { + description + "Allow Ethernet configuration parameters to be + used for aggregate (LAG) interfaces."; + reference "2.13.0"; + } + + revision "2022-04-20" { + description + "Remove unused import"; + reference "2.12.2"; + } + + revision "2021-07-20" { + description + "Fix typo in hardware MAC address description."; + reference "2.12.1"; + } + + revision "2021-07-07" { + description + "Add support for configuring fec-mode per interface."; + reference "2.12.0"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace."; + reference "2.11.1"; + } + + revision "2021-06-09" { + description + "Add support for standalone link training."; + reference "2.11.0"; + } + + revision "2021-05-17" { + description + "Add ethernet counters: in-carrier-errors, + in-interrupted-tx, in-late-collision, in-mac-errors-rx, + in-single-collision, in-symbol-error and out-mac-errors-tx"; + reference "2.10.0"; + } + + revision "2021-03-30" { + description + "Add counter for drops due to oversized frames."; + reference "2.9.0"; + } + + revision "2020-05-06" { + description + "Minor formatting fix."; + reference "2.8.1"; + } + + revision "2020-05-06" { + description + "Add 200G, 400G, 600G and 800G Ethernet speeds."; + reference "2.8.0"; + } + + revision "2020-05-05" { + description + "Fix when statement checks to use rw paths when + from a rw context."; + reference "2.7.3"; + } + + revision "2019-04-16" { + description + "Update import prefix for iana-if-type module"; + reference "2.7.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.6.2"; + } + + revision "2018-09-04" { + description + "Remove in-crc-align-errors as it is a duplicate of + in-crc-errors"; + reference "2.6.1"; + } + + revision "2018-08-28" { + description + "Add Ethernet counter in-block-errors"; + reference "2.6.0"; + } + + revision "2018-07-02" { + description + "Add new ethernet counters of in-undersize-frames, + in-crc-align-errors and the distribution container"; + reference "2.5.0"; + } + + revision "2018-04-10" { + description + "Add identities for 2.5 and 5 Gbps."; + reference "2.4.0"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + identity INTERFACE_FEC { + description + "Base type to specify FEC modes that can be configured on the interface. + These are FEC modes defined for applying to logical interfaces and their + underlying electrical channels."; + } + + identity FEC_FC { + base INTERFACE_FEC; + description + "Firecode is used for channels with NRZ modulation and speeds less than 100G. + This FEC is designed to comply with the IEEE 802.3, Clause 74."; + } + + identity FEC_RS528 { + base INTERFACE_FEC; + description + "RS528 is used for channels with NRZ modulation. This FEC is designed to + comply with IEEE 802.3, Clause 91."; + } + + identity FEC_RS544 { + base INTERFACE_FEC; + description + "RS544 is used for channels with PAM4 modulation."; + } + + identity FEC_RS544_2X_INTERLEAVE { + base INTERFACE_FEC; + description + "RS544-2x-interleave is used for channels with PAM4 modulation."; + } + + identity FEC_DISABLED { + base INTERFACE_FEC; + description + "FEC is administratively disabled."; + } + + identity ETHERNET_SPEED { + description "base type to specify available Ethernet link + speeds"; + } + + identity SPEED_10MB { + base ETHERNET_SPEED; + description "10 Mbps Ethernet"; + } + + identity SPEED_100MB { + base ETHERNET_SPEED; + description "100 Mbps Ethernet"; + } + + identity SPEED_1GB { + base ETHERNET_SPEED; + description "1 Gbps Ethernet"; + } + + identity SPEED_2500MB { + base ETHERNET_SPEED; + description "2.5 Gbps Ethernet"; + } + + identity SPEED_5GB { + base ETHERNET_SPEED; + description "5 Gbps Ethernet"; + } + + identity SPEED_10GB { + base ETHERNET_SPEED; + description "10 Gbps Ethernet"; + } + + identity SPEED_25GB { + base ETHERNET_SPEED; + description "25 Gbps Ethernet"; + } + + identity SPEED_40GB { + base ETHERNET_SPEED; + description "40 Gbps Ethernet"; + } + + identity SPEED_50GB { + base ETHERNET_SPEED; + description "50 Gbps Ethernet"; + } + + identity SPEED_100GB { + base ETHERNET_SPEED; + description "100 Gbps Ethernet"; + } + + identity SPEED_200GB { + base ETHERNET_SPEED; + description "200 Gbps Ethernet"; + } + + identity SPEED_400GB { + base ETHERNET_SPEED; + description "400 Gbps Ethernet"; + } + + identity SPEED_600GB { + base ETHERNET_SPEED; + description "600 Gbps Ethernet"; + } + + identity SPEED_800GB { + base ETHERNET_SPEED; + description "800 Gbps Ethernet"; + } + + identity SPEED_UNKNOWN { + base ETHERNET_SPEED; + description + "Interface speed is unknown. Systems may report + speed UNKNOWN when an interface is down or unpopuplated (e.g., + pluggable not present)."; + } + + // typedef statements + + + // grouping statements + + grouping ethernet-interface-config { + description "Configuration items for Ethernet interfaces"; + + leaf mac-address { + type oc-yang:mac-address; + description + "Assigns a MAC address to the Ethernet interface. If not + specified, the corresponding operational state leaf is + expected to show the system-assigned MAC address."; + } + + leaf auto-negotiate { + type boolean; + default true; + description + "Set to TRUE to request the interface to auto-negotiate + transmission parameters with its peer interface. When + set to FALSE, the transmission parameters are specified + manually."; + reference + "IEEE 802.3-2012 auto-negotiation transmission parameters"; + } + + leaf standalone-link-training { + type boolean; + default false; + description + "Link training is automatic tuning of the SerDes transmit and + receive parameters to ensure an optimal connection over copper + links. It is normally run as part of the auto negotiation + sequence as specified in IEEE 802.3 Clause 73. + + Standalone link training is used when full auto negotiation is + not desired on an Ethernet link but link training is needed. + It is configured by setting the standalone-link-training leaf + to TRUE and augo-negotiate leaf to FALSE. + + Note: If auto-negotiate is true, then the value of standalone + link training leaf will be ignored."; + } + + leaf duplex-mode { + type enumeration { + enum FULL { + description "Full duplex mode"; + } + enum HALF { + description "Half duplex mode"; + } + } + description + "When auto-negotiate is TRUE, this optionally sets the + duplex mode that will be advertised to the peer. If + unspecified, the interface should negotiate the duplex mode + directly (typically full-duplex). When auto-negotiate is + FALSE, this sets the duplex mode on the interface directly."; + } + + leaf port-speed { + type identityref { + base ETHERNET_SPEED; + } + description + "When auto-negotiate is TRUE, this optionally sets the + port-speed mode that will be advertised to the peer for + negotiation. If unspecified, it is expected that the + interface will select the highest speed available based on + negotiation. When auto-negotiate is set to FALSE, sets the + link speed to a fixed value -- supported values are defined + by ETHERNET_SPEED identities"; + } + + leaf enable-flow-control { + type boolean; + default false; + description + "Enable or disable flow control for this interface. + Ethernet flow control is a mechanism by which a receiver + may send PAUSE frames to a sender to stop transmission for + a specified time. + + This setting should override auto-negotiated flow control + settings. If left unspecified, and auto-negotiate is TRUE, + flow control mode is negotiated with the peer interface."; + reference + "IEEE 802.3x"; + } + + leaf fec-mode { + type identityref { + base INTERFACE_FEC; + } + description + "The FEC mode applied to the physical channels associated with + the interface."; + } + } + + grouping ethernet-interface-state-counters { + description + "Ethernet-specific counters and statistics"; + + // ingress counters + + leaf in-mac-control-frames { + type oc-yang:counter64; + description + "MAC layer control frames received on the interface"; + } + + leaf in-mac-pause-frames { + type oc-yang:counter64; + description + "MAC layer PAUSE frames received on the interface"; + } + + leaf in-oversize-frames { + type oc-yang:counter64; + description + "The total number of frames received that were + longer than 1518 octets (excluding framing bits, + but including FCS octets) and were otherwise + well formed."; + } + + leaf in-undersize-frames { + type oc-yang:counter64; + description + "The total number of frames received that were + less than 64 octets long (excluding framing bits, + but including FCS octets) and were otherwise well + formed."; + reference + "RFC 2819: Remote Network Monitoring MIB - + etherStatsUndersizePkts"; + } + + leaf in-jabber-frames { + type oc-yang:counter64; + description + "Number of jabber frames received on the + interface. Jabber frames are typically defined as oversize + frames which also have a bad CRC. Implementations may use + slightly different definitions of what constitutes a jabber + frame. Often indicative of a NIC hardware problem."; + } + + leaf in-fragment-frames { + type oc-yang:counter64; + description + "The total number of frames received that were less than + 64 octets in length (excluding framing bits but including + FCS octets) and had either a bad Frame Check Sequence + (FCS) with an integral number of octets (FCS Error) or a + bad FCS with a non-integral number of octets (Alignment + Error)."; + } + + leaf in-8021q-frames { + type oc-yang:counter64; + description + "Number of 802.1q tagged frames received on the interface"; + } + + leaf in-crc-errors { + type oc-yang:counter64; + description + "The total number of frames received that + had a length (excluding framing bits, but + including FCS octets) of between 64 and 1518 + octets, inclusive, but had either a bad + Frame Check Sequence (FCS) with an integral + number of octets (FCS Error) or a bad FCS with + a non-integral number of octets (Alignment Error)"; + reference + "RFC 2819: Remote Network Monitoring MIB - + etherStatsCRCAlignErrors"; + } + + leaf in-block-errors { + type oc-yang:counter64; + description + "The number of received errored blocks. Error detection codes + are capable of detecting whether one or more errors have + occurred in a given sequence of bits – the block. It is + normally not possible to determine the exact number of errored + bits within the block"; + } + + leaf in-carrier-errors { + type oc-yang:counter64; + description + "The number of received errored frames due to a carrier issue. + The value refers to MIB counter for + dot3StatsCarrierSenseErrors + oid=1.3.6.1.2.1.10.7.2.1.11"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-interrupted-tx { + type oc-yang:counter64; + description + "The number of received errored frames due to interrupted + transmission issue. The value refers to MIB counter for + dot3StatsDeferredTransmissions + oid=1.3.6.1.2.1.10.7.2.1.7"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-late-collision { + type oc-yang:counter64; + description + "The number of received errored frames due to late collision + issue. The value refers to MIB counter for + dot3StatsLateCollisions + oid=1.3.6.1.2.1.10.7.2.1.8"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-mac-errors-rx { + type oc-yang:counter64; + description + "The number of received errored frames due to MAC errors + received. The value refers to MIB counter for + dot3StatsInternalMacReceiveErrors + oid=1.3.6.1.2.1.10.7.2.1.16"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-single-collision { + type oc-yang:counter64; + description + "The number of received errored frames due to single collision + issue. The value refers to MIB counter for + dot3StatsSingleCollisionFrames + oid=1.3.6.1.2.1.10.7.2.1.4"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-symbol-error { + type oc-yang:counter64; + description + "The number of received errored frames due to symbol error. + The value refers to MIB counter for + in-symbol-error + oid=1.3.6.1.2.1.10.7.2.1.18"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + leaf in-maxsize-exceeded { + type oc-yang:counter64; + description + "The total number frames received that are well-formed but + dropped due to exceeding the maximum frame size on the interface + (e.g., MTU or MRU)"; + } + + // egress counters + + leaf out-mac-control-frames { + type oc-yang:counter64; + description + "MAC layer control frames sent on the interface"; + } + + leaf out-mac-pause-frames { + type oc-yang:counter64; + description + "MAC layer PAUSE frames sent on the interface"; + } + + leaf out-8021q-frames { + type oc-yang:counter64; + description + "Number of 802.1q tagged frames sent on the interface"; + } + + leaf out-mac-errors-tx { + type oc-yang:counter64; + description + "The number of sent errored frames due to MAC errors + transmitted. The value refers to MIB counter for + dot3StatsInternalMacTransmitErrors + oid=1.3.6.1.2.1.10.7.2.1.10"; + reference + "RFC 1643 Definitions of Managed + Objects for the Ethernet-like Interface Types."; + } + + } + + grouping ethernet-interface-state { + description + "Grouping for defining Ethernet-specific operational state"; + + leaf hw-mac-address { + type oc-yang:mac-address; + description + "Represents the 'burned-in', or system-assigned, MAC + address for the Ethernet interface."; + } + + leaf negotiated-duplex-mode { + type enumeration { + enum FULL { + description "Full duplex mode"; + } + enum HALF { + description "Half duplex mode"; + } + } + description + "When auto-negotiate is set to TRUE, and the interface has + completed auto-negotiation with the remote peer, this value + shows the duplex mode that has been negotiated."; + } + + leaf negotiated-port-speed { + type identityref { + base ETHERNET_SPEED; + } + description + "When auto-negotiate is set to TRUE, and the interface has + completed auto-negotiation with the remote peer, this value + shows the interface speed that has been negotiated."; + } + + container counters { + description "Ethernet interface counters"; + + uses ethernet-interface-state-counters; + } + } + + // data definition statements + + grouping ethernet-top { + description "top-level Ethernet config and state containers"; + + container ethernet { + description + "Top-level container for ethernet configuration + and state"; + + container config { + description "Configuration data for ethernet interfaces"; + + uses ethernet-interface-config; + + } + + container state { + + config false; + description "State variables for Ethernet interfaces"; + + uses ethernet-interface-config; + uses ethernet-interface-state; + + } + + } + } + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface" { + description "Adds addtional Ethernet-specific configuration to + interfaces model"; + + uses ethernet-top { + when "oc-if:config/oc-if:type = 'ianaift:ethernetCsmacd' or " + + "oc-if:config/oc-if:type = 'ianaift:ieee8023adLag'" { + description + "Additional interface configuration parameters when + the interface type is Ethernet, or the interface is an aggregate + interface."; + } + } + } + + // rpc statements + + // notification statements + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang new file mode 100644 index 000000000..8aebaaa06 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang @@ -0,0 +1,1611 @@ +module openconfig-if-ip { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces/ip"; + + prefix "oc-ip"; + + // import some basic types + import openconfig-inet-types { prefix oc-inet; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-vlan { prefix oc-vlan; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This model defines data for managing configuration and + operational state on IP (IPv4 and IPv6) interfaces. + + This model reuses data items defined in the IETF YANG model for + interfaces described by RFC 7277 with an alternate structure + (particularly for operational state data) and with + additional configuration items. + + Portions of this code were derived from IETF RFC 7277. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "3.5.1"; + + revision "2024-03-13" { + description + "Update in-pkts and out-pkts descriptions."; + reference "3.5.1"; + } + + revision "2023-08-14" { + description + "Add multicast counters for IPv4, IPv6."; + reference "3.5.0"; + } + +revision "2023-06-30" { + description + "Deprecate IPv6 router advertisment config suppress leaf and add config + mode leaf."; + reference "3.4.0"; + } + + revision "2023-04-12" { + description + "Add ipv4 address type configuration."; + reference "3.3.0"; + } + + revision "2023-02-06" { + description + "Add IPv6 link-local configuration."; + reference "3.2.0"; + } + + revision "2022-11-09" { + description + "Add additional IPv6 router-advertisement features."; + reference "3.1.0"; + } + + revision "2019-01-08" { + description + "Eliminate use of the 'empty' type."; + reference "3.0.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2017-04-03"{ + description + "Update copyright notice."; + reference "1.1.1"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // typedef statements + + typedef ip-address-origin { + type enumeration { + enum OTHER { + description + "None of the following."; + } + enum STATIC { + description + "Indicates that the address has been statically + configured - for example, using NETCONF or a Command Line + Interface."; + } + enum DHCP { + description + "Indicates an address that has been assigned to this + system by a DHCP server."; + } + enum LINK_LAYER { + description + "Indicates an address created by IPv6 stateless + autoconfiguration that embeds a link-layer address in its + interface identifier."; + } + enum RANDOM { + description + "Indicates an address chosen by the system at + random, e.g., an IPv4 address within 169.254/16, an + RFC 4941 temporary address, or an RFC 7217 semantically + opaque address."; + reference + "RFC 4941: Privacy Extensions for Stateless Address + Autoconfiguration in IPv6 + RFC 7217: A Method for Generating Semantically Opaque + Interface Identifiers with IPv6 Stateless + Address Autoconfiguration (SLAAC)"; + } + } + description + "The origin of an address."; + } + + typedef neighbor-origin { + type enumeration { + enum OTHER { + description + "None of the following."; + } + enum STATIC { + description + "Indicates that the mapping has been statically + configured - for example, using NETCONF or a Command Line + Interface."; + } + enum DYNAMIC { + description + "Indicates that the mapping has been dynamically resolved + using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery + protocol."; + } + } + description + "The origin of a neighbor entry."; + } + + typedef ipv4-address-type { + type enumeration { + enum PRIMARY { + description + "The primary address on the interface. There can only be one primary + address associated on an interface."; + } + enum SECONDARY { + description + "Secondary address on an interface. There can be multiple secondary + addresses associated on an interface."; + } + } + + description + "The type of an IPv4 address."; + } + + // grouping statements + + grouping ip-common-global-config { + description + "Shared configuration data for IPv4 or IPv6 assigned + globally on an interface."; + + leaf dhcp-client { + type boolean; + default false; + description + "Enables a DHCP client on the interface in order to request + an address"; + } + } + + grouping ip-common-counters-state { + description + "Operational state for IP traffic statistics for IPv4 and + IPv6"; + + container counters { + description + "Packet and byte counters for IP transmission and + reception for the address family."; + + + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of IP packets received for the specified + address family, including all IP unicast, multicast, + broadcast and error packets."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received in input IP packets + for the specified address family, including those received + in error."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of IP packets received for the specified + address family that are multicast packets. + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 4293: Management Information Base for the Internet + Protocol (IP) - ipSystemStatsHCInMcastPkts"; + } + + leaf in-multicast-octets { + type oc-yang:counter64; + description + "The total number of octets received in input IP + multicast packets for the specified address + family, including those received in error."; + reference + "RFC 4293: Management Information Base for the Internet + Protocol (IP) - ipSystemStatsHCInMcastOctets"; + } + + leaf in-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets discarded due to errors for the + specified address family, including errors in the IP + header, no route found to the IP destination, invalid + address, unknown protocol, etc."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-forwarded-pkts { + type oc-yang:counter64; + description + "The number of input packets for which the device was not + their final IP destination and for which the device + attempted to find a route to forward them to that final + destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-forwarded-octets { + type oc-yang:counter64; + description + "The number of octets received in input IP packets + for the specified address family for which the device was + not their final IP destination and for which the + device attempted to find a route to forward them to that + final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf in-discarded-pkts { + type oc-yang:counter64; + description + "The number of input IP packets for the + specified address family, for which no problems were + encountered to prevent their continued processing, but + were discarded (e.g., for lack of buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of IP packets for the + specified address family that the device supplied + to the lower layers for transmission. This includes + packets generated locally and those forwarded by the + device as well as unicast, multicast and broadcast + packets."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets in IP packets for the + specified address family that the device + supplied to the lower layers for transmission. This + includes packets generated locally and those forwarded by + the device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of IP multicast packets transmitted. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP) + - ipSystemStatsHCOutMcastPkts"; + } + + leaf out-multicast-octets { + type oc-yang:counter64; + description + "The total number of IP multicast octets transmitted. This + includes packets generated locally and those forwarded by + the device."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-error-pkts { + // TODO: this counter combines several error conditions -- + // could consider breaking them out to separate leaf nodes + type oc-yang:counter64; + description + "Number of IP packets for the specified address family + locally generated and discarded due to errors, including + no route found to the IP destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-forwarded-pkts { + type oc-yang:counter64; + description + "The number of packets for which this entity was not their + final IP destination and for which it was successful in + finding a path to their final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-forwarded-octets { + type oc-yang:counter64; + description + "The number of octets in packets for which this entity was + not their final IP destination and for which it was + successful in finding a path to their final destination."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + + leaf out-discarded-pkts { + type oc-yang:counter64; + description + "The number of output IP packets for the + specified address family for which no problem was + encountered to prevent their transmission to their + destination, but were discarded (e.g., for lack of + buffer space)."; + reference + "RFC 4293 - Management Information Base for the + Internet Protocol (IP)"; + } + } + + } + + + + grouping ipv4-global-config { + description + "Configuration data for IPv4 interfaces across + all addresses assigned to the interface"; + + leaf enabled { + type boolean; + default true; + description + "Controls whether IPv4 is enabled or disabled on this + interface. When IPv4 is enabled, this interface is + connected to an IPv4 stack, and the interface can send + and receive IPv4 packets."; + } + + leaf mtu { + type uint16 { + range "68..max"; + } + units octets; + description + "The size, in octets, of the largest IPv4 packet that the + interface will send and receive. + + The server may restrict the allowed values for this leaf, + depending on the interface's type. + + If this leaf is not configured, the operationally used MTU + depends on the interface's type."; + reference + "RFC 791: Internet Protocol"; + } + + uses ip-common-global-config; + + + } + + grouping ipv4-address-config { + description + "Per IPv4 adresss configuration data for the + interface."; + + leaf ip { + type oc-inet:ipv4-address; + description + "The IPv4 address on the interface."; + } + + leaf prefix-length { + type uint8 { + range "0..32"; + } + description + "The length of the subnet prefix."; + } + + leaf type { + type ipv4-address-type; + default PRIMARY; + description + "Specifies the explicit type of the IPv4 address being assigned + to the interface. By default, addresses are assumed to be a primary address. + Where secondary addresses is to be configured, this leaf should be set + to SECONDARY."; + } + } + + grouping ipv4-neighbor-config { + description + "Per IPv4 neighbor configuration data. Neighbor + entries are analagous to static ARP entries, i.e., they + create a correspondence between IP and link-layer addresses"; + + leaf ip { + type oc-inet:ipv4-address; + description + "The IPv4 address of the neighbor node."; + } + leaf link-layer-address { + type oc-yang:phys-address; + mandatory true; + description + "The link-layer address of the neighbor node."; + } + } + + grouping ipv4-address-state { + description + "State variables for IPv4 addresses on the interface"; + + leaf origin { + type ip-address-origin; + description + "The origin of this address, e.g., statically configured, + assigned by DHCP, etc.."; + } + } + + grouping ipv4-neighbor-state { + description + "State variables for IPv4 neighbor entries on the interface."; + + leaf origin { + type neighbor-origin; + description + "The origin of this neighbor entry, static or dynamic."; + } + } + + grouping ipv6-global-config { + description + "Configuration data at the global level for each + IPv6 interface"; + + leaf enabled { + type boolean; + default true; + description + "Controls whether IPv6 is enabled or disabled on this + interface. When IPv6 is enabled, this interface is + connected to an IPv6 stack, and the interface can send + and receive IPv6 packets."; + } + + leaf mtu { + type uint32 { + range "1280..max"; + } + units octets; + description + "The size, in octets, of the largest IPv6 packet that the + interface will send and receive. + + The server may restrict the allowed values for this leaf, + depending on the interface's type. + + If this leaf is not configured, the operationally used MTU + depends on the interface's type."; + reference + "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + Section 5"; + } + + leaf dup-addr-detect-transmits { + type uint32; + default 1; + description + "The number of consecutive Neighbor Solicitation messages + sent while performing Duplicate Address Detection on a + tentative address. A value of zero indicates that + Duplicate Address Detection is not performed on + tentative addresses. A value of one indicates a single + transmission with no follow-up retransmissions."; + reference + "RFC 4862: IPv6 Stateless Address Autoconfiguration"; + } + + uses ip-common-global-config; + } + + grouping ipv6-address-config { + description "Per-address configuration data for IPv6 interfaces"; + + leaf ip { + type oc-inet:ipv6-address; + description + "The IPv6 address on the interface."; + } + + leaf prefix-length { + type uint8 { + range "0..128"; + } + mandatory true; + description + "The length of the subnet prefix."; + } + + leaf type { + type oc-inet:ipv6-address-type; + default GLOBAL_UNICAST; + description + "Specifies the explicit type of the IPv6 address being assigned + to the interface. By default, addresses are assumed to be + global unicast. Where a link-local address is to be explicitly + configured, this leaf should be set to LINK_LOCAL."; + } + + } + + grouping ipv6-address-state { + description + "Per-address operational state data for IPv6 interfaces"; + + leaf origin { + type ip-address-origin; + description + "The origin of this address, e.g., static, dhcp, etc."; + } + + leaf status { + type enumeration { + enum PREFERRED { + description + "This is a valid address that can appear as the + destination or source address of a packet."; + } + enum DEPRECATED { + description + "This is a valid but deprecated address that should + no longer be used as a source address in new + communications, but packets addressed to such an + address are processed as expected."; + } + enum INVALID { + description + "This isn't a valid address, and it shouldn't appear + as the destination or source address of a packet."; + } + enum INACCESSIBLE { + description + "The address is not accessible because the interface + to which this address is assigned is not + operational."; + } + enum UNKNOWN { + description + "The status cannot be determined for some reason."; + } + enum TENTATIVE { + description + "The uniqueness of the address on the link is being + verified. Addresses in this state should not be + used for general communication and should only be + used to determine the uniqueness of the address."; + } + enum DUPLICATE { + description + "The address has been determined to be non-unique on + the link and so must not be used."; + } + enum OPTIMISTIC { + description + "The address is available for use, subject to + restrictions, while its uniqueness on a link is + being verified."; + } + } + description + "The status of an address. Most of the states correspond + to states from the IPv6 Stateless Address + Autoconfiguration protocol."; + reference + "RFC 4293: Management Information Base for the + Internet Protocol (IP) + - IpAddressStatusTC + RFC 4862: IPv6 Stateless Address Autoconfiguration"; + } + } + + grouping ipv6-neighbor-config { + description + "Per-neighbor configuration data for IPv6 interfaces"; + + leaf ip { + type oc-inet:ipv6-address; + description + "The IPv6 address of the neighbor node."; + } + + leaf link-layer-address { + type oc-yang:phys-address; + mandatory true; + description + "The link-layer address of the neighbor node."; + } + } + + grouping ipv6-neighbor-state { + description "Per-neighbor state variables for IPv6 interfaces"; + + leaf origin { + type neighbor-origin; + description + "The origin of this neighbor entry."; + } + leaf is-router { + type boolean; + description + "Indicates that the neighbor node acts as a router."; + } + leaf neighbor-state { + type enumeration { + enum INCOMPLETE { + description + "Address resolution is in progress, and the link-layer + address of the neighbor has not yet been + determined."; + } + enum REACHABLE { + description + "Roughly speaking, the neighbor is known to have been + reachable recently (within tens of seconds ago)."; + } + enum STALE { + description + "The neighbor is no longer known to be reachable, but + until traffic is sent to the neighbor no attempt + should be made to verify its reachability."; + } + enum DELAY { + description + "The neighbor is no longer known to be reachable, and + traffic has recently been sent to the neighbor. + Rather than probe the neighbor immediately, however, + delay sending probes for a short while in order to + give upper-layer protocols a chance to provide + reachability confirmation."; + } + enum PROBE { + description + "The neighbor is no longer known to be reachable, and + unicast Neighbor Solicitation probes are being sent + to verify reachability."; + } + } + description + "The Neighbor Unreachability Detection state of this + entry."; + reference + "RFC 4861: Neighbor Discovery for IP version 6 (IPv6) + Section 7.3.2"; + } + } + + grouping ip-vrrp-ipv6-config { + description + "IPv6-specific configuration data for VRRP on IPv6 + interfaces"; + + leaf virtual-link-local { + type oc-inet:ip-address; + description + "For VRRP on IPv6 interfaces, sets the virtual link local + address"; + } + } + + grouping ip-vrrp-ipv6-state { + description + "IPv6-specific operational state for VRRP on IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + grouping ip-vrrp-tracking-config { + description + "Configuration data for tracking interfaces + in a VRRP group"; + + leaf-list track-interface { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + // TODO: we may need to add some restriction to ethernet + // or IP interfaces. + description + "Sets a list of one or more interfaces that should + be tracked for up/down events to dynamically change the + priority state of the VRRP group, and potentially + change the mastership if the tracked interface going + down lowers the priority sufficiently. Any of the tracked + interfaces going down will cause the priority to be lowered. + Some implementations may only support a single + tracked interface."; + } + + leaf priority-decrement { + type uint8 { + range 0..254; + } + default 0; + description "Set the value to subtract from priority when + the tracked interface goes down"; + } + } + + grouping ip-vrrp-tracking-state { + description + "Operational state data for tracking interfaces in a VRRP + group"; + } + + grouping ip-vrrp-tracking-top { + description + "Top-level grouping for VRRP interface tracking"; + + container interface-tracking { + description + "Top-level container for VRRP interface tracking"; + + container config { + description + "Configuration data for VRRP interface tracking"; + + uses ip-vrrp-tracking-config; + } + + container state { + + config false; + + description + "Operational state data for VRRP interface tracking"; + + uses ip-vrrp-tracking-config; + uses ip-vrrp-tracking-state; + } + } + } + + grouping ip-vrrp-config { + description + "Configuration data for VRRP on IP interfaces"; + + leaf virtual-router-id { + type uint8 { + range 1..255; + } + description + "Set the virtual router id for use by the VRRP group. This + usually also determines the virtual MAC address that is + generated for the VRRP group"; + } + + leaf-list virtual-address { + type oc-inet:ip-address; + description + "Configure one or more virtual addresses for the + VRRP group"; + } + + leaf priority { + type uint8 { + range 1..254; + } + default 100; + description + "Specifies the sending VRRP interface's priority + for the virtual router. Higher values equal higher + priority"; + } + + leaf preempt { + type boolean; + default true; + description + "When set to true, enables preemption by a higher + priority backup router of a lower priority master router"; + } + + leaf preempt-delay { + type uint16 { + range 0..3600; + } + default 0; + description + "Set the delay the higher priority router waits + before preempting"; + } + + leaf accept-mode { + type boolean; + // TODO: should we adopt the RFC default given the common + // operational practice of setting to true? + default false; + description + "Configure whether packets destined for + virtual addresses are accepted even when the virtual + address is not owned by the router interface"; + } + + leaf advertisement-interval { + type uint16 { + range 1..4095; + } + // TODO this range is theoretical -- needs to be validated + // against major implementations. + units "centiseconds"; + default 100; + description + "Sets the interval between successive VRRP + advertisements -- RFC 5798 defines this as a 12-bit + value expressed as 0.1 seconds, with default 100, i.e., + 1 second. Several implementation express this in units of + seconds"; + } + } + + grouping ip-vrrp-state { + description + "Operational state data for VRRP on IP interfaces"; + + leaf current-priority { + type uint8; + description "Operational value of the priority for the + interface in the VRRP group"; + } + } + + grouping ip-vrrp-top { + description + "Top-level grouping for Virtual Router Redundancy Protocol"; + + container vrrp { + description + "Enclosing container for VRRP groups handled by this + IP interface"; + + reference "RFC 5798 - Virtual Router Redundancy Protocol + (VRRP) Version 3 for IPv4 and IPv6"; + + list vrrp-group { + key "virtual-router-id"; + description + "List of VRRP groups, keyed by virtual router id"; + + leaf virtual-router-id { + type leafref { + path "../config/virtual-router-id"; + } + description + "References the configured virtual router id for this + VRRP group"; + } + + container config { + description + "Configuration data for the VRRP group"; + + uses ip-vrrp-config; + } + + container state { + + config false; + + description + "Operational state data for the VRRP group"; + + uses ip-vrrp-config; + uses ip-vrrp-state; + } + + uses ip-vrrp-tracking-top; + } + } + } + + grouping ipv6-ra-config { + description + "Configuration parameters for IPv6 router advertisements."; + + leaf enable { + type boolean; + default true; + description + "If set to false, all IPv6 router advertisement functions are + disabled. The local system will not transmit router advertisement + messages and will not respond to router solicitation messages."; + } + + leaf interval { + type uint32; + units seconds; + description + "The interval between periodic router advertisement neighbor + discovery messages sent on this interface expressed in + seconds."; + } + + leaf lifetime { + type uint32; + units seconds; + description + "The lifetime advertised in the router advertisement neighbor + discovery message on this interface."; + } + + leaf suppress { + status deprecated; + type boolean; + default false; + description + "When set to true, router advertisement neighbor discovery + messages are not transmitted on this interface."; + } + + leaf mode { + type enumeration { + enum ALL { + description + "The system will transmit unsolicited router advertisement + messages and respond to router solicitation requests."; + } + enum DISABLE_UNSOLICITED_RA { + description + "Unsolicted router advertisement messages are not transmitted on + this interface. Responses to router solicitation messages will + be transmitted."; + } + } + default "ALL"; + description + "Mode controls which set of behaviors the local system should perform + to support IPv6 router advertisements."; + reference "RFC4861: Neighbor Discovery for IP version 6 (IPv6)"; + } + + leaf managed { + type boolean; + default false; + description + "When set to true, the managed address configuration (M) flag is set in + the advertised router advertisement. The M flag indicates that there are + addresses available via DHCPv6."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.2"; + } + + leaf other-config { + type boolean; + default false; + description + "When set to true, the other configuration (O) flag is set in the + advertised router advertisement. The O flag indicates that there is + other configuration available via DHCPv6 (e.g., DNS servers)."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.2"; + } + } + + grouping ipv6-ra-prefix-config { + description + "Configuration parameters for an individual prefix within an IPv6 + router advertisement."; + + leaf prefix { + type oc-inet:ipv6-prefix; + description + "IPv6 prefix to be advertised within the router advertisement + message."; + } + + leaf valid-lifetime { + type uint32; + units seconds; + description + "The length of time that the prefix is valid relative to the time + the packet was sent."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.2"; + } + + leaf preferred-lifetime { + type uint32; + units seconds; + description + "The length of time that the address within the prefix remains + in the preferred state, i.e., unrestricted use is allowed by + upper-layer protocols. See RFC4862 for a complete definition + of preferred behaviours."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.2"; + } + + leaf disable-advertisement { + type boolean; + description + "When set to true, the prefix is not advertised within + router advertisement messages that are sent as a result of + router soliciation messages."; + } + + leaf disable-autoconfiguration { + type boolean; + description + "When set to true, the prefix is marked as not to be used for stateless + address configuration. This is achieved by setting the autonomous address + configuration bit for the prefix."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.1"; + } + + leaf enable-onlink { + type boolean; + description + "When set to true, the prefix is marked as being on link by setting the + L-bit for the prefix within a router advertisement."; + reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.1"; + } + } + + grouping ipv4-proxy-arp-config { + description + "Configuration parameters for IPv4 proxy ARP"; + + leaf mode { + type enumeration { + enum DISABLE { + description + "The system should not respond to ARP requests that + do not specify an IP address configured on the local + subinterface as the target address."; + } + enum REMOTE_ONLY { + description + "The system responds to ARP requests only when the + sender and target IP addresses are in different + subnets."; + } + enum ALL { + description + "The system responds to ARP requests where the sender + and target IP addresses are in different subnets, as well + as those where they are in the same subnet."; + } + } + default "DISABLE"; + description + "When set to a value other than DISABLE, the local system should + respond to ARP requests that are for target addresses other than + those that are configured on the local subinterface using its own + MAC address as the target hardware address. If the REMOTE_ONLY + value is specified, replies are only sent when the target address + falls outside the locally configured subnets on the interface, + whereas with the ALL value, all requests, regardless of their + target address are replied to."; + reference "RFC1027: Using ARP to Implement Transparent Subnet Gateways"; + } + } + + grouping ipv4-top { + description "Top-level configuration and state for IPv4 + interfaces"; + + container ipv4 { + description + "Parameters for the IPv4 address family."; + + container addresses { + description + "Enclosing container for address list"; + + list address { + key "ip"; + description + "The list of configured IPv4 addresses on the interface."; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description "Configuration data for each configured IPv4 + address on the interface"; + + uses ipv4-address-config; + + } + + container state { + + config false; + description "Operational state data for each IPv4 address + configured on the interface"; + + uses ipv4-address-config; + uses ipv4-address-state; + } + + } + } + + container proxy-arp { + description + "Configuration and operational state parameters + relating to proxy ARP. This functionality allows a + system to respond to ARP requests that are not + explicitly destined to the local system."; + + container config { + description + "Configuration parameters for proxy ARP"; + uses ipv4-proxy-arp-config; + } + + container state { + config false; + description + "Operational state parameters for proxy ARP"; + uses ipv4-proxy-arp-config; + } + } + + container neighbors { + description + "Enclosing container for neighbor list"; + + list neighbor { + key "ip"; + description + "A list of mappings from IPv4 addresses to + link-layer addresses. + + Entries in this list are used as static entries in the + ARP Cache."; + reference + "RFC 826: An Ethernet Address Resolution Protocol"; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description "Configuration data for each configured IPv4 + address on the interface"; + + uses ipv4-neighbor-config; + + } + + container state { + + config false; + description "Operational state data for each IPv4 address + configured on the interface"; + + uses ipv4-neighbor-config; + uses ipv4-neighbor-state; + } + } + } + + uses oc-if:sub-unnumbered-top; + + container config { + description + "Top-level IPv4 configuration data for the interface"; + + uses ipv4-global-config; + } + + container state { + + config false; + description + "Top level IPv4 operational state data"; + + uses ipv4-global-config; + uses ip-common-counters-state; + } + } + } + + grouping ipv6-top { + description + "Top-level configuration and state for IPv6 interfaces"; + + container ipv6 { + description + "Parameters for the IPv6 address family."; + + container addresses { + description + "Enclosing container for address list"; + + list address { + key "ip"; + description + "The list of configured IPv6 addresses on the interface."; + + leaf ip { + type leafref { + path "../config/ip"; + } + description "References the configured IP address"; + } + + container config { + description + "Configuration data for each IPv6 address on + the interface"; + + uses ipv6-address-config; + + } + + container state { + + config false; + description + "State data for each IPv6 address on the + interface"; + + uses ipv6-address-config; + uses ipv6-address-state; + } + } + } + + container router-advertisement { + description + "Configuration and operational state parameters relating to + router advertisements."; + + container config { + description + "Configuration parameters relating to router advertisements + for IPv6."; + uses ipv6-ra-config; + } + + container state { + config false; + description + "Operational state parameters relating to router + advertisements for IPv6."; + uses ipv6-ra-config; + } + + container prefixes { + description + "Container for a list of prefixes that are included in the + router advertisement message."; + + list prefix { + key "prefix"; + + description + "List of prefixes that are to be included in the IPv6 + router-advertisement messages for the interface. The list + is keyed by the IPv6 prefix in CIDR representation. + + Prefixes that are listed are those that are to be + advertised in router advertisement messages. Where there + are IPv6 global addresses configured on an interface and + the prefix is not listed in the prefix list, it MUST NOT + be advertised in the router advertisement message."; + + leaf prefix { + type leafref { + path "../config/prefix"; + } + description + "Reference to the IPv6 prefix key for the prefix list."; + } + + container config { + description + "Configuration parameters corresponding to an IPv6 prefix + within the router advertisement."; + + uses ipv6-ra-prefix-config; + } + + container state { + config false; + description + "Operational state parameters corresponding to an IPv6 prefix + within the router advertisement."; + + uses ipv6-ra-prefix-config; + } + } + } + } + + container neighbors { + description + "Enclosing container for list of IPv6 neighbors"; + + list neighbor { + key "ip"; + description + "List of IPv6 neighbors"; + + leaf ip { + type leafref { + path "../config/ip"; + } + description + "References the configured IP neighbor address"; + } + + container config { + description "Configuration data for each IPv6 address on + the interface"; + + uses ipv6-neighbor-config; + + } + + container state { + + config false; + description "State data for each IPv6 address on the + interface"; + + uses ipv6-neighbor-config; + uses ipv6-neighbor-state; + } + } + } + uses oc-if:sub-unnumbered-top; + + container config { + description "Top-level config data for the IPv6 interface"; + + uses ipv6-global-config; + } + + container state { + config false; + description + "Top-level operational state data for the IPv6 interface"; + + uses ipv6-global-config; + uses ip-common-counters-state; + + } + } + } + + // augment statements + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface" { + description + "IPv4 address family configuration for + interfaces"; + + uses ipv4-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface" { + description + "IPv6 address family configuration for + interfaces"; + + uses ipv6-top; + + } + + // VRRP for IPv4 interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv4/oc-ip:addresses/oc-ip:address" { + + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + // VRRP for IPv6 interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/" + + "vrrp/vrrp-group/config" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" + + "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/" + + "vrrp-group/state" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-state; + } + + // Augments for for routed VLANs + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" { + description + "IPv4 address family configuration for + interfaces"; + + uses ipv4-top; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" { + description + "IPv6 address family configuration for + interfaces"; + + uses ipv6-top; + } + + // VRRP for routed VLAN interfaces + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv4/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address" { + description + "Additional IP addr family configuration for + interfaces"; + + uses ip-vrrp-top; + + } + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/config" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-config; + } + + + augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" + + "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/state" { + description + "Additional VRRP data for IPv6 interfaces"; + + uses ip-vrrp-ipv6-state; + } + + // rpc statements + + // notification statements +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang new file mode 100644 index 000000000..2cf2bdc84 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang @@ -0,0 +1,1336 @@ +module openconfig-interfaces { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/interfaces"; + + prefix "oc-if"; + + // import some basic types + import ietf-interfaces { prefix ietf-if; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-types { prefix oc-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-transport-types { prefix oc-opt-types; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "Model for managing network interfaces and subinterfaces. This + module also defines convenience types / groupings for other + models to create references to interfaces: + + base-interface-ref (type) - reference to a base interface + interface-ref (grouping) - container for reference to a + interface + subinterface + interface-ref-state (grouping) - container for read-only + (opstate) reference to interface + subinterface + + This model reuses data items defined in the IETF YANG model for + interfaces described by RFC 7223 with an alternate structure + (particularly for operational state data) and with + additional configuration items. + + Portions of this code were derived from IETF RFC 7223. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "3.7.1"; + + revision "2024-04-04" { + description + "Use single quotes in descriptions."; + reference + "3.7.1"; + } + + revision "2023-11-06" { + description + "Clarify description for admin-status TESTING."; + reference + "3.7.0"; + } + + revision "2023-08-29" { + description + "Add augment for penalty-based additive-increase, exponential-decrease link damping algorithm."; + reference + "3.6.0"; + } + + revision "2023-07-14" { + description + "Move counters which apply to both interfaces and subinterfaces to + a common grouping. Deprecate physical counters from subinterface"; + reference "3.5.0"; + } + + revision "2023-02-06" { + description + "Add further specification to interface-ref type to + clarify that the interface and subinterface leaves + are how an interface is referenced, regardless of + context."; + reference "3.0.2"; + } + + revision "2022-10-25" { + description + "change loopback-mode to align with available modes"; + reference "3.0.1"; + } + + revision "2021-04-06" { + description + "Add leaves for management and cpu interfaces"; + reference "2.5.0"; + } + + revision "2019-11-19" { + description + "Update description of interface name."; + reference "2.4.3"; + } + + revision "2019-07-10" { + description + "Remove redundant nanosecond units statements to reflect + universal definition of timeticks64 type."; + reference "2.4.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "2.4.1"; + } + + revision "2018-08-07" { + description + "Add leaf to indicate whether an interface is physical or + logical."; + reference "2.4.0"; + } + + revision "2018-07-02" { + description + "Add in-pkts and out-pkts in counters"; + reference "2.3.2"; + } + + revision "2018-04-24" { + description + "Clarified behavior of last-change state leaf"; + reference "2.3.1"; + } + + revision "2018-01-05" { + description + "Add logical loopback to interface."; + reference "2.3.0"; + } + + revision "2017-12-22" { + description + "Add IPv4 proxy ARP configuration."; + reference "2.2.0"; + } + + revision "2017-12-21" { + description + "Added IPv6 router advertisement configuration."; + reference "2.1.0"; + } + + revision "2017-07-14" { + description + "Added Ethernet/IP state data; Add dhcp-client; + migrate to OpenConfig types modules; Removed or + renamed opstate values"; + reference "2.0.0"; + } + + revision "2017-04-03" { + description + "Update copyright notice."; + reference "1.1.1"; + } + + revision "2016-12-22" { + description + "Fixes to Ethernet interfaces model"; + reference "1.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // typedef statements + + typedef base-interface-ref { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Reusable type for by-name reference to a base interface. + This type may be used in cases where ability to reference + a subinterface is not required."; + } + + typedef interface-id { + type string; + description + "User-defined identifier for an interface, generally used to + name a interface reference. The id can be arbitrary but a + useful convention is to use a combination of base interface + name and subinterface index."; + } + + // grouping statements + + grouping interface-ref-common { + description + "Reference leafrefs to interface / subinterface"; + + leaf interface { + type leafref { + path "/oc-if:interfaces/oc-if:interface/oc-if:name"; + } + description + "Reference to a base interface. If a reference to a + subinterface is required, this leaf must be specified + to indicate the base interface."; + } + + leaf subinterface { + type leafref { + path "/oc-if:interfaces/" + + "oc-if:interface[oc-if:name=current()/../interface]/" + + "oc-if:subinterfaces/oc-if:subinterface/oc-if:index"; + } + description + "Reference to a subinterface -- this requires the base + interface to be specified using the interface leaf in + this container. If only a reference to a base interface + is requuired, this leaf should not be set."; + } + } + + grouping interface-ref-state-container { + description + "Reusable opstate w/container for a reference to an + interface or subinterface"; + + container state { + config false; + description + "Operational state for interface-ref"; + + uses interface-ref-common; + } + } + + grouping interface-ref { + description + "Reusable definition for a reference to an interface or + subinterface"; + + container interface-ref { + description + "Reference to an interface or subinterface. The interface + that is being referenced is uniquely referenced based on + the specified interface and subinterface leaves. In contexts + where a Layer 3 interface is to be referenced, both the + interface and subinterface leaves must be populated, as + Layer 3 configuration within the OpenConfig models is + associated with a subinterface. In the case where a + Layer 2 interface is to be referenced, only the + interface is specified. + + The interface/subinterface leaf tuple must be used as + the means by which the interface is specified, regardless + of any other context information (e.g., key in a list)."; + + container config { + description + "Configured reference to interface / subinterface"; + oc-ext:telemetry-on-change; + + uses interface-ref-common; + } + + uses interface-ref-state-container; + } + } + + grouping interface-ref-state { + description + "Reusable opstate w/container for a reference to an + interface or subinterface"; + + container interface-ref { + description + "Reference to an interface or subinterface"; + + uses interface-ref-state-container; + } + } + + grouping base-interface-ref-state { + description + "Reusable opstate w/container for a reference to a + base interface (no subinterface)."; + + container state { + config false; + description + "Operational state for base interface reference"; + + leaf interface { + type base-interface-ref; + description + "Reference to a base interface."; + } + } + } + + + grouping interface-common-config { + description + "Configuration data data nodes common to physical interfaces + and subinterfaces"; + + leaf description { + type string; + description + "A textual description of the interface. + + A server implementation MAY map this leaf to the ifAlias + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and ifAlias. The definition of + such a mechanism is outside the scope of this document. + + Since ifAlias is defined to be stored in non-volatile + storage, the MIB implementation MUST map ifAlias to the + value of 'description' in the persistently stored + datastore. + + Specifically, if the device supports ':startup', when + ifAlias is read the device MUST return the value of + 'description' in the 'startup' datastore, and when it is + written, it MUST be written to the 'running' and 'startup' + datastores. Note that it is up to the implementation to + + decide whether to modify this single leaf in 'startup' or + perform an implicit copy-config from 'running' to + 'startup'. + + If the device does not support ':startup', ifAlias MUST + be mapped to the 'description' leaf in the 'running' + datastore."; + reference + "RFC 2863: The Interfaces Group MIB - ifAlias"; + } + + leaf enabled { + type boolean; + default "true"; + description + "This leaf contains the configured, desired state of the + interface. + + Systems that implement the IF-MIB use the value of this + leaf in the 'running' datastore to set + IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry + has been initialized, as described in RFC 2863. + + Changes in this leaf in the 'running' datastore are + reflected in ifAdminStatus, but if ifAdminStatus is + changed over SNMP, this leaf is not affected."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + } + + } + + grouping interface-phys-config { + description + "Configuration data for physical interfaces"; + + leaf name { + type string; + description + "The name of the interface. + + A device MAY restrict the allowed values for this leaf, + possibly depending on the type of the interface. + For system-controlled interfaces, this leaf is the + device-specific name of the interface. The 'config false' + list interfaces/interface[name]/state contains the currently + existing interfaces on the device. + + If a client tries to create configuration for a + system-controlled interface that is not present in the + corresponding state list, the server MAY reject + the request if the implementation does not support + pre-provisioning of interfaces or if the name refers to + an interface that can never exist in the system. A + NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case. + + The IETF model in RFC 7223 provides YANG features for the + following (i.e., pre-provisioning and arbitrary-names), + however they are omitted here: + + If the device supports pre-provisioning of interface + configuration, the 'pre-provisioning' feature is + advertised. + + If the device allows arbitrarily named user-controlled + interfaces, the 'arbitrary-names' feature is advertised. + + When a configured user-controlled interface is created by + the system, it is instantiated with the same name in the + /interfaces/interface[name]/state list."; + } + + leaf type { + type identityref { + base ietf-if:interface-type; + } + mandatory true; + description + "The type of the interface. + + When an interface entry is created, a server MAY + initialize the type leaf with a valid value, e.g., if it + is possible to derive the type from the name of the + interface. + + If a client tries to set the type of an interface to a + value that can never be used by the system, e.g., if the + type is not supported or if the type does not match the + name of the interface, the server MUST reject the request. + A NETCONF server MUST reply with an rpc-error with the + error-tag 'invalid-value' in this case."; + reference + "RFC 2863: The Interfaces Group MIB - ifType"; + } + + leaf mtu { + type uint16; + description + "Set the max transmission unit size in octets + for the physical interface. If this is not set, the mtu is + set to the operational default -- e.g., 1514 bytes on an + Ethernet interface."; + } + + leaf loopback-mode { + type oc-opt-types:loopback-mode-type; + description + "Sets the loopback type on the interface. Setting the + mode to something besides NONE activates the loopback in + the specified mode."; + } + + uses interface-common-config; + } + + grouping interface-phys-holdtime-config { + description + "Configuration data for interface hold-time settings -- + applies to physical interfaces."; + + leaf up { + type uint32; + units milliseconds; + default 0; + description + "Dampens advertisement when the interface + transitions from down to up. A zero value means dampening + is turned off, i.e., immediate notification."; + } + + leaf down { + type uint32; + units milliseconds; + default 0; + description + "Dampens advertisement when the interface transitions from + up to down. A zero value means dampening is turned off, + i.e., immediate notification."; + } + } + + grouping interface-phys-holdtime-state { + description + "Operational state data for interface hold-time."; + } + + grouping interface-phys-holdtime-top { + description + "Top-level grouping for setting link transition + dampening on physical and other types of interfaces."; + + container hold-time { + description + "Top-level container for hold-time settings to enable + dampening advertisements of interface transitions."; + + container config { + description + "Configuration data for interface hold-time settings."; + oc-ext:telemetry-on-change; + + uses interface-phys-holdtime-config; + } + + container state { + + config false; + + description + "Operational state data for interface hold-time."; + + uses interface-phys-holdtime-config; + uses interface-phys-holdtime-state; + } + } + } + + grouping interface-link-damping-config { + description + "Configuration data for interface link damping settings."; + + leaf max-suppress-time { + type uint32; + units milliseconds; + default 0; + description + "Maximum time an interface can remain damped since the last link down event no matter how unstable it has been prior to this period of stability. In a damped state, the interface's state change will not be advertised."; + } + + leaf decay-half-life { + type uint32; + units milliseconds; + default 0; + description + "The amount of time after which an interface's penalty is decreased by half. Decay-half-time should not be more than max-suppress-time."; + } + + leaf suppress-threshold { + type uint32; + default 0; + description + "The accumulated penalty that triggers the damping of an interface. A value of 0 indicates config is disabled."; + } + + leaf reuse-threshold { + type uint32; + default 0; + description + "When the accumulated penalty decreases to this reuse threshold, the interface is not damped anymore. Interface state changes are advertised to applications. A value of 0 indicates config is disabled."; + } + + leaf flap-penalty { + type uint32; + default 0; + description + "A penalty that each down event costs. A value of 0 indicates the config is disabled."; + } + } + grouping interface-link-damping-state { + description + "Operational state data for interface link damping settings."; + } + grouping link-damping-top { + description + "Top level grouping for link damping parameters."; + + container penalty-based-aied { + description + "Top level container to suppress UP->DOWN link events using a penalty based additive-increase, exponential-decrease algorithm."; + + container config { + description + "Configuration data for link damping settings."; + uses interface-link-damping-config; + } + + container state { + config false; + description + "Operational state data for link damping settings."; + uses interface-link-damping-config; + uses interface-link-damping-state; + } + } + } + + grouping interface-common-state { + description + "Operational state data (in addition to intended configuration) + at the global level for this interface"; + + oc-ext:operational; + + leaf ifindex { + type uint32; + description + "System assigned number for each interface. Corresponds to + ifIndex object in SNMP Interface MIB"; + reference + "RFC 2863 - The Interfaces Group MIB"; + oc-ext:telemetry-on-change; + } + + leaf admin-status { + type enumeration { + enum UP { + description + "Ready to pass packets."; + } + enum DOWN { + description + "Not ready to pass packets and not in some test mode."; + } + enum TESTING { + description + "The interface should be treated as if in admin-down state for + control plane protocols. In addition, while in TESTING state the + device should remove the interface from aggregate interfaces. + An interface transition to the TESTING state based on a qualification + workflow, or internal device triggered action - such as the gNOI Link + Qualification service"; + reference + "gNOI Link Qualification Service + https://github.com/openconfig/gnoi/blob/main/packet_link_qualification/index.md"; + } + } + //TODO:consider converting to an identity to have the + //flexibility to remove some values defined by RFC 7223 that + //are not used or not implemented consistently. + mandatory true; + description + "The desired state of the interface. In RFC 7223 this leaf + has the same read semantics as ifAdminStatus. Here, it + reflects the administrative state as set by enabling or + disabling the interface."; + reference + "RFC 2863: The Interfaces Group MIB - ifAdminStatus"; + oc-ext:telemetry-on-change; + } + + leaf oper-status { + type enumeration { + enum UP { + value 1; + description + "Ready to pass packets."; + } + enum DOWN { + value 2; + description + "The interface does not pass any packets."; + } + enum TESTING { + value 3; + description + "In test mode. No operational packets can + be passed."; + } + enum UNKNOWN { + value 4; + description + "Status cannot be determined for some reason."; + } + enum DORMANT { + value 5; + description + "Waiting for some external event."; + } + enum NOT_PRESENT { + value 6; + description + "Some component (typically hardware) is missing."; + } + enum LOWER_LAYER_DOWN { + value 7; + description + "Down due to state of lower-layer interface(s)."; + } + } + //TODO:consider converting to an identity to have the + //flexibility to remove some values defined by RFC 7223 that + //are not used or not implemented consistently. + mandatory true; + description + "The current operational state of the interface. + + This leaf has the same semantics as ifOperStatus."; + reference + "RFC 2863: The Interfaces Group MIB - ifOperStatus"; + oc-ext:telemetry-on-change; + } + + leaf last-change { + type oc-types:timeticks64; + description + "This timestamp indicates the absolute time of the last + state change of the interface (e.g., up-to-down transition). + This is different than the SNMP ifLastChange object in the + standard interface MIB in that it is not relative to the + system boot time (i.e,. sysUpTime). + + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + + leaf logical { + type boolean; + description + "When set to true, the interface is a logical interface + which does not have an associated physical port or + channel on the system."; + oc-ext:telemetry-on-change; + } + + leaf management { + type boolean; + description + "When set to true, the interface is a dedicated + management interface that is not connected to dataplane + interfaces. It may be used to connect the system to an + out-of-band management network, for example."; + oc-ext:telemetry-on-change; + } + + leaf cpu { + type boolean; + description + "When set to true, the interface is for traffic + that is handled by the system CPU, sometimes also called the + control plane interface. On systems that represent the CPU + interface as an Ethernet interface, for example, this leaf + should be used to distinguish the CPU interface from dataplane + interfaces."; + oc-ext:telemetry-on-change; + } + } + + grouping interface-common-counters-state { + description + "Operational state representing interface counters and statistics + applicable to (physical) interfaces and (logical) subinterfaces."; + + leaf in-octets { + type oc-yang:counter64; + description + "The total number of octets received on the interface, + including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-pkts { + type oc-yang:counter64; + description + "The total number of packets received on the interface, + including all unicast, multicast, broadcast and bad packets + etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-unicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were not addressed to a + multicast or broadcast address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-broadcast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a broadcast + address at this sub-layer. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-multicast-pkts { + type oc-yang:counter64; + description + "The number of packets, delivered by this sub-layer to a + higher (sub-)layer, that were addressed to a multicast + address at this sub-layer. For a MAC-layer protocol, + this includes both Group and Functional addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCInMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of inbound + packets that contained errors preventing them from being + deliverable to a higher-layer protocol. For character- + oriented or fixed-length interfaces, the number of + inbound transmission units that contained errors + preventing them from being deliverable to a higher-layer + protocol. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf in-discards { + type oc-yang:counter64; + description + "The number of inbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being deliverable to a higher-layer + protocol. One possible reason for discarding such a + packet could be to free up buffer space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + + + reference + "RFC 2863: The Interfaces Group MIB - ifInDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-octets { + type oc-yang:counter64; + description + "The total number of octets transmitted out of the + interface, including framing characters. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutOctets. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-pkts { + type oc-yang:counter64; + description + "The total number of packets transmitted out of the + interface, including all unicast, multicast, broadcast, + and bad packets etc."; + reference + "RFC 2819: Remote Network Monitoring Management Information Base. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-unicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were not addressed + to a multicast or broadcast address at this sub-layer, + including those that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-broadcast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + broadcast address at this sub-layer, including those + that were discarded or not sent. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutBroadcastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-multicast-pkts { + type oc-yang:counter64; + description + "The total number of packets that higher-level protocols + requested be transmitted, and that were addressed to a + multicast address at this sub-layer, including those + that were discarded or not sent. For a MAC-layer + protocol, this includes both Group and Functional + addresses. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifHCOutMulticastPkts. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-discards { + type oc-yang:counter64; + description + "The number of outbound packets that were chosen to be + discarded even though no errors had been detected to + prevent their being transmitted. One possible reason + for discarding such a packet could be to free up buffer + space. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutDiscards. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf out-errors { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of outbound + packets that could not be transmitted because of errors. + For character-oriented or fixed-length interfaces, the + number of outbound transmission units that could not be + transmitted because of errors. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifOutErrors. + RFC 4293: Management Information Base for the + Internet Protocol (IP)."; + } + + leaf last-clear { + type oc-types:timeticks64; + description + "Timestamp of the last time the interface counters were + cleared. + + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + oc-ext:telemetry-on-change; + } + } + + grouping interface-counters-state { + description + "Operational state representing interface counters + and statistics."; + + oc-ext:operational; + + leaf in-unknown-protos { + type oc-yang:counter64; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf in-fcs-errors { + type oc-yang:counter64; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. + + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } + + leaf carrier-transitions { + type oc-yang:counter64; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + + leaf resets { + type oc-yang:counter64; + description + "Number of times the interface hardware has been reset. The + triggers and effects of this event are hardware-specifc."; + oc-ext:telemetry-on-change; + + } + } + + grouping subinterfaces-counters-state { + description + "Operational state representing counters unique to subinterfaces"; + + oc-ext:operational; + leaf in-unknown-protos { + type oc-yang:counter64; + status deprecated; + description + "For packet-oriented interfaces, the number of packets + received via the interface that were discarded because + of an unknown or unsupported protocol. For + character-oriented or fixed-length interfaces that + support protocol multiplexing, the number of + transmission units received via the interface that were + discarded because of an unknown or unsupported protocol. + For any interface that does not support protocol + multiplexing, this counter is not present. + + Discontinuities in the value of this counter can occur + at re-initialization of the management system, and at + other times as indicated by the value of + 'last-clear'."; + reference + "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos"; + } + + leaf in-fcs-errors { + type oc-yang:counter64; + status deprecated; + description + "Number of received packets which had errors in the + frame check sequence (FCS), i.e., framing errors. + + Discontinuities in the value of this counter can occur + when the device is re-initialization as indicated by the + value of 'last-clear'."; + } + + leaf carrier-transitions { + type oc-yang:counter64; + status deprecated; + description + "Number of times the interface state has transitioned + between up and down since the time the device restarted + or the last-clear time, whichever is most recent."; + oc-ext:telemetry-on-change; + } + + } + + // data definition statements + + grouping sub-unnumbered-config { + description + "Configuration data for unnumbered subinterfaces"; + + leaf enabled { + type boolean; + default false; + description + "Indicates that the subinterface is unnumbered. By default + the subinterface is numbered, i.e., expected to have an + IP address configuration."; + } + } + + grouping sub-unnumbered-state { + description + "Operational state data unnumbered subinterfaces"; + } + + grouping sub-unnumbered-top { + description + "Top-level grouping unnumbered subinterfaces"; + + container unnumbered { + description + "Top-level container for setting unnumbered interfaces. + Includes reference the interface that provides the + address information"; + + container config { + description + "Configuration data for unnumbered interface"; + oc-ext:telemetry-on-change; + + uses sub-unnumbered-config; + } + + container state { + + config false; + + description + "Operational state data for unnumbered interfaces"; + + uses sub-unnumbered-config; + uses sub-unnumbered-state; + } + + uses oc-if:interface-ref; + } + } + + grouping subinterfaces-config { + description + "Configuration data for subinterfaces"; + + leaf index { + type uint32; + default 0; + description + "The index of the subinterface, or logical interface number. + On systems with no support for subinterfaces, or not using + subinterfaces, this value should default to 0, i.e., the + default subinterface."; + } + + uses interface-common-config; + + } + + grouping subinterfaces-state { + description + "Operational state data for subinterfaces"; + + oc-ext:operational; + + leaf name { + type string; + description + "The system-assigned name for the sub-interface. This MAY + be a combination of the base interface name and the + subinterface index, or some other convention used by the + system."; + oc-ext:telemetry-on-change; + } + + uses interface-common-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses subinterfaces-counters-state; + } + } + + grouping subinterfaces-top { + description + "Subinterface data for logical interfaces associated with a + given interface"; + + container subinterfaces { + description + "Enclosing container for the list of subinterfaces associated + with a physical interface"; + + list subinterface { + key "index"; + + description + "The list of subinterfaces (logical interfaces) associated + with a physical interface"; + + leaf index { + type leafref { + path "../config/index"; + } + description + "The index number of the subinterface -- used to address + the logical interface"; + } + + container config { + description + "Configurable items at the subinterface level"; + oc-ext:telemetry-on-change; + + uses subinterfaces-config; + } + + container state { + + config false; + description + "Operational state data for logical interfaces"; + + uses subinterfaces-config; + uses subinterfaces-state; + } + } + } + } + + grouping interfaces-top { + description + "Top-level grouping for interface configuration and + operational state data"; + + container interfaces { + description + "Top level container for interfaces, including configuration + and state data."; + + + list interface { + key "name"; + + description + "The list of named interfaces on the device."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the name of the interface"; + //TODO: need to consider whether this should actually + //reference the name in the state subtree, which + //presumably would be the system-assigned name, or the + //configured name. Points to the config/name now + //because of YANG 1.0 limitation that the list + //key must have the same "config" as the list, and + //also can't point to a non-config node. + } + + container config { + description + "Configurable items at the global, physical interface + level"; + oc-ext:telemetry-on-change; + + uses interface-phys-config; + } + + container state { + + config false; + description + "Operational state data at the global interface level"; + + uses interface-phys-config; + uses interface-common-state; + + container counters { + description + "A collection of interface specific statistics entitites which are + not common to subinterfaces."; + + uses interface-common-counters-state; + uses interface-counters-state; + } + } + + uses interface-phys-holdtime-top { + when "./penalty-based-aied/config/suppress-threshold = 0 + or ./penalty-based-aied/config/reuse-threshold = 0 + or ./penalty-based-aied/config/flap-penalty = 0" { + description + "Hold time and penalty-based-aied are two algorithms to suppress + link transitions and must be mutually exclusive."; + } + } + uses link-damping-top; + uses subinterfaces-top; + } + } + } + + uses interfaces-top; + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang new file mode 100644 index 000000000..765e467cf --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang @@ -0,0 +1,548 @@ +module openconfig-mpls-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/mpls-types"; + + prefix "oc-mplst"; + + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "General types for MPLS / TE data model"; + + oc-ext:openconfig-version "3.5.0"; + + revision "2023-12-14" { + description + "Added additional attributes oc-if:interface-ref + and metric attributes to static lsp"; + reference "3.5.0"; + } + + revision "2021-12-01" { + description + "Add new identity for RSVP authentication types"; + reference "3.4.0"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace"; + reference "3.3.1"; + } + + revision "2021-03-23" { + description + "Add new identity for path metric types."; + reference "3.3.0"; + } + + revision "2020-02-04" { + description + "Consistent prefix for openconfig-mpls-types."; + reference "3.2.0"; + } + + revision "2019-03-26" { + description + "Add Pseudowire encapsulation."; + reference "3.1.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "3.0.1"; + } + + revision "2018-07-02" { + description + "Add new RSVP-TE statistics, remove associated-rsvp-session + leaf. Remove use of date-and-time."; + reference "3.0.0"; + } + + revision "2018-06-16" { + description + "Included attributes for base LDP configuration."; + reference "2.6.0"; + } + + revision "2018-06-13" { + description + "Add ttl-propagation to global MPLS config"; + reference "2.5.0"; + } + + revision "2018-06-05" { + description + "Fixed bugs in when statements on RSVP-TE attributes"; + reference "2.4.2"; + } + + revision "2017-08-24" { + description + "Minor formatting fixes."; + reference "2.4.1"; + } + + revision "2017-06-21" { + description + "Add TC bits typedef."; + reference "2.4.0"; + } + + revision "2017-03-22" { + description + "Add RSVP calculated-absolute-subscription-bw"; + reference "2.3.0"; + } + + revision "2017-01-26" { + description + "Add RSVP Tspec, clarify units for RSVP, remove unused LDP"; + reference "2.2.0"; + } + + revision "2016-12-15" { + description + "Add additional MPLS parameters"; + reference "2.1.0"; + } + + revision "2016-09-01" { + description + "Revisions based on implementation feedback"; + reference "2.0.0"; + } + + revision "2016-08-08" { + description + "Public release of MPLS models"; + reference "1.0.1"; + } + + // identity statements + + identity PATH_COMPUTATION_METHOD { + description + "base identity for supported path computation + mechanisms"; + } + + identity LOCALLY_COMPUTED { + base PATH_COMPUTATION_METHOD; + description + "indicates a constrained-path LSP in which the + path is computed by the local LER"; + } + + identity EXTERNALLY_QUERIED { + base PATH_COMPUTATION_METHOD; + description + "Constrained-path LSP in which the path is + obtained by querying an external source, such as a PCE server. + In the case that an LSP is defined to be externally queried, it may + also have associated explicit definitions (which are provided to the + external source to aid computation); and the path that is returned by + the external source is not required to provide a wholly resolved + path back to the originating system - that is to say, some local + computation may also be required"; + } + + identity EXPLICITLY_DEFINED { + base PATH_COMPUTATION_METHOD; + description + "constrained-path LSP in which the path is + explicitly specified as a collection of strict or/and loose + hops"; + } + + + // using identities rather than enum types to simplify adding new + // signaling protocols as they are introduced and supported + identity PATH_SETUP_PROTOCOL { + description + "base identity for supported MPLS signaling + protocols"; + } + + identity PATH_SETUP_RSVP { + base PATH_SETUP_PROTOCOL; + description + "RSVP-TE signaling protocol"; + } + + identity PATH_SETUP_SR { + base PATH_SETUP_PROTOCOL; + description + "Segment routing"; + } + + identity PATH_SETUP_LDP { + base PATH_SETUP_PROTOCOL; + description + "LDP - RFC 5036"; + } + + + identity PROTECTION_TYPE { + description + "base identity for protection type"; + } + + identity UNPROTECTED { + base PROTECTION_TYPE; + description + "no protection is desired"; + } + + identity LINK_PROTECTION_REQUIRED { + base PROTECTION_TYPE; + description + "link protection is desired"; + } + + identity LINK_NODE_PROTECTION_REQUESTED { + base PROTECTION_TYPE; + description + "node and link protection are both desired"; + } + + identity LSP_ROLE { + description + "Base identity for describing the role of + label switched path at the current node"; + } + + identity INGRESS { + base LSP_ROLE; + description + "Label switched path is an ingress (headend) + LSP"; + } + + identity EGRESS { + base LSP_ROLE; + description + "Label switched path is an egress (tailend) + LSP"; + } + + identity TRANSIT { + base LSP_ROLE; + description + "Label switched path is a transit LSP"; + } + + + identity TUNNEL_TYPE { + description + "Base identity from which specific tunnel types are + derived."; + } + + identity P2P { + base TUNNEL_TYPE; + description + "TE point-to-point tunnel type."; + } + + identity P2MP { + base TUNNEL_TYPE; + description + "TE point-to-multipoint tunnel type."; + } + + + identity LSP_OPER_STATUS { + description + "Base identity for LSP operational status"; + } + + identity DOWN { + base LSP_OPER_STATUS; + description + "LSP is operationally down or out of service"; + } + + identity UP { + base LSP_OPER_STATUS; + description + "LSP is operationally active and available + for traffic."; + } + + identity TUNNEL_ADMIN_STATUS { + description + "Base identity for tunnel administrative status"; + } + + identity ADMIN_DOWN { + base TUNNEL_ADMIN_STATUS; + description + "LSP is administratively down"; + } + + identity ADMIN_UP { + base TUNNEL_ADMIN_STATUS; + description + "LSP is administratively up"; + } + + identity NULL_LABEL_TYPE { + description + "Base identity from which specific null-label types are + derived."; + } + + identity EXPLICIT { + base NULL_LABEL_TYPE; + description + "Explicit null label is used."; + } + + identity IMPLICIT { + base NULL_LABEL_TYPE; + description + "Implicit null label is used."; + } + + identity LSP_METRIC_TYPE { + description + "Base identity for types of LSP metric specification"; + } + + identity LSP_METRIC_RELATIVE { + base LSP_METRIC_TYPE; + description + "The metric specified for the LSPs to which this identity refers + is specified as a relative value to the IGP metric cost to the + LSP's tail-end."; + } + + identity LSP_METRIC_ABSOLUTE { + base LSP_METRIC_TYPE; + description + "The metric specified for the LSPs to which this identity refers + is specified as an absolute value"; + } + + identity LSP_METRIC_INHERITED { + base LSP_METRIC_TYPE; + description + "The metric for for the LSPs to which this identity refers is + not specified explicitly - but rather inherited from the IGP + cost directly"; + } + + // Note: The IANA PWE3 Types Registry has several more values than these + identity PSEUDOWIRE_ENCAPSULATION { + description + "Sets the PDU type of the PSEUDOWIRE Example in RFC4448. This value + should be enumerated from the IANA Pseudowire types registry"; + } + + identity PWE_ETHERNET_TAGGED_MODE { + base PSEUDOWIRE_ENCAPSULATION; + description + "Ethernet Tagged Mode RFC4448"; + reference "IANA PWE3 0x0004"; + } + + identity PWE_ETHERNET_RAW_MODE { + base PSEUDOWIRE_ENCAPSULATION; + description + "Ethernet Raw Mode RFC4448"; + reference "IANA PWE3 0x0005"; + } + + identity PATH_METRIC_TYPE { + description + "Base identity for path metric type."; + } + + identity TE_METRIC { + base PATH_METRIC_TYPE; + description + "TE path metric."; + reference + "RFC3785: Use of Interior Gateway Protocol (IGP) Metric as a + second MPLS Traffic Engineering (TE) Metric. + RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP)."; + } + + identity IGP_METRIC { + base PATH_METRIC_TYPE; + description + "IGP path metric."; + reference + "RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP)."; + } + + identity HOP_COUNT { + base PATH_METRIC_TYPE; + description + "Hop count path metric."; + reference + "RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP)."; + } + + identity PATH_DELAY { + base PATH_METRIC_TYPE; + description + "Unidirectional average link delay. + It represents the sum of the Link Delay metric + of all links along a P2P path."; + reference + "RFC8570 IS-IS Traffic Engineering (TE) Metric Extensions. + RFC7471 OSPF Traffic Engineering (TE) Metric Extensions. + RFC 8233: Extensions to the Path Computation Element Communication Protocol (PCEP) + to Compute Service-Aware Label Switched Paths (LSPs) Path Computation Element (PCE) + Communication Protocol (PCEP)."; + } + + identity RSVP_AUTH_TYPE { + description + "Base identity for RSVP message authentication types"; + reference + "RFC2747: RSVP Cryptographic Authentication"; + } + + identity RSVP_AUTH_MD5 { + base RSVP_AUTH_TYPE; + description + "HMAC-MD5 message authentication"; + } + + // typedef statements + typedef mpls-label { + type union { + type uint32 { + range 16..1048575; + } + type enumeration { + enum IPV4_EXPLICIT_NULL { + value 0; + description + "valid at the bottom of the label stack, + indicates that stack must be popped and packet forwarded + based on IPv4 header"; + } + enum ROUTER_ALERT { + value 1; + description + "allowed anywhere in the label stack except + the bottom, local router delivers packet to the local CPU + when this label is at the top of the stack"; + } + enum IPV6_EXPLICIT_NULL { + value 2; + description + "valid at the bottom of the label stack, + indicates that stack must be popped and packet forwarded + based on IPv6 header"; + } + enum IMPLICIT_NULL { + value 3; + description + "assigned by local LSR but not carried in + packets"; + } + enum ENTROPY_LABEL_INDICATOR { + value 7; + description + "Entropy label indicator, to allow an LSR + to distinguish between entropy label and applicaiton + labels RFC 6790"; + } + enum NO_LABEL { + description + "This value is utilised to indicate that the packet that + is forwarded by the local system does not have an MPLS + header applied to it. Typically, this is used at the + egress of an LSP"; + } + } + } + description + "type for MPLS label value encoding"; + reference "RFC 3032 - MPLS Label Stack Encoding"; + } + + typedef tunnel-type { + type enumeration { + enum P2P { + description + "point-to-point label-switched-path"; + } + enum P2MP { + description + "point-to-multipoint label-switched-path"; + } + enum MP2MP { + description + "multipoint-to-multipoint label-switched-path"; + } + } + description + "defines the tunnel type for the LSP"; + reference + "RFC 6388 - Label Distribution Protocol Extensions for + Point-to-Multipoint and Multipoint-to-Multipoint Label Switched + Paths + RFC 4875 - Extensions to Resource Reservation Protocol + - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE + Label Switched Paths (LSPs)"; + } + + typedef bandwidth-kbps { + type uint64; + units "Kbps"; + description + "Bandwidth values expressed in kilobits per second"; + } + + typedef bandwidth-mbps { + type uint64; + units "Mbps"; + description + "Bandwidth values expressed in megabits per second"; + } + + typedef bandwidth-gbps { + type uint64; + units "Gbps"; + description + "Bandwidth values expressed in gigabits per second"; + } + + typedef mpls-tc { + type uint8 { + range "0..7"; + } + description + "Values of the MPLS Traffic Class (formerly known as + Experimental, EXP) bits"; + } + + // grouping statements + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang new file mode 100644 index 000000000..2e0fd9f07 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang @@ -0,0 +1,206 @@ +module openconfig-extensions { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/openconfig-ext"; + + prefix "oc-ext"; + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module provides extensions to the YANG language to allow + OpenConfig specific functionality and meta-data to be defined."; + + oc-ext:openconfig-version "0.5.1"; + + revision "2022-10-05" { + description + "Add missing version statement."; + reference "0.5.1"; + } + + revision "2020-06-16" { + description + "Add extension for POSIX pattern statements."; + reference "0.5.0"; + } + + revision "2018-10-17" { + description + "Add extension for regular expression type."; + reference "0.4.0"; + } + + revision "2017-04-11" { + description + "rename password type to 'hashed' and clarify description"; + reference "0.3.0"; + } + + revision "2017-01-29" { + description + "Added extension for annotating encrypted values."; + reference "0.2.0"; + } + + revision "2015-10-09" { + description + "Initial OpenConfig public release"; + reference "0.1.0"; + } + + + // extension statements + extension openconfig-version { + argument "semver" { + yin-element false; + } + description + "The OpenConfig version number for the module. This is + expressed as a semantic version number of the form: + x.y.z + where: + * x corresponds to the major version, + * y corresponds to a minor version, + * z corresponds to a patch version. + This version corresponds to the model file within which it is + defined, and does not cover the whole set of OpenConfig models. + + Individual YANG modules are versioned independently -- the + semantic version is generally incremented only when there is a + change in the corresponding file. Submodules should always + have the same semantic version as their parent modules. + + A major version number of 0 indicates that this model is still + in development (whether within OpenConfig or with industry + partners), and is potentially subject to change. + + Following a release of major version 1, all modules will + increment major revision number where backwards incompatible + changes to the model are made. + + The minor version is changed when features are added to the + model that do not impact current clients use of the model. + + The patch-level version is incremented when non-feature changes + (such as bugfixes or clarifications to human-readable + descriptions that do not impact model functionality) are made + that maintain backwards compatibility. + + The version number is stored in the module meta-data."; + } + + extension openconfig-hashed-value { + description + "This extension provides an annotation on schema nodes to + indicate that the corresponding value should be stored and + reported in hashed form. + + Hash algorithms are by definition not reversible. Clients + reading the configuration or applied configuration for the node + should expect to receive only the hashed value. Values written + in cleartext will be hashed. This annotation may be used on + nodes such as secure passwords in which the device never reports + a cleartext value, even if the input is provided as cleartext."; + } + + extension regexp-posix { + description + "This extension indicates that the regular expressions included + within the YANG module specified are conformant with the POSIX + regular expression format rather than the W3C standard that is + specified by RFC6020 and RFC7950."; + } + + extension posix-pattern { + argument "pattern" { + yin-element false; + } + description + "Provides a POSIX ERE regular expression pattern statement as an + alternative to YANG regular expresssions based on XML Schema Datatypes. + It is used the same way as the standard YANG pattern statement defined in + RFC6020 and RFC7950, but takes an argument that is a POSIX ERE regular + expression string."; + reference + "POSIX Extended Regular Expressions (ERE) Specification: + https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04"; + } + + extension telemetry-on-change { + description + "The telemetry-on-change annotation is specified in the context + of a particular subtree (container, or list) or leaf within the + YANG schema. Where specified, it indicates that the value stored + by the nodes within the context change their value only in response + to an event occurring. The event may be local to the target, for + example - a configuration change, or external - such as the failure + of a link. + + When a telemetry subscription allows the target to determine whether + to export the value of a leaf in a periodic or event-based fashion + (e.g., TARGET_DEFINED mode in gNMI), leaves marked as + telemetry-on-change should only be exported when they change, + i.e., event-based."; + } + + extension telemetry-atomic { + description + "The telemetry-atomic annotation is specified in the context of + a subtree (containre, or list), and indicates that all nodes + within the subtree are always updated together within the data + model. For example, all elements under the subtree may be updated + as a result of a new alarm being raised, or the arrival of a new + protocol message. + + Transport protocols may use the atomic specification to determine + optimisations for sending or storing the corresponding data."; + } + + extension operational { + description + "The operational annotation is specified in the context of a + grouping, leaf, or leaf-list within a YANG module. It indicates + that the nodes within the context are derived state on the device. + + OpenConfig data models divide nodes into the following three categories: + + - intended configuration - these are leaves within a container named + 'config', and are the writable configuration of a target. + - applied configuration - these are leaves within a container named + 'state' and are the currently running value of the intended configuration. + - derived state - these are the values within the 'state' container which + are not part of the applied configuration of the device. Typically, they + represent state values reflecting underlying operational counters, or + protocol statuses."; + } + + extension catalog-organization { + argument "org" { + yin-element false; + } + description + "This extension specifies the organization name that should be used within + the module catalogue on the device for the specified YANG module. It stores + a pithy string where the YANG organization statement may contain more + details."; + } + + extension origin { + argument "origin" { + yin-element false; + } + description + "This extension specifies the name of the origin that the YANG module + falls within. This allows multiple overlapping schema trees to be used + on a single network element without requiring module based prefixing + of paths."; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang new file mode 100644 index 000000000..dc5699842 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang @@ -0,0 +1,1883 @@ +module openconfig-transport-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/transport-types"; + + prefix "oc-opt-types"; + + import openconfig-platform-types { prefix oc-platform-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-types { prefix oc-types; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module contains general type definitions and identities + for optical transport models."; + + oc-ext:openconfig-version "0.24.0"; + + revision "2024-03-20" { + description + "FlexO support, 800G trib protocol, and OSFP + description update for 800G."; + reference "0.24.0"; + } + + revision "2024-03-12" { + description + "Add TRIBUTARY_RATE_CLASS_TYPE's up to 3200G to support + mating of two 1600G line rates."; + reference "0.23.0"; + } + + revision "2024-01-17" { + description + "Update loopback-mode types."; + reference "0.22.0"; + } + + revision "2024-01-16" { + description + "Added form factors QSFP28_DD and CSFP. + Added new PMDs: ETH_100GBASE_ER4L (MSA 100GBASE-ER4 Lite), + ETH_1GBASE_LX10. + Added References for 100GBASE-CR4 and 40GGBASE-CR4 for DACs"; + reference "0.21.0"; + } + + revision "2023-08-03" { + description + "Add QSFP56 and QSFP56_DD form factor identities and + deprecated QSFP56_DD_TYPE1 and QSFP56_DD_TYPE2 form factor identities."; + reference "0.20.0"; + } + + revision "2023-07-24" { + description + "Add SFP_DD and DSFP form factor identities."; + reference "0.19.0"; + } + + revision "2023-02-08" { + description + "Add ETH_100GBASE_DR PMD type"; + reference "0.18.1"; + } + + revision "2022-12-05" { + description + "Fix trailing whitespace"; + reference "0.17.1"; + } + + revision "2022-10-18" { + description + "Add ETH_400GMSA_PSM4 PMD type"; + reference "0.17.0"; + } + + revision "2022-09-26" { + description + "Add SFP28 and SFP56 form factor identities."; + reference "0.16.0"; + } + + revision "2021-07-29" { + description + "Add several avg-min-max-instant-stats groupings"; + reference "0.15.0"; + } + + revision "2021-03-22" { + description + "Add client mapping mode identityref."; + reference "0.14.0"; + } + + revision "2021-02-26" { + description + "Additional PMD types, form factors, and protocol types."; + reference "0.13.0"; + } + + revision "2020-08-12" { + description + "Additional tributary rates."; + reference "0.12.0"; + } + + revision "2020-04-24" { + description + "Add 400G protocol and additional tributary half rates."; + reference "0.11.0"; + } + + revision "2020-04-22" { + description + "Add AOC and DAC connector identities."; + reference "0.10.0"; + } + + revision "2019-06-27" { + description + "Add FIBER_JUMPER_TYPE identityref."; + reference "0.9.0"; + } + + revision "2019-06-21" { + description + "Generalize and rename optical port type identity"; + reference "0.8.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.7.1"; + } + + revision "2018-10-23" { + description + "Added frame mapping protocols for logical channels assignments + and tributary slot granularity for OTN logical channels"; + reference "0.7.0"; + } + + revision "2018-05-16" { + description + "Added interval,min,max time to interval stats."; + reference "0.6.0"; + } + + revision "2017-08-16" { + description + "Added ODU Cn protocol type"; + reference "0.5.0"; + } + + revision "2016-12-22" { + description + "Fixes and additions for terminal optics model"; + reference "0.4.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // typedef statements + + typedef frequency-type { + type uint64; + units "MHz"; + description + "Type for optical spectrum frequency values"; + } + + typedef admin-state-type { + type enumeration { + enum ENABLED { + description + "Sets the channel admin state to enabled"; + } + enum DISABLED { + description + "Sets the channel admin state to disabled"; + } + enum MAINT { + description + "Sets the channel to maintenance / diagnostic mode"; + } + } + description "Administrative state modes for + logical channels in the transponder model."; + } + + typedef loopback-mode-type { + type enumeration { + enum NONE { + description + "No loopback is applied"; + } + enum FACILITY { + description + "A port internal loopback at ASIC level. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source. Note this + mode is used when internal loopback does NOT specify MAC or PHY."; + } + enum TERMINAL { + description + "A port external loopback at ASIC level. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port. Note this mode is + used when external loopback does NOT specify MAC or PHY"; + } + enum ASIC_PHY_LOCAL { + description + "A port internal loopback at PHY module. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source."; + } + enum ASIC_PHY_REMOTE { + description + "A port external loopback at PHY module. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port."; + } + enum ASIC_MAC_LOCAL { + description + "A port internal loopback at MAC module. The loopback directs + traffic normally transmitted on the port back to the device as + if received on the same port from an external source."; + } + enum ASIC_MAC_REMOTE { + description + "A port external loopback at MAC module. The loopback which + directs traffic received from an external source on the port + back out the transmit side of the same port."; + } + } + default NONE; + description + "Loopback modes for transponder logical channels"; + } + + identity FRAME_MAPPING_PROTOCOL { + description + "Base identity for frame mapping protocols that can be used + when mapping Ethernet, OTN or other client signals to OTN + logical channels."; + } + + identity AMP { + base FRAME_MAPPING_PROTOCOL; + description "Asynchronous Mapping Procedure"; + } + + identity GMP { + base FRAME_MAPPING_PROTOCOL; + description "Generic Mapping Procedure"; + } + + identity BMP { + base FRAME_MAPPING_PROTOCOL; + description "Bit-synchronous Mapping Procedure"; + } + + identity CBR { + base FRAME_MAPPING_PROTOCOL; + description "Constant Bit Rate Mapping Procedure"; + } + + identity GFP_T { + base FRAME_MAPPING_PROTOCOL; + description "Transparent Generic Framing Protocol"; + } + + identity GFP_F { + base FRAME_MAPPING_PROTOCOL; + description "Framed-Mapped Generic Framing Protocol"; + } + + identity TRIBUTARY_SLOT_GRANULARITY { + description + "Base identity for tributary slot granularity for OTN + logical channels."; + } + + identity TRIB_SLOT_1.25G { + base TRIBUTARY_SLOT_GRANULARITY; + description + "The tributary slot with a bandwidth of approximately 1.25 Gb/s + as defined in ITU-T G.709 standard."; + } + + identity TRIB_SLOT_2.5G { + base TRIBUTARY_SLOT_GRANULARITY; + description + "The tributary slot with a bandwidth of approximately 2.5 Gb/s + as defined in ITU-T G.709 standard."; + } + + identity TRIB_SLOT_5G { + base TRIBUTARY_SLOT_GRANULARITY; + description + "The tributary slot with a bandwidth of approximately 5 Gb/s + as defined in ITU-T G.709 standard."; + } + + // grouping statements + + grouping avg-min-max-instant-stats-precision2-ps-nm { + description + "Common grouping for recording picosecond per nanometer + values with 2 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics. + Statistics are computed and reported based on a moving time + interval (e.g., the last 30s). If supported by the device, + the time interval over which the statistics are computed, and + the times at which the minimum and maximum values occurred, + are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units ps-nm; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units ps-nm; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units ps-nm; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units ps-nm; + description + "The maximum value of the statistic over the time interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-ps { + description + "Common grouping for recording picosecond values with + 2 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics. + Statistics are computed and reported based on a moving time + interval (e.g., the last 30s). If supported by the device, + the time interval over which the statistics are computed, and + the times at which the minimum and maximum values occurred, + are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units ps; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units ps; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units ps; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units ps; + description + "The maximum value of the statistic over the time interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-ps2 { + description + "Common grouping for recording picosecond^2 values with + 2 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics. + Statistics are computed and reported based on a moving time + interval (e.g., the last 30s). If supported by the device, + the time interval over which the statistics are computed, and + the times at which the minimum and maximum values occurred, + are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units ps^2; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units ps^2; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units ps^2; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units ps^2; + description + "The maximum value of the statistic over the time + interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision18-ber { + description + "Common grouping for recording bit error rate (BER) values + with 18 decimal precision. Note that decimal64 supports + values as small as i x 10^-18 where i is an integer. Values + smaller than this should be reported as 0 to inidicate error + free or near error free performance. Values include the + instantaneous, average, minimum, and maximum statistics. + Statistics are computed and reported based on a moving time + interval (e.g., the last 30s). If supported by the device, + the time interval over which the statistics are computed, and + the times at which the minimum and maximum values occurred, + are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 18; + } + units bit-errors-per-second; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 18; + } + units bit-errors-per-second; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 18; + } + units bit-errors-per-second; + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 18; + } + units bit-errors-per-second; + description + "The maximum value of the statistic over the time + interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision1-mhz { + description + "Common grouping for recording frequency values in MHz with + 1 decimal precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed and + reported based on a moving time interval (e.g., the last 30s). + If supported by the device, the time interval over which the + statistics are computed, and the times at which the minimum and + maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + units MHz; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 1; + } + units MHz; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + units MHz; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + units MHz; + description + "The maximum value of the statistic over the time interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision1-krads { + description + "Common grouping for recording kiloradian per second (krad/s) values + with 1 decimal precision. Values include the instantaneous, + average, minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last 30s). + If supported by the device, the time interval over which the + statistics are computed, and the times at which the minimum and + maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + units "krad/s"; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 1; + } + units "krad/s"; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + units "krad/s"; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + units "krad/s"; + description + "The maximum value of the statistic over the time interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-pct { + description + "Common grouping for percentage statistics with 2 decimal precision. + Values include the instantaneous, average, minimum, and maximum + statistics. Statistics are computed and reported based on a moving + time interval (e.g., the last 30s). If supported by the device, + the time interval over which the statistics are computed, and the + times at which the minimum and maximum values occurred, are also + reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units percentage; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units percentage; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units percentage; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units percentage; + description + "The maximum value of the statistic over the time interval."; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + + // identity statements + + identity TRIBUTARY_PROTOCOL_TYPE { + description + "Base identity for protocol framing used by tributary + signals."; + } + + identity PROT_1GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "1G Ethernet protocol"; + } + + identity PROT_OC48 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OC48 protocol"; + } + + identity PROT_STM16 { + base TRIBUTARY_PROTOCOL_TYPE; + description "STM 16 protocol"; + } + + identity PROT_10GE_LAN { + base TRIBUTARY_PROTOCOL_TYPE; + description "10G Ethernet LAN protocol"; + } + + identity PROT_10GE_WAN { + base TRIBUTARY_PROTOCOL_TYPE; + description "10G Ethernet WAN protocol"; + } + + identity PROT_OC192 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OC 192 (9.6GB) port protocol"; + } + + identity PROT_STM64 { + base TRIBUTARY_PROTOCOL_TYPE; + description "STM 64 protocol"; + } + + identity PROT_OTU2 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU 2 protocol"; + } + + identity PROT_OTU2E { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU 2e protocol"; + } + + identity PROT_OTU1E { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU 1e protocol"; + } + + identity PROT_ODU2 { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU 2 protocol"; + } + + identity PROT_ODU2E { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU 2e protocol"; + } + + identity PROT_40GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "40G Ethernet port protocol"; + } + + identity PROT_OC768 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OC 768 protocol"; + } + + identity PROT_STM256 { + base TRIBUTARY_PROTOCOL_TYPE; + description "STM 256 protocol"; + } + + identity PROT_OTU3 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU 3 protocol"; + } + + identity PROT_ODU3 { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU 3 protocol"; + } + + identity PROT_100GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "100G Ethernet protocol"; + } + + identity PROT_100G_MLG { + base TRIBUTARY_PROTOCOL_TYPE; + description "100G MLG protocol"; + } + + identity PROT_OTU4 { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU4 signal protocol (112G) for transporting + 100GE signal"; + } + + identity PROT_OTUCN { + base TRIBUTARY_PROTOCOL_TYPE; + description "OTU Cn protocol"; + } + + identity PROT_ODUCN { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU Cn protocol"; + } + + identity PROT_ODU4 { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU 4 protocol"; + } + + identity PROT_400GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "400G Ethernet protocol"; + } + + identity PROT_800GE { + base TRIBUTARY_PROTOCOL_TYPE; + description "800G Ethernet protocol"; + } + + identity PROT_OTSIG { + base TRIBUTARY_PROTOCOL_TYPE; + description "Optical tributary signal group protocol"; + } + + identity PROT_ODUFLEX_CBR { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU Flex with CBR protocol"; + } + + identity PROT_FLEXO { + base TRIBUTARY_PROTOCOL_TYPE; + description + "FlexO protocol as defined in ITU-T G.709.1 and ITU-T G.709.3"; + } + + identity PROT_ODUFLEX_GFP { + base TRIBUTARY_PROTOCOL_TYPE; + description "ODU Flex with GFP protocol"; + } + + identity TRANSCEIVER_FORM_FACTOR_TYPE { + description + "Base identity for identifying the type of pluggable optic + transceiver (i.e,. form factor) used in a port."; + } + + identity CFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "C form-factor pluggable, that can support up to a + 100 Gb/s signal with 10x10G or 4x25G physical channels"; + } + + identity CFP2 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "1/2 C form-factor pluggable, that can support up to a + 200 Gb/s signal with 10x10G, 4x25G, or 8x25G physical + channels"; + } + + identity CFP2_ACO { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "CFP2 analog coherent optics transceiver, supporting + 100 Gb, 200Gb, and 250 Gb/s signal."; + } + + identity CFP4 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "1/4 C form-factor pluggable, that can support up to a + 100 Gb/s signal with 10x10G or 4x25G physical channels"; + } + + identity QSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "OriginalQuad Small Form-factor Pluggable transceiver that can + support 4x1G physical channels. Not commonly used."; + } + + identity QSFP_PLUS { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Quad Small Form-factor Pluggable transceiver that can support + up to 4x10G physical channels."; + } + + identity QSFP28 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP pluggable optic with support for up to 4x28G physical + channels"; + } + + identity QSFP28_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP-DD with electrical interfaces consisting of 8 lanes that operate at up to + 25 Gbps with NRZ modulation"; + reference "http://qsfp-dd.com"; + } + + identity QSFP56 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP pluggable optic with support for up to 4x56G physical + channels"; + } + + identity QSFP56_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "QSFP-DD electrical interfaces will employ 8 lanes that operate up to + 25 Gbps NRZ modulation or 50 Gbps PAM4 modulation, providing + solutions up to 200 Gbps or 400 Gbps aggregate"; + reference "http://qsfp-dd.com"; + } + + identity QSFP56_DD_TYPE1 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + status deprecated; + description + "QSFP DD pluggable optic with support for up to 8x56G physical + channels. Type 1 uses eight optical and electrical signals."; + } + + identity QSFP56_DD_TYPE2 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + status deprecated; + description + "QSFP DD pluggable optic with support for up to 4x112G physical + channels. Type 2 uses four optical and eight electrical + signals."; + } + + identity CPAK { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Cisco CPAK transceiver supporting 100 Gb/s."; + } + + identity SFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Small form-factor pluggable transceiver supporting up to + 10 Gb/s signal"; + } + + identity SFP_PLUS { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Enhanced small form-factor pluggable transceiver supporting + up to 16 Gb/s signals, including 10 GbE and OTU2"; + } + + identity CSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Compact Small form-factor pluggable transceiver. It is a version + of SFP with the same mechanical form factor allowing two independent + bidirectional channels per port."; + } + + + + identity SFP28 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Small form-factor pluggable transceiver supporting up to + 25 Gb/s signal"; + } + + identity SFP56 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Small form-factor pluggable transceiver supporting up to + 50 Gb/s signal"; + } + + identity SFP_DD { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "SFP-DD electrical interfaces will employ 2 lanes that operate up to + 25 Gbps NRZ modulation or 56 Gbps PAM4 modulation, providing + solutions up to 50 Gbps or 112 Gbps PAM4 aggregate"; + reference "http://sfp-dd.com"; + } + + identity DSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "A transceiver implementing the DSFP Transceiver specification"; + reference "https://dsfpmsa.org/"; + } + + identity XFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "10 Gigabit small form factor pluggable transceiver supporting + 10 GbE and OTU2"; + } + + identity X2 { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "10 Gigabit small form factor pluggable transceiver supporting + 10 GbE using a XAUI inerface and 4 data channels."; + } + + identity OSFP { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Octal small form factor pluggable transceiver supporting + 400 Gb/s or 800 Gb/s."; + } + + identity NON_PLUGGABLE { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Represents a port that does not require a pluggable optic, + e.g., with on-board optics like COBO"; + } + + identity OTHER { + base TRANSCEIVER_FORM_FACTOR_TYPE; + description + "Represents a transceiver form factor not otherwise listed"; + } + + identity FIBER_CONNECTOR_TYPE { + description + "Type of optical fiber connector"; + } + + identity SC_CONNECTOR { + base FIBER_CONNECTOR_TYPE; + description + "SC type fiber connector"; + } + + identity LC_CONNECTOR { + base FIBER_CONNECTOR_TYPE; + description + "LC type fiber connector"; + } + + identity MPO_CONNECTOR { + base FIBER_CONNECTOR_TYPE; + description + "MPO (multi-fiber push-on/pull-off) type fiber connector + 1x12 fibers"; + } + + identity AOC_CONNECTOR { + base FIBER_CONNECTOR_TYPE; + description + "AOC (active optical cable) type fiber connector"; + } + + identity DAC_CONNECTOR { + base FIBER_CONNECTOR_TYPE; + description + "DAC (direct attach copper) type fiber connector"; + } + + identity ETHERNET_PMD_TYPE { + description + "Ethernet compliance codes (PMD) supported by transceivers"; + } + + identity ETH_1000BASE_LX10 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: ETH_1000BASE_LX10"; + reference "802.3ah-2004(CL59)"; + } + + identity ETH_10GBASE_LRM { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 10GBASE_LRM"; + } + + identity ETH_10GBASE_LR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 10GBASE_LR"; + } + + identity ETH_10GBASE_ZR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 10GBASE_ZR"; + } + + identity ETH_10GBASE_ER { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 10GBASE_ER"; + } + + identity ETH_10GBASE_SR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 10GBASE_SR"; + } + + identity ETH_40GBASE_CR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 40GBASE_CR4. + This PMD is used in Direct Attach Cables (DAC) + and Active Optical Cables (AOC)"; + reference "IEEE 802.3ba 40GBASE-CR4"; + } + + identity ETH_40GBASE_SR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 40GBASE_SR4"; + } + + identity ETH_40GBASE_LR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 40GBASE_LR4"; + } + + identity ETH_40GBASE_ER4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 40GBASE_ER4"; + } + + identity ETH_40GBASE_PSM4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 40GBASE_PSM4"; + } + + identity ETH_4X10GBASE_LR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 4x10GBASE_LR"; + } + + identity ETH_4X10GBASE_SR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 4x10GBASE_SR"; + } + + identity ETH_100G_AOC { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100G_AOC"; + } + + identity ETH_100G_ACC { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100G_ACC"; + } + + identity ETH_100GBASE_SR10 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_SR10"; + } + + identity ETH_100GBASE_SR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_SR4"; + } + + identity ETH_100GBASE_LR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_LR4"; + } + + identity ETH_100GBASE_ER4L { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_ER4L"; + } + + identity ETH_100GBASE_ER4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_ER4"; + } + + identity ETH_100GBASE_CWDM4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_CWDM4"; + } + + identity ETH_100GBASE_CLR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_CLR4"; + } + + identity ETH_100GBASE_PSM4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_PSM4"; + } + + identity ETH_100GBASE_CR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_CR4. + This PMD is used in Direct Attach Cables (DAC) + and Active Optical Cables (AOC)"; + reference "IEEE 802.3bj 100GBASE-CR4"; + } + + identity ETH_100GBASE_FR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_FR"; + } + + identity ETH_100GBASE_DR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 100GBASE_DR"; + } + + identity ETH_400GBASE_ZR { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GBASE_ZR"; + } + + identity ETH_400GBASE_LR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GBASE_LR4"; + } + + identity ETH_400GBASE_FR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GBASE_FR4"; + } + + identity ETH_400GBASE_LR8 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GBASE_LR8"; + } + + identity ETH_400GBASE_DR4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GBASE_DR4"; + } + + identity ETH_400GMSA_PSM4 { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: 400GMSA_PSM4"; + } + + identity ETH_UNDEFINED { + base ETHERNET_PMD_TYPE; + description "Ethernet compliance code: undefined"; + } + + identity SONET_APPLICATION_CODE { + description + "Supported SONET/SDH application codes"; + } + + identity VSR2000_3R2 { + base SONET_APPLICATION_CODE; + description + "SONET/SDH application code: VSR2000_3R2"; + } + + identity VSR2000_3R3 { + base SONET_APPLICATION_CODE; + description + "SONET/SDH application code: VSR2000_3R3"; + } + + identity VSR2000_3R5 { + base SONET_APPLICATION_CODE; + description + "SONET/SDH application code: VSR2000_3R5"; + } + + identity SONET_UNDEFINED { + base SONET_APPLICATION_CODE; + description + "SONET/SDH application code: undefined"; + } + + identity OTN_APPLICATION_CODE { + description + "Supported OTN application codes"; + } + + identity P1L1_2D1 { + base OTN_APPLICATION_CODE; + description + "OTN application code: P1L1_2D1"; + } + + identity P1S1_2D2 { + base OTN_APPLICATION_CODE; + description + "OTN application code: P1S1_2D2"; + } + + identity P1L1_2D2 { + base OTN_APPLICATION_CODE; + description + "OTN application code: P1L1_2D2"; + } + + identity OTN_UNDEFINED { + base OTN_APPLICATION_CODE; + description + "OTN application code: undefined"; + } + + identity TRIBUTARY_RATE_CLASS_TYPE { + description + "Rate of tributary signal _- identities will typically reflect + rounded bit rate."; + } + + identity TRIB_RATE_1G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1G tributary signal rate"; + } + + identity TRIB_RATE_2.5G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2.5G tributary signal rate"; + } + + identity TRIB_RATE_10G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "10G tributary signal rate"; + } + + identity TRIB_RATE_40G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "40G tributary signal rate"; + } + + identity TRIB_RATE_100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "100G tributary signal rate"; + } + + identity TRIB_RATE_150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "150G tributary signal rate"; + } + + identity TRIB_RATE_200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "200G tributary signal rate"; + } + + identity TRIB_RATE_250G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "250G tributary signal rate"; + } + + identity TRIB_RATE_300G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "300G tributary signal rate"; + } + + identity TRIB_RATE_350G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "350G tributary signal rate"; + } + + identity TRIB_RATE_400G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "400G tributary signal rate"; + } + + identity TRIB_RATE_450G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "450G tributary signal rate"; + } + + identity TRIB_RATE_500G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "500G tributary signal rate"; + } + + identity TRIB_RATE_550G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "550G tributary signal rate"; + } + + identity TRIB_RATE_600G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "600G tributary signal rate"; + } + + identity TRIB_RATE_650G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "650G tributary signal rate"; + } + + identity TRIB_RATE_700G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "700G tributary signal rate"; + } + + identity TRIB_RATE_750G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "750G tributary signal rate"; + } + + identity TRIB_RATE_800G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "800G tributary signal rate"; + } + + identity TRIB_RATE_850G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "850G tributary signal rate"; + } + + identity TRIB_RATE_900G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "900G tributary signal rate"; + } + + identity TRIB_RATE_950G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "950G tributary signal rate"; + } + + identity TRIB_RATE_1000G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1000G tributary signal rate"; + } + + identity TRIB_RATE_1050G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1050G tributary signal rate"; + } + + identity TRIB_RATE_1100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1100G tributary signal rate"; + } + + identity TRIB_RATE_1150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1150G tributary signal rate"; + } + + identity TRIB_RATE_1200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1200G tributary signal rate"; + } + + identity TRIB_RATE_1250G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1250G tributary signal rate"; + } + + identity TRIB_RATE_1300G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1300G tributary signal rate"; + } + + identity TRIB_RATE_1350G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1350G tributary signal rate"; + } + + identity TRIB_RATE_1400G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1400G tributary signal rate"; + } + + identity TRIB_RATE_1450G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1450G tributary signal rate"; + } + + identity TRIB_RATE_1500G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1500G tributary signal rate"; + } + + identity TRIB_RATE_1550G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1550G tributary signal rate"; + } + + identity TRIB_RATE_1600G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1600G tributary signal rate"; + } + + identity TRIB_RATE_1650G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1650G tributary signal rate"; + } + + identity TRIB_RATE_1700G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1700G tributary signal rate"; + } + + identity TRIB_RATE_1750G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1750G tributary signal rate"; + } + + identity TRIB_RATE_1800G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1800G tributary signal rate"; + } + + identity TRIB_RATE_1850G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1850G tributary signal rate"; + } + + identity TRIB_RATE_1900G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1900G tributary signal rate"; + } + + identity TRIB_RATE_1950G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "1950G tributary signal rate"; + } + + identity TRIB_RATE_2000G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2000G tributary signal rate"; + } + + identity TRIB_RATE_2050G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2050G tributary signal rate"; + } + + identity TRIB_RATE_2100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2100G tributary signal rate"; + } + + identity TRIB_RATE_2150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2150G tributary signal rate"; + } + + identity TRIB_RATE_2200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2200G tributary signal rate"; + } + + identity TRIB_RATE_2250G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2250G tributary signal rate"; + } + + identity TRIB_RATE_2300G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2300G tributary signal rate"; + } + + identity TRIB_RATE_2350G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2350G tributary signal rate"; + } + + identity TRIB_RATE_2400G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2400G tributary signal rate"; + } + + identity TRIB_RATE_2450G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2450G tributary signal rate"; + } + + identity TRIB_RATE_2500G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2500G tributary signal rate"; + } + + identity TRIB_RATE_2550G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2550G tributary signal rate"; + } + + identity TRIB_RATE_2600G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2600G tributary signal rate"; + } + + identity TRIB_RATE_2650G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2650G tributary signal rate"; + } + + identity TRIB_RATE_2700G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2700G tributary signal rate"; + } + + identity TRIB_RATE_2750G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2750G tributary signal rate"; + } + + identity TRIB_RATE_2800G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2800G tributary signal rate"; + } + + identity TRIB_RATE_2850G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2850G tributary signal rate"; + } + + identity TRIB_RATE_2900G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2900G tributary signal rate"; + } + + identity TRIB_RATE_2950G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "2950G tributary signal rate"; + } + + identity TRIB_RATE_3000G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3000G tributary signal rate"; + } + + identity TRIB_RATE_3050G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3050G tributary signal rate"; + } + + identity TRIB_RATE_3100G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3100G tributary signal rate"; + } + + identity TRIB_RATE_3150G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3150G tributary signal rate"; + } + + identity TRIB_RATE_3200G { + base TRIBUTARY_RATE_CLASS_TYPE; + description + "3200G tributary signal rate"; + } + + identity LOGICAL_ELEMENT_PROTOCOL_TYPE { + description + "Type of protocol framing used on the logical channel or + tributary"; + } + + identity PROT_ETHERNET { + base LOGICAL_ELEMENT_PROTOCOL_TYPE; + description + "Ethernet protocol framing"; + } + + identity PROT_OTN { + base LOGICAL_ELEMENT_PROTOCOL_TYPE; + description + "OTN protocol framing"; + } + + identity OPTICAL_CHANNEL { + base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT; + description + "Optical channels act as carriers for transport traffic + directed over a line system. They are represented as + physical components in the physical inventory model."; + } + + identity FIBER_JUMPER_TYPE { + description + "Types of fiber jumpers used for connecting device ports"; + } + + identity FIBER_JUMPER_SIMPLEX { + base FIBER_JUMPER_TYPE; + description + "Simplex fiber jumper"; + } + + identity FIBER_JUMPER_MULTI_FIBER_STRAND { + base FIBER_JUMPER_TYPE; + description + "One strand of a fiber jumper which contains multiple fibers + within it, such as an MPO based fiber jumper"; + } + + identity OPTICAL_PORT_TYPE { + description + "Type definition for optical transport port types"; + } + + identity INGRESS { + base OPTICAL_PORT_TYPE; + description + "Ingress port, corresponding to a signal entering + a line system device such as an amplifier or wavelength + router."; + } + + identity EGRESS { + base OPTICAL_PORT_TYPE; + description + "Egress port, corresponding to a signal exiting + a line system device such as an amplifier or wavelength + router."; + } + + identity ADD { + base OPTICAL_PORT_TYPE; + description + "Add port, corresponding to a signal injected + at a wavelength router."; + } + + identity DROP { + base OPTICAL_PORT_TYPE; + description + "Drop port, corresponding to a signal dropped + at a wavelength router."; + } + + identity MONITOR { + base OPTICAL_PORT_TYPE; + description + "Monitor port, corresponding to a signal used by an optical + channel monitor. This is used to represent the connection + that a channel monitor port is connected to, typically on a + line system device. This connection may be via physical cable + and faceplate ports or internal to the device"; + } + + identity TERMINAL_CLIENT { + base OPTICAL_PORT_TYPE; + description + "Client-facing port on a terminal optics device (e.g., + transponder or muxponder)."; + } + + identity TERMINAL_LINE { + base OPTICAL_PORT_TYPE; + description + "Line-facing port on a terminal optics device (e.g., + transponder or muxponder)."; + } + + identity CLIENT_MAPPING_MODE { + description + "Type definition for optical transport client mapping modes."; + } + + identity MODE_1X100G { + base CLIENT_MAPPING_MODE; + description + "1 x 100G client mapping mode."; + } + + identity MODE_1X200G { + base CLIENT_MAPPING_MODE; + description + "1 x 200G client mapping mode."; + } + + identity MODE_1X400G { + base CLIENT_MAPPING_MODE; + description + "1 x 400G client mapping mode."; + } + + identity MODE_2X100G { + base CLIENT_MAPPING_MODE; + description + "2 x 100G client mapping mode."; + } + + identity MODE_2X200G { + base CLIENT_MAPPING_MODE; + description + "2 x 200G client mapping mode."; + } + + identity MODE_3X100G { + base CLIENT_MAPPING_MODE; + description + "3 x 100G client mapping mode."; + } + + identity MODE_4X100G { + base CLIENT_MAPPING_MODE; + description + "4 x 100G client mapping mode."; + } + + identity TRANSCEIVER_MODULE_FUNCTIONAL_TYPE { + description + "Type definition for transceiver module functional types."; + } + + identity TYPE_STANDARD_OPTIC { + base TRANSCEIVER_MODULE_FUNCTIONAL_TYPE; + description + "Standard optic using a grey wavelength (i.e. 1310, 1550, etc.) + and on-off-keying (OOK) modulation."; + } + + identity TYPE_DIGITAL_COHERENT_OPTIC { + base TRANSCEIVER_MODULE_FUNCTIONAL_TYPE; + description + "Digital coherent module which transmits a phase / amplitude + modulated signal and uses a digital signal processor to receive + and decode the received signal."; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang new file mode 100644 index 000000000..afb533067 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang @@ -0,0 +1,246 @@ +submodule openconfig-platform-common { + + yang-version "1"; + + belongs-to openconfig-platform { + prefix "oc-platform"; + } + + import openconfig-platform-types { prefix oc-platform-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-types { prefix oc-types; } + + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This modules contains common groupings that are used in multiple + components within the platform module."; + + oc-ext:openconfig-version "0.24.0"; + + revision "2023-11-28" { + description + "Add model-name"; + reference "0.24.0"; + } + + revision "2023-02-13" { + description + "Refactor resource utilization threshold config into a separate grouping. + Update 'utilization resource' to 'resource utilization'."; + reference "0.23.0"; + } + + revision "2022-12-20" { + description + "Add threshold and threshold-exceeded for resource usage."; + reference "0.22.0"; + } + + revision "2022-12-19" { + description + "Update last-high-watermark timestamp documentation."; + reference "0.21.1"; + } + + revision "2022-09-26" { + description + "Add state data for base-mac-address."; + reference "0.21.0"; + } + + revision "2022-08-31" { + description + "Add new state data for component CLEI code."; + reference "0.20.0"; + } + + revision "2022-07-28" { + description + "Add grouping for component power management"; + reference "0.19.0"; + } + + revision "2022-07-11" { + description + "Add switchover ready"; + reference "0.18.0"; + } + + revision "2022-06-10" { + description + "Specify units and epoch for switchover and reboot times."; + reference "0.17.0"; + } + + revision "2022-04-21" { + description + "Add platform utilization."; + reference "0.16.0"; + } + + // extension statements + + // feature statements + + // identity statements + + // typedef statements + + // grouping statements + + grouping platform-resource-utilization-top { + description + "Top level grouping of platform resource utilization."; + + container utilization { + description + "Resource utilization of the component."; + + container resources { + description + "Enclosing container for the resources in this component."; + + list resource { + key "name"; + description + "List of resources, keyed by resource name."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the resource name."; + } + + container config { + description + "Configuration data for each resource."; + + uses platform-resource-utilization-config; + } + + container state { + config false; + description + "Operational state data for each resource."; + + uses platform-resource-utilization-config; + uses platform-resource-utilization-state; + } + } + } + } + } + + grouping resource-utilization-threshold-common { + description + "Common threshold configuration model for resource utilization."; + leaf used-threshold-upper { + type oc-types:percentage; + description + "The used percentage value (used / (used + free) * 100) that + when crossed will set utilization-threshold-exceeded to 'true'."; + } + + leaf used-threshold-upper-clear { + type oc-types:percentage; + description + "The used percentage value (used / (used + free) * 100) that when + crossed will set utilization-threshold-exceeded to 'false'."; + } + } + + grouping platform-resource-utilization-config { + description + "Configuration data for resource utilization."; + + leaf name { + type string; + description + "Resource name within the component."; + } + + uses resource-utilization-threshold-common; + } + + grouping platform-resource-utilization-state { + description + "Operational state data for resource utilization."; + + leaf used { + type uint64; + description + "Number of entries currently in use for the resource."; + } + + leaf committed { + type uint64; + description + "Number of entries currently reserved for this resource. This is only + relevant to tables which allocate a block of resource for a given + feature."; + } + + leaf free { + type uint64; + description + "Number of entries available to use."; + } + + leaf max-limit { + type uint64; + description + "Maximum number of entries available for the resource. The value + is the theoretical maximum resource utilization possible."; + } + + leaf high-watermark { + type uint64; + description + "A watermark of highest number of entries used for this resource."; + } + + leaf last-high-watermark { + type oc-types:timeticks64; + description + "The timestamp when the high-watermark was last updated. The value + is the timestamp in nanoseconds relative to the Unix Epoch + (Jan 1, 1970 00:00:00 UTC)."; + } + + leaf used-threshold-upper-exceeded { + type boolean; + description + "This value is set to true when the used percentage value + (used / (used + free) * 100) has crossed the used-threshold-upper for this + resource and false when the used percentage value has crossed the configured + used-threshold-upper-clear value for this resource."; + } + } + + grouping component-power-management { + description + "Common grouping for managing component power"; + + leaf power-admin-state { + type oc-platform-types:component-power-type; + default POWER_ENABLED; + description + "Enable or disable power to the component"; + } + } + + // data definition statements + + // augment statements + + // rpc statements + + // notification statements +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang new file mode 100644 index 000000000..effb85bb7 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang @@ -0,0 +1,327 @@ +module openconfig-platform-port { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/platform/port"; + + prefix "oc-port"; + + // import some basic types + import openconfig-platform { prefix oc-platform; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines data related to PORT components in the + openconfig-platform model"; + + oc-ext:openconfig-version "1.0.1"; + + revision "2023-03-22" { + description + "Clarify use of the interface-ref type."; + reference "1.0.1"; + } + + revision "2023-01-19" { + description + "Add clarification of the definition of a physical channel, and + example configurations."; + reference "1.0.0"; + } + + revision "2021-10-01" { + description + "Fix indentation for 'list group'"; + reference "0.4.2"; + } + + revision "2021-06-16" { + description + "Remove trailing whitespace"; + reference "0.4.1"; + } + + revision "2021-04-22" { + description + "Adding support for flexible port breakout."; + reference "0.4.0"; + } + + revision "2020-05-06" { + description + "Ensure that when statements in read-write contexts + reference only read-write leaves."; + reference "0.3.3"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.2"; + } + + revision "2018-11-07" { + description + "Fixed error in when statement path"; + reference "0.3.1"; + } + + revision "2018-01-20" { + description + "Added augmentation for interface-to-port reference"; + reference "0.3.0"; + } + + revision "2017-11-17" { + description + "Corrected augmentation path for port data"; + reference "0.2.0"; + } + + revision "2016-10-24" { + description + "Initial revision"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + // typedef statements + + // grouping statements + + grouping group-config { + description + "Configuration data for the breakout group."; + + leaf index { + type uint8; + description + "Each index specifies breakouts that are identical in + terms of speed and the number of physical channels."; + } + + leaf num-breakouts { + type uint8; + description + "Sets the number of interfaces using this breakout group."; + } + + leaf breakout-speed { + type identityref { + base oc-eth:ETHERNET_SPEED; + } + description + "Speed of interfaces in this breakout group, supported + values are defined by the ETHERNET_SPEED identity."; + } + + leaf num-physical-channels { + type uint8; + description + "Sets the number of lanes or physical channels assigned + to the interfaces in this breakout group. This leaf need + not be set if there is only one breakout group where all + the interfaces are of equal speed and have equal number + of physical channels. + + The physical channels referred to by this leaf are + electrical channels towards the transceiver."; + } + } + + grouping group-state { + description + "Operational state data for the port breakout group."; + } + + grouping port-breakout-top { + description + "Top-level grouping for port breakout data."; + + container breakout-mode { + description + "Top-level container for port breakout-mode data."; + + container groups { + description + "Top level container for breakout groups data. + + When a device has the capability to break a port into + interfaces of different speeds and different number of + physical channels, it can breakout a 400G OSFP port with + 8 physical channels (with support for 25G NRZ, 50G PAM4 + and 100G PAM4) into mixed speed interfaces. Particularly, to + break out into two 100G ports with different modulation, and a 200G + port, a user must configure 1 interface with 2 physical channels + 1 interface with 4 physical channels and 1 interface with + 2 physical channels. With this configuration the interface in + 1st breakout group would use 50G PAM4 modulation, interface + in 2nd breakout group would use 25G NRZ modulation and the + interface in 3rd breakout group would use 100G PAM4 modulation + This configuration would result in 3 entries in the breakout + groups list. The example configuration for this case is shown below: + + { + \"groups\": { + \"group\": [ + { + \"config\": { + \"breakout-speed\": \"SPEED_100GB\", + \"index\": 0, + \"num-breakouts\": 1, + \"num-physical-channels\": 2 + }, + \"index\": 0 + }, + { + \"config\": { + \"breakout-speed\": \"SPEED_100GB\", + \"index\": 1, + \"num-breakouts\": 1, + \"num-physical-channels\": 4 + }, + \"index\": 1 + }, + { + \"config\": { + \"breakout-speed\": \"SPEED_200GB\", + \"index\": 2, + \"num-breakouts\": 1, + \"num-physical-channels\": 2 + }, + \"index\": 2 + } + ] + } + } + + When a device does not have the capability to break a port + into interfaces of different speeds and different number of + physical channels, in order to breakout a 400G OSFP port with + 8 physical channels into 50G breakout ports it would use 8 interfaces + with 1 physical channel each. This would result in 1 entry in the + breakout groups list. The example configuration for this case is + shown below: + + { + \"groups\": { + \"group\": [ + { + \"config\": { + \"breakout-speed\": \"SPEED_50GB\", + \"index\": 0, + \"num-breakouts\": 8, + \"num-physical-channels\": 1 + }, + \"index\": 0 + } + ] + } + } + + Similarly, if a 400G-DR4 interface (8 electrical channels at 50Gbps) + is to be broken out into 4 100Gbps ports, the following configuration + is used: + + { + \"groups\": { + \"group\": [ + { + \"config\": { + \"breakout-speed\": \"SPEED_100GB\", + \"index\": 0, + \"num-breakouts\": 4, + \"num-physical-channels\": 2 + }, + \"index\": 0 + } + ] + } + }"; + + list group { + key "index"; + description + "List of breakout groups."; + + leaf index { + type leafref { + path "../config/index"; + } + description + "Index of the breakout group entry in the breakout groups list."; + } + + container config { + description + "Configuration data for breakout group."; + uses group-config; + } + + container state { + config false; + description + "Operational state data for breakout group."; + + uses group-config; + uses group-state; + } + } + } + } + } + + // data definition statements + + // augment statements + + augment "/oc-platform:components/oc-platform:component/" + + "oc-platform:port" { + description + "Adding port breakout data to physical platform data. This subtree + is only valid when the type of the component is PORT."; + + uses port-breakout-top; + } + + augment "/oc-if:interfaces/oc-if:interface/oc-if:state" { + description + "Adds a reference from the base interface to the corresponding + port component in the device inventory."; + + leaf hardware-port { + type leafref { + path "/oc-platform:components/oc-platform:component/" + + "oc-platform:name"; + } + description + "For non-channelized interfaces, references the hardware port + corresponding to the base interface."; + } + } + + // rpc statements + + // notification statements + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang new file mode 100644 index 000000000..d28881f9e --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang @@ -0,0 +1,541 @@ +module openconfig-platform-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/platform-types"; + + prefix "oc-platform-types"; + + import openconfig-types { prefix oc-types; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines data types (e.g., YANG identities) + to support the OpenConfig component inventory model."; + + oc-ext:openconfig-version "1.6.0"; + + revision "2023-06-27" { + description + "Add WIFI_ACCESS_POINT"; + reference "1.6.0"; + } + + revision "2022-07-28" { + description + "Add grouping for component power management"; + reference "1.5.0"; + } + + revision "2022-03-27" { + description + "Add identity for BIOS"; + reference "1.4.0"; + } + + revision "2022-02-02" { + description + "Add support for component reboot and switchover."; + reference "1.3.0"; + } + + revision "2021-07-29" { + description + "Add several avg-min-max-instant-stats groupings"; + reference "1.2.0"; + } + + revision "2021-01-18" { + description + "Add identity for software modules"; + reference "1.1.0"; + } + + revision "2019-06-03" { + description + "Add OpenConfig component operating system patch type."; + reference "1.0.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.10.1"; + } + + revision "2018-11-16" { + description + "Added FEC_MODE_TYPE and FEC_STATUS_TYPE"; + reference "0.10.0"; + } + + revision "2018-05-05" { + description + "Added min-max-time to + avg-min-max-instant-stats-precision1-celsius, + added new CONTROLLER_CARD identity"; + reference "0.9.0"; + } + + revision "2018-01-16" { + description + "Added new per-component common data; add temp alarm"; + reference "0.8.0"; + } + + revision "2017-12-14" { + description + "Added anchor containers for component data, added new + component types"; + reference "0.7.0"; + } + + revision "2017-08-16" { + description + "Added power state enumerated type"; + reference "0.6.0"; + } + + revision "2016-12-22" { + description + "Added temperature state variable to component"; + reference "0.5.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + grouping avg-min-max-instant-stats-precision1-celsius { + description + "Common grouping for recording temperature values in + Celsius with 1 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics"; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The arithmetic mean value of the statistic over the + sampling period."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The minimum value of the statistic over the sampling + period"; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + units celsius; + description + "The maximum value of the statistic over the sampling + period"; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-volts { + description + "Common grouping for recording voltage values in + volts with 2 decimal precision. Values include the + instantaneous, average, minimum, and maximum statistics. + If supported by the device, the time interval over which + the statistics are computed, and the times at which the + minimum and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units volts; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units volts; + description + "The arithmetic mean value of the statistic over the + sampling period."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units volts; + description + "The minimum value of the statistic over the sampling + period"; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units volts; + description + "The maximum value of the statistic over the sampling + period"; + } + + uses oc-types:stat-interval-state; + uses oc-types:min-max-time; + } + + grouping component-redundant-role-switchover-reason { + description + "Common grouping for recording the reason of a component's + redundant role switchover. For example two supervisors in + a device, one as primary the other as secondary, switchover + can happen in different scenarios, e.g. user requested, + system error, priority contention, etc."; + + leaf trigger { + type component-redundant-role-switchover-reason-trigger; + description + "Records the generic triggers, e.g. user or system + initiated the switchover."; + } + + leaf details { + type string; + description + "Records detailed description of why the switchover happens. + For example, when system initiated the switchover, this leaf + can be used to record the specific reason, e.g. due to critical + errors of the routing daemon in the primary role."; + } + } + + // identity statements + identity OPENCONFIG_HARDWARE_COMPONENT { + description + "Base identity for hardware related components in a managed + device. Derived identities are partially based on contents + of the IANA Entity MIB."; + reference + "IANA Entity MIB and RFC 6933"; + } + + identity OPENCONFIG_SOFTWARE_COMPONENT { + description + "Base identity for software-related components in a managed + device"; + } + + // hardware types + identity CHASSIS { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Chassis component, typically with multiple slots / shelves"; + } + + identity BACKPLANE { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Backplane component for aggregating traffic, typically + contained in a chassis component"; + } + + identity FABRIC { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Interconnect between ingress and egress ports on the + device (e.g., a crossbar switch)."; + } + + identity POWER_SUPPLY { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Component that is supplying power to the device"; + } + + identity FAN { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Cooling fan, or could be some other heat-reduction component"; + } + + identity SENSOR { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Physical sensor, e.g., a temperature sensor in a chassis"; + } + + identity FRU { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Replaceable hardware component that does not have a more + specific defined schema."; + } + + identity LINECARD { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Linecard component, typically inserted into a chassis slot"; + } + + identity CONTROLLER_CARD { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A type of linecard whose primary role is management or control + rather than data forwarding."; + } + + identity PORT { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Physical port, e.g., for attaching pluggables and networking + cables"; + } + + identity TRANSCEIVER { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Pluggable module present in a port"; + } + + identity CPU { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "Processing unit, e.g., a management processor"; + } + + identity STORAGE { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A storage subsystem on the device (disk, SSD, etc.)"; + } + + identity INTEGRATED_CIRCUIT { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A special purpose processing unit, typically for traffic + switching/forwarding (e.g., switching ASIC, NPU, forwarding + chip, etc.)"; + } + + identity WIFI_ACCESS_POINT { + base OPENCONFIG_HARDWARE_COMPONENT; + description + "A device that attaches to a an Ethernet network and creates a wireless + local area network"; + } + + identity OPERATING_SYSTEM { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "Operating system running on a component"; + } + + identity OPERATING_SYSTEM_UPDATE { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "An operating system update - which should be a subcomponent + of the `OPERATING_SYSTEM` running on a component. An update is + defined to be a set of software changes that are atomically + installed (and uninstalled) together. Multiple updates may be + present for the Operating System. A system should not list all + installed software packages using this type -- but rather + updates that are bundled together as a single installable + item"; + } + + identity BIOS { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "Legacy BIOS or UEFI firmware interface responsible for + initializing hardware components and first stage boot loader."; + } + + identity BOOT_LOADER { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "Software layer responsible for loading and booting the + device OS or network OS."; + } + + identity SOFTWARE_MODULE { + base OPENCONFIG_SOFTWARE_COMPONENT; + description + "A base identity for software modules installed and/or + running on the device. Modules include user-space programs + and kernel modules that provide specific functionality. + A component with type SOFTWARE_MODULE should also have a + module type that indicates the specific type of software module"; + } + + identity COMPONENT_OPER_STATUS { + description + "Current operational status of a platform component"; + } + + identity ACTIVE { + base COMPONENT_OPER_STATUS; + description + "Component is enabled and active (i.e., up)"; + } + + identity INACTIVE { + base COMPONENT_OPER_STATUS; + description + "Component is enabled but inactive (i.e., down)"; + } + + identity DISABLED { + base COMPONENT_OPER_STATUS; + description + "Component is administratively disabled."; + } + + identity FEC_MODE_TYPE { + description + "Base identity for FEC operational modes."; + } + + identity FEC_ENABLED { + base FEC_MODE_TYPE; + description + "FEC is administratively enabled."; + } + + identity FEC_DISABLED { + base FEC_MODE_TYPE; + description + "FEC is administratively disabled."; + } + + identity FEC_AUTO { + base FEC_MODE_TYPE; + description + "System will determine whether to enable or disable + FEC on a transceiver."; + } + + identity FEC_STATUS_TYPE { + description + "Base identity for FEC operational statuses."; + } + + identity FEC_STATUS_LOCKED { + base FEC_STATUS_TYPE; + description + "FEC is operationally locked."; + } + + identity FEC_STATUS_UNLOCKED { + base FEC_STATUS_TYPE; + description + "FEC is operationally unlocked."; + } + + // typedef statements + typedef component-power-type { + type enumeration { + enum POWER_ENABLED { + description + "Enable power on the component"; + } + enum POWER_DISABLED { + description + "Disable power on the component"; + } + } + description + "A generic type reflecting whether a hardware component + is powered on or off"; + } + + identity COMPONENT_REBOOT_REASON { + description + "Base entity for component reboot reasons."; + } + + identity REBOOT_USER_INITIATED { + base COMPONENT_REBOOT_REASON; + description + "User initiated the reboot of the componenent."; + } + + identity REBOOT_POWER_FAILURE { + base COMPONENT_REBOOT_REASON; + description + "The component reboots due to power failure."; + } + + identity REBOOT_CRITICAL_ERROR { + base COMPONENT_REBOOT_REASON; + description + "The component reboots due to critical errors."; + } + + typedef component-redundant-role { + type enumeration { + enum PRIMARY { + description + "Component is acting the primary role."; + } + enum SECONDARY { + description + "Component is acting the secondary role."; + } + } + description + "A generic type reflecting the component's redundanty role. + For example, a device might have dual supervisors components + for redundant purpose, with one being the primary and the + other secondary."; + } + + typedef component-redundant-role-switchover-reason-trigger { + type enumeration { + enum USER_INITIATED { + description + "User initiated the switchover, e.g. via command line."; + } + enum SYSTEM_INITIATED { + description + "The system initiated the switchover, e.g. due to + critical errors in the component of the primar role."; + } + } + description + "Records how the role switchover is triggered."; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang new file mode 100644 index 000000000..bbcf931a6 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang @@ -0,0 +1,1221 @@ +module openconfig-platform { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/platform"; + + prefix "oc-platform"; + + import openconfig-platform-types { prefix oc-platform-types; } + import openconfig-extensions { prefix oc-ext; } + import openconfig-alarm-types { prefix oc-alarm-types; } + import openconfig-yang-types { prefix oc-yang; } + import openconfig-types { prefix oc-types; } + + include openconfig-platform-common; + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines a data model for representing a system + component inventory, which can include hardware or software + elements arranged in an arbitrary structure. The primary + relationship supported by the model is containment, e.g., + components containing subcomponents. + + It is expected that this model reflects every field replacable + unit on the device at a minimum (i.e., additional information + may be supplied about non-replacable components). + + Every element in the inventory is termed a 'component' with each + component expected to have a unique name and type, and optionally + a unique system-assigned identifier and FRU number. The + uniqueness is guaranteed by the system within the device. + + Components may have properties defined by the system that are + modeled as a list of key-value pairs. These may or may not be + user-configurable. The model provides a flag for the system + to optionally indicate which properties are user configurable. + + Each component also has a list of 'subcomponents' which are + references to other components. Appearance in a list of + subcomponents indicates a containment relationship as described + above. For example, a linecard component may have a list of + references to port components that reside on the linecard. + + This schema is generic to allow devices to express their own + platform-specific structure. It may be augmented by additional + component type-specific schemas that provide a common structure + for well-known component types. In these cases, the system is + expected to populate the common component schema, and may + optionally also represent the component and its properties in the + generic structure. + + The properties for each component may include dynamic values, + e.g., in the 'state' part of the schema. For example, a CPU + component may report its utilization, temperature, or other + physical properties. The intent is to capture all platform- + specific physical data in one location, including inventory + (presence or absence of a component) and state (physical + attributes or status)."; + + oc-ext:openconfig-version "0.24.0"; + + revision "2023-11-28" { + description + "Add model-name"; + reference "0.24.0"; + } + + revision "2023-02-13" { + description + "Refactor resource utilization threshold config into a separate grouping. + Update 'utilization resource' to 'resource utilization'."; + reference "0.23.0"; + } + + revision "2022-12-20" { + description + "Add threshold and threshold-exceeded for resource usage."; + reference "0.22.0"; + } + + revision "2022-12-19" { + description + "Update last-high-watermark timestamp documentation."; + reference "0.21.1"; + } + + revision "2022-09-26" { + description + "Add state data for base-mac-address."; + reference "0.21.0"; + } + + revision "2022-08-31" { + description + "Add new state data for component CLEI code."; + reference "0.20.0"; + } + + revision "2022-07-28" { + description + "Add container for controller card component"; + reference "0.19.0"; + } + + revision "2022-07-11" { + description + "Add switchover ready"; + reference "0.18.0"; + } + + revision "2022-06-10" { + description + "Specify units and epoch for switchover and reboot times."; + reference "0.17.0"; + } + + revision "2022-04-21" { + description + "Add platform utilization."; + reference "0.16.0"; + } + + revision "2022-02-02" { + description + "Add new state data for component reboot and + switchover."; + reference "0.15.0"; + } + + revision "2021-08-13" { + description + "Add container for PCIe error statistics"; + reference "0.14.0"; + } + + revision "2021-01-18" { + description + "Add container for software module component"; + reference "0.13.0"; + } + + revision "2019-04-16" { + description + "Fix bug in parent path reference"; + reference "0.12.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.12.1"; + } + + revision "2018-06-29" { + description + "Added location description for components"; + reference "0.12.0"; + } + + revision "2018-06-03" { + description + "Added parent reference, empty flag and preconfiguration + for components"; + reference "0.11.0"; + } + + revision "2018-04-20" { + description + "Added new per-component state data: mfg-date and removable"; + reference "0.10.0"; + } + + revision "2018-01-30" { + description + "Amended approach for modelling CPU - rather than having + a local CPU utilisation state variable, a component with + a CPU should create a subcomponent of type CPU to report + statistics."; + reference "0.9.0"; + } + + revision "2018-01-16" { + description + "Added new per-component common data; add temp alarm; + moved hardware-port reference to port model"; + reference "0.8.0"; + } + + revision "2017-12-14" { + description + "Added anchor containers for component data, added new + component types"; + reference "0.7.0"; + } + + revision "2017-08-16" { + description + "Added power state enumerated type"; + reference "0.6.0"; + } + + revision "2016-12-22" { + description + "Added temperature state variable to component"; + reference "0.5.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + + grouping platform-component-properties-config { + description + "System-defined configuration data for component properties"; + + leaf name { + type string; + description + "System-supplied name of the property -- this is typically + non-configurable"; + } + + leaf value { + type union { + type string; + type boolean; + type int64; + type uint64; + type decimal64 { + fraction-digits 2; + } + } + description + "Property values can take on a variety of types. Signed and + unsigned integer types may be provided in smaller sizes, + e.g., int8, uint16, etc."; + } + } + + grouping platform-component-properties-state { + description + "Operational state data for component properties"; + + leaf configurable { + type boolean; + description + "Indication whether the property is user-configurable"; + } + } + + grouping platform-component-properties-top { + description + "Top-level grouping "; + + container properties { + description + "Enclosing container "; + + list property { + key "name"; + description + "List of system properties for the component"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the property name."; + } + + container config { + description + "Configuration data for each property"; + + uses platform-component-properties-config; + } + + container state { + + config false; + + description + "Operational state data for each property"; + + uses platform-component-properties-config; + uses platform-component-properties-state; + } + } + } + } + + grouping platform-subcomponent-ref-config { + description + "Configuration data for subcomponent references"; + + leaf name { + type leafref { + path "../../../../../component/config/name"; + } + description + "Reference to the name of the subcomponent"; + } + } + + grouping platform-subcomponent-ref-state { + description + "Operational state data for subcomponent references"; + + } + + grouping platform-subcomponent-ref-top { + description + "Top-level grouping for list of subcomponent references"; + + container subcomponents { + description + "Enclosing container for subcomponent references"; + + list subcomponent { + key "name"; + description + "List of subcomponent references"; + + leaf name { + type leafref { + path "../config/name"; + } + description + "Reference to the name list key"; + } + + container config { + description + "Configuration data for the subcomponent"; + + uses platform-subcomponent-ref-config; + } + + container state { + + config false; + + description + "Operational state data for the subcomponent"; + + uses platform-subcomponent-ref-config; + uses platform-subcomponent-ref-state; + } + } + } + } + + grouping platform-component-config { + description + "Configuration data for components"; + + leaf name { + type string; + description + "Device name for the component -- this may not be a + configurable parameter on many implementations. Where + component preconfiguration is supported, for example, + the component name may be configurable."; + } + } + + grouping platform-component-state { + description + "Operational state data for device components."; + + leaf type { + type union { + type identityref { + base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT; + } + type identityref { + base oc-platform-types:OPENCONFIG_SOFTWARE_COMPONENT; + } + } + description + "Type of component as identified by the system"; + } + + leaf id { + type string; + description + "Unique identifier assigned by the system for the + component"; + } + + leaf location { + type string; + description + "System-supplied description of the location of the + component within the system. This could be a bay position, + slot number, socket location, etc. For component types that + have an explicit slot-id attribute, such as linecards, the + system should populate the more specific slot-id."; + } + + leaf description { + type string; + description + "System-supplied description of the component"; + } + + leaf mfg-name { + type string; + description + "System-supplied identifier for the manufacturer of the + component. This data is particularly useful when a + component manufacturer is different than the overall + device vendor."; + } + + leaf mfg-date { + type oc-yang:date; + description + "System-supplied representation of the component's + manufacturing date."; + } + + leaf hardware-version { + type string; + description + "For hardware components, this is the hardware revision of + the component."; + } + + leaf firmware-version { + type string; + description + "For hardware components, this is the version of associated + firmware that is running on the component, if applicable."; + } + + leaf software-version { + type string; + description + "For software components such as operating system or other + software module, this is the version of the currently + running software."; + } + + leaf serial-no { + type string; + description + "System-assigned serial number of the component."; + } + + leaf part-no { + type string; + description + "System-assigned part number for the component. This should + be present in particular if the component is also an FRU + (field replaceable unit)"; + } + + leaf model-name { + type string; + description + "A human readable string describing the model of a component. + This string is optional and should only be populated if part-no + is also populated."; + } + + leaf clei-code { + type string; + description + "Common Language Equipment Identifier (CLEI) code of the + component. This should be present in particular if the + component is also an FRU (field replaceable unit)"; + } + + leaf removable { + type boolean; + description + "If true, this component is removable or is a field + replaceable unit"; + } + + leaf oper-status { + type identityref { + base oc-platform-types:COMPONENT_OPER_STATUS; + } + description + "If applicable, this reports the current operational status + of the component."; + } + + leaf empty { + type boolean; + default false; + description + "The empty leaf may be used by the device to indicate that a + component position exists but is not populated. Using this + flag, it is possible for the management system to learn how + many positions are available (e.g., occupied vs. empty + linecard slots in a chassis)."; + } + + leaf parent { + type leafref { + path "../../../component/config/name"; + } + description + "Reference to the name of the parent component. Note that + this reference must be kept synchronized with the + corresponding subcomponent reference from the parent + component."; + } + + leaf redundant-role { + type oc-platform-types:component-redundant-role; + description + "For components that have redundant roles (e.g. two + supervisors in a device, one as primary the other as secondary), + this reports the role of the component."; + } + + container last-switchover-reason { + description + "For components that have redundant roles (e.g. two + supervisors in a device, one as primary the other as secondary), + this reports the reason of the last change of the + component's role."; + + uses oc-platform-types:component-redundant-role-switchover-reason; + } + + leaf last-switchover-time { + type oc-types:timeticks64; + units "nanoseconds"; + description + "For components that have redundant roles (e.g. two + supervisors in a device, one as primary the other as + secondary), this reports the time of the last change of + the component's role. The value is the timestamp in + nanoseconds relative to the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + + } + + leaf last-reboot-reason { + type identityref { + base oc-platform-types:COMPONENT_REBOOT_REASON; + } + description + "This reports the reason of the last reboot of the component."; + } + + leaf last-reboot-time { + type oc-types:timeticks64; + units "nanoseconds"; + description + "This reports the time of the last reboot of the component. The + value is the timestamp in nanoseconds relative to the Unix Epoch + (Jan 1, 1970 00:00:00 UTC)."; + } + + leaf switchover-ready { + type boolean; + description + "For components that have redundant roles, this reports a value + that indicates if the component is ready to support failover. + + The components with a redundant-role should reflect the overall + system's switchover status. For example, two supervisors in a + device, one as primary and the other as secondary, should both + report the same value."; + } + + leaf base-mac-address { + type oc-yang:mac-address; + description + "This is a MAC address representing the root or primary MAC + address for a component. Components such as CHASSIS and + CONTROLLER_CARD are expected to provide a base-mac-address. The + base mac-address for CHASSIS and a PRIMARY CONTROLLER_CARD may + contain the same value."; + } + + } + + grouping platform-component-temp-alarm-state { + description + "Temperature alarm data for platform components"; + + // TODO(aashaikh): consider if these leaves could be in a + // reusable grouping (not temperature-specific); threshold + // may always need to be units specific. + + leaf alarm-status { + type boolean; + description + "A value of true indicates the alarm has been raised or + asserted. The value should be false when the alarm is + cleared."; + } + + leaf alarm-threshold { + type uint32; + description + "The threshold value that was crossed for this alarm."; + } + + leaf alarm-severity { + type identityref { + base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY; + } + description + "The severity of the current alarm."; + } + } + + grouping platform-component-power-state { + description + "Power-related operational state for device components."; + + leaf allocated-power { + type uint32; + units watts; + description + "Power allocated by the system for the component."; + } + + leaf used-power { + type uint32; + units watts; + description + "Actual power used by the component."; + } + } + + grouping platform-component-temp-state { + description + "Temperature state data for device components"; + + container temperature { + description + "Temperature in degrees Celsius of the component. Values include + the instantaneous, average, minimum, and maximum statistics. If + avg/min/max statistics are not supported, the target is expected + to just supply the instant value"; + + uses oc-platform-types:avg-min-max-instant-stats-precision1-celsius; + uses platform-component-temp-alarm-state; + } + } + + grouping platform-component-memory-state { + description + "Per-component memory statistics"; + + container memory { + description + "For components that have associated memory, these values + report information about available and utilized memory."; + + leaf available { + type uint64; + units bytes; + description + "The available memory physically installed, or logically + allocated to the component."; + } + + // TODO(aashaikh): consider if this needs to be a + // min/max/avg statistic + leaf utilized { + type uint64; + units bytes; + description + "The memory currently in use by processes running on + the component, not considering reserved memory that is + not available for use."; + } + } + } + + grouping pcie-uncorrectable-errors { + description + "PCIe uncorrectable error statistics."; + + leaf total-errors { + type oc-yang:counter64; + description + "Total number of uncorrectable errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf undefined-errors { + type oc-yang:counter64; + description + "Number of undefined errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf data-link-errors { + type oc-yang:counter64; + description + "Number of data-link errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf surprise-down-errors { + type oc-yang:counter64; + description + "Number of unexpected link down errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf poisoned-tlp-errors { + type oc-yang:counter64; + description + "Number of poisoned TLP errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf flow-control-protocol-errors { + type oc-yang:counter64; + description + "Number of flow control protocol errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf completion-timeout-errors { + type oc-yang:counter64; + description + "Number of completion timeout errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf completion-abort-errors { + type oc-yang:counter64; + description + "Number of completion abort errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf unexpected-completion-errors { + type oc-yang:counter64; + description + "Number of unexpected completion errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf receiver-overflow-errors { + type oc-yang:counter64; + description + "Number of receiver overflow errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf malformed-tlp-errors { + type oc-yang:counter64; + description + "Number of malformed TLP errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf ecrc-errors { + type oc-yang:counter64; + description + "Number of ECRC errors detected by PCIe device since the system + booted, according to PCIe AER driver."; + } + + leaf unsupported-request-errors { + type oc-yang:counter64; + description + "Number of unsupported request errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf acs-violation-errors { + type oc-yang:counter64; + description + "Number of access control errors detected by PCIe device since + the system booted, according to PCIe AER driver."; + } + + leaf internal-errors { + type oc-yang:counter64; + description + "Number of internal errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf blocked-tlp-errors { + type oc-yang:counter64; + description + "Number of blocked TLP errors detected by PCIe device since + the system booted, according to PCIe AER driver."; + } + + leaf atomic-op-blocked-errors { + type oc-yang:counter64; + description + "Number of atomic operation blocked errors detected by PCIe + device since the system booted, according to PCIe AER driver."; + } + + leaf tlp-prefix-blocked-errors { + type oc-yang:counter64; + description + "Number of TLP prefix blocked errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + } + + grouping pcie-correctable-errors { + description + "PCIe correctable error statistics."; + + leaf total-errors { + type oc-yang:counter64; + description + "Total number of correctable errors detected by PCIe device + since the system booted, according to PCIe AER driver."; + } + + leaf receiver-errors { + type oc-yang:counter64; + description + "Number of receiver errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf bad-tlp-errors { + type oc-yang:counter64; + description + "Number of TLPs with bad LCRC detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf bad-dllp-errors { + type oc-yang:counter64; + description + "Number of DLLPs with bad LCRC detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf relay-rollover-errors { + type oc-yang:counter64; + description + "Number of relay rollover errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf replay-timeout-errors { + type oc-yang:counter64; + description + "Number of replay timeout errors detected by PCIe device since the + system booted, according to PCIe AER driver."; + } + + leaf advisory-non-fatal-errors { + type oc-yang:counter64; + description + "Number of advisory non fatal errors detected by PCIe device since + the system booted, according to PCIe AER driver."; + } + + leaf internal-errors { + type oc-yang:counter64; + description + "Number of internal errors detected by PCIe device since the system + booted, according to PCIe AER driver."; + } + + leaf hdr-log-overflow-errors { + type oc-yang:counter64; + description + "Number of header log overflow errors detected by PCIe device since + the system booted, according to PCIe AER driver."; + } + } + + grouping platform-component-pcie-state { + description + "Per-component PCIe error statistics"; + + container pcie { + description + "Components that are connected to the system over the Peripheral + Component Interconnect Express (PCIe), report the fatal, non-fatal + and correctable PCIe error counts."; + + container fatal-errors { + description + "The count of the fatal PCIe errors."; + uses pcie-uncorrectable-errors; + } + + container non-fatal-errors { + description + "The count of the non-fatal PCIe errors."; + uses pcie-uncorrectable-errors; + } + + container correctable-errors { + description + "The count of the correctable PCIe errors."; + uses pcie-correctable-errors; + } + } + } + + grouping platform-anchors-top { + description + "This grouping is used to add containers for components that + are common across systems, but do not have a defined schema + within the openconfig-platform module. Containers should be + added to this grouping for components that are expected to + exist in multiple systems, with corresponding modules + augmenting the config/state containers directly."; + + container chassis { + description + "Data for chassis components"; + + container config { + description + "Configuration data for chassis components"; + } + + container state { + config false; + description + "Operational state data for chassis components"; + } + + uses platform-resource-utilization-top; + } + +// TODO(aashaikh): linecard container is already defined in +// openconfig-platform-linecard; will move to this module +// in future. + /* + container linecard { + description + "Data for linecard components"; + + container config { + description + "Configuration data for linecard components"; + } + + container state { + config false; + description + "Operational state data for linecard components"; + } + } + */ + + container port { + description + "Data for physical port components"; + + container config { + description + "Configuration data for physical port components"; + } + + container state { + config false; + description + "Operational state data for physical port components"; + } + } + +// TODO(aashaikh): transceiver container is already defined in +// openconfig-platform-transceiver; will move to this module +// in future. + /* + container transceiver { + description + "Data for transceiver components"; + + container config { + description + "Configuration data for transceiver components"; + } + + container state { + config false; + description + "Operational state data for transceiver components"; + } + } + */ + + container power-supply { + description + "Data for power supply components"; + + container config { + description + "Configuration data for power supply components"; + } + + container state { + config false; + description + "Operational state data for power supply components"; + } + } + + container fan { + description + "Data for fan components"; + + container config { + description + "Configuration data for fan components"; + } + + container state { + config false; + description + "Operational state data for fan components"; + } + } + + container fabric { + description + "Data for fabric components"; + + container config { + description + "Configuration data for fabric components"; + } + + container state { + config false; + description + "Operational state data for fabric components"; + } + } + + container storage { + description + "Data for storage components"; + + container config { + description + "Configuration data for storage components"; + } + + container state { + config false; + description + "Operational state data for storage components"; + } + } + + container cpu { + description + "Data for cpu components"; + + container config { + description + "Configuration data for cpu components"; + } + + container state { + config false; + description + "Operational state data for cpu components"; + } + } + + container integrated-circuit { + description + "Data for chip components, such as ASIC, NPUs, etc."; + + container config { + description + "Configuration data for chip components"; + } + + container state { + config false; + description + "Operational state data for chip components"; + } + + uses platform-resource-utilization-top; + } + + container backplane { + description + "Data for backplane components"; + + container config { + description + "Configuration data for backplane components"; + } + + container state { + config false; + description + "Operational state data for backplane components"; + } + } + + container software-module { + description + "Data for software module components, i.e., for components + with type=SOFTWARE_MODULE"; + + container config { + description + "Configuration data for software module components"; + } + + container state { + config false; + description + "Operational state data for software module components"; + } + } + + container controller-card { + description + "Data for controller card components, i.e., for components + with type=CONTROLLER_CARD"; + + container config { + description + "Configuration data for controller card components. Note that disabling + power to the primary supervisor should be rejected, and the operator is + required to perform a switchover first."; + } + + container state { + config false; + description + "Operational state data for controller card components"; + } + } + } + + grouping platform-component-top { + description + "Top-level grouping for components in the device inventory"; + + container components { + description + "Enclosing container for the components in the system."; + + list component { + key "name"; + description + "List of components, keyed by component name."; + + leaf name { + type leafref { + path "../config/name"; + } + description + "References the component name"; + } + + container config { + description + "Configuration data for each component"; + + uses platform-component-config; + } + + container state { + + config false; + + description + "Operational state data for each component"; + + uses platform-component-config; + uses platform-component-state; + uses platform-component-temp-state; + uses platform-component-memory-state; + uses platform-component-power-state; + uses platform-component-pcie-state { + when "./type = 'oc-platform-types:STORAGE' or " + + "'oc-platform-types:INTEGRATED_CIRCUIT' or " + + "'oc-platform-types:FRU'"; + } + } + + uses platform-component-properties-top; + uses platform-subcomponent-ref-top; + uses platform-anchors-top; + } + } + } + + + // data definition statements + + uses platform-component-top; + + + // augments + + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang new file mode 100644 index 000000000..c4617b5e6 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang @@ -0,0 +1,150 @@ +module openconfig-alarm-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/alarms/types"; + + prefix "oc-alarm-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module defines operational state data related to alarms + that the device is reporting. + + This model reuses some data items defined in the draft IETF + YANG Alarm Module: + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02 + + Portions of this code were derived from the draft IETF YANG Alarm + Module. Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.2.1"; + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.2.1"; + } + + revision "2018-01-16" { + description + "Moved alarm identities into separate types module"; + reference "0.2.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // identity statements + identity OPENCONFIG_ALARM_TYPE_ID { + description + "Base identity for alarm type ID profiles"; + } + + identity AIS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines an alarm indication signal type of alarm"; + } + + identity EQPT { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines an equipment related type of alarm that is specific + to the physical hardware"; + } + + identity LOS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines a loss of signal type of alarm"; + } + + identity OTS { + base OPENCONFIG_ALARM_TYPE_ID; + description + "Defines a optical transport signal type of alarm"; + } + + identity OPENCONFIG_ALARM_SEVERITY { + description + "Base identity for alarm severity profiles. Derived + identities are based on contents of the draft + IETF YANG Alarm Module"; + reference + "IETF YANG Alarm Module: Draft - typedef severity + https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02"; + + } + + identity UNKNOWN { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that the severity level could not be determined. + This level SHOULD be avoided."; + } + + identity MINOR { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates the existence of a non-service affecting fault + condition and that corrective action should be taken in + order to prevent a more serious (for example, service + affecting) fault. Such a severity can be reported, for + example, when the detected alarm condition is not currently + degrading the capacity of the resource"; + } + + identity WARNING { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates the detection of a potential or impending service + affecting fault, before any significant effects have been felt. + Action should be taken to further diagnose (if necessary) and + correct the problem in order to prevent it from becoming a more + serious service affecting fault."; + } + + identity MAJOR { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that a service affecting condition has developed + and an urgent corrective action is required. Such a severity + can be reported, for example, when there is a severe + degradation in the capability of the resource and its full + capability must be restored."; + } + + identity CRITICAL { + base OPENCONFIG_ALARM_SEVERITY; + description + "Indicates that a service affecting condition has occurred + and an immediate corrective action is required. Such a + severity can be reported, for example, when a resource becomes + totally out of service and its capability must be restored."; + } + +} \ No newline at end of file diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang new file mode 100644 index 000000000..ff74c4287 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang @@ -0,0 +1,485 @@ +module openconfig-inet-types { + + yang-version "1"; + namespace "http://openconfig.net/yang/types/inet"; + prefix "oc-inet"; + + import openconfig-extensions { prefix "oc-ext"; } + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module contains a set of Internet address related + types for use in OpenConfig modules. + + Portions of this code were derived from IETF RFC 6021. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.7.0"; + + revision "2024-01-05" { + description + "Change ipv6-address-zoned typedef to conform to W3C standard + regex pattern."; + reference "0.7.0"; + } + + revision "2023-02-06" { + description + "Add ipv6-link-local and ipv6-address-type"; + reference "0.6.0"; + } + + revision "2021-08-17" { + description + "Add ip-address-zoned typedef as a union between ipv4-address-zoned + and ipv6-address-zoned types."; + reference "0.5.0"; + } + + revision "2021-07-14" { + description + "Use auto-generated regex for ipv4 pattern statements: + - ipv4-address + - ipv4-address-zoned + - ipv4-prefix"; + reference "0.4.1"; + } + + revision "2021-01-07" { + description + "Remove module extension oc-ext:regexp-posix by making pattern regexes + conform to RFC7950. + + Types impacted: + - ipv4-address + - ipv4-address-zoned + - ipv6-address + - domain-name"; + reference "0.4.0"; + } + + revision "2020-10-12" { + description + "Fix anchors for domain-name pattern."; + reference "0.3.5"; + } + + revision "2020-06-30" { + description + "Add OpenConfig POSIX pattern extensions and add anchors for domain-name + pattern."; + reference "0.3.4"; + } + + revision "2019-04-25" { + description + "Fix regex bug for ipv6-prefix type"; + reference "0.3.3"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.3.2"; + } + + revision 2017-08-24 { + description + "Minor formatting fixes."; + reference "0.3.1"; + } + + revision 2017-07-06 { + description + "Add domain-name and host typedefs"; + reference "0.3.0"; + } + + revision 2017-04-03 { + description + "Add ip-version typedef."; + reference "0.2.0"; + } + + revision 2017-04-03 { + description + "Update copyright notice."; + reference "0.1.1"; + } + + revision 2017-01-26 { + description + "Initial module for inet types"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // IPv4 and IPv6 types. + + typedef ipv4-address { + type string { + pattern + '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'; + oc-ext:posix-pattern + '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$'; + } + description + "An IPv4 address in dotted quad notation using the default + zone."; + } + + typedef ipv4-address-zoned { + type string { + pattern + '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+)'; + oc-ext:posix-pattern + '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+))$'; + } + description + "An IPv4 address in dotted quad notation. This type allows + specification of a zone index to disambiguate identical + address values. For link-local addresses, the index is + typically the interface index or interface name."; + } + + typedef ipv6-address { + type string { + pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')'; + oc-ext:posix-pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')$'; + } + description + "An IPv6 address represented as either a full address; shortened + or mixed-shortened formats, using the default zone."; + } + + typedef ipv6-address-zoned { + type string { + pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')(%[a-zA-Z0-9_]+)'; + oc-ext:posix-pattern + // Must support compression through different lengths + // therefore this regexp is complex. + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')(%[a-zA-Z0-9_]+)$'; + } + description + "An IPv6 address represented as either a full address; shortened + or mixed-shortened formats. This type allows specification of + a zone index to disambiguate identical address values. For + link-local addresses, the index is typically the interface + index or interface name."; + } + + typedef ipv4-prefix { + type string { + pattern + '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|' + + '3[0-2])'; + oc-ext:posix-pattern + '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|' + + '3[0-2]))$'; + } + description + "An IPv4 prefix represented in dotted quad notation followed by + a slash and a CIDR mask (0 <= mask <= 32)."; + } + + typedef ipv6-prefix { + type string { + pattern + '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'; + oc-ext:posix-pattern + '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,7}:|' + + '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|' + + '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' + + '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' + + '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' + + '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' + + '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|' + + ':((:[0-9a-fA-F]{1,4}){1,7}|:)' + + ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$'; + } + description + "An IPv6 prefix represented in full, shortened, or mixed + shortened format followed by a slash and CIDR mask + (0 <= mask <= 128)."; + } + + typedef ip-address { + type union { + type ipv4-address; + type ipv6-address; + } + description + "An IPv4 or IPv6 address with no prefix specified."; + } + + typedef ip-address-zoned { + type union { + type ipv4-address-zoned; + type ipv6-address-zoned; + } + description + "An IPv4 or IPv6 address with no prefix specified and an optional + zone index."; + } + + typedef ip-prefix { + type union { + type ipv4-prefix; + type ipv6-prefix; + } + description + "An IPv4 or IPv6 prefix."; + } + + typedef ip-version { + type enumeration { + enum UNKNOWN { + value 0; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum IPV4 { + value 4; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum IPV6 { + value 6; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + Note that integer representation of the enumerated values + are not specified, and are not required to follow the + InetVersion textual convention in SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef ipv6-address-type { + type enumeration { + enum GLOBAL_UNICAST { + description + "The IPv6 address is a global unicast address type and must be in + the format defined in RFC 4291 section 2.4."; + } + enum LINK_LOCAL_UNICAST { + description + "The IPv6 address is a Link-Local unicast address type and must be + in the format defined in RFC 4291 section 2.4."; + } + } + description + "The value represents the type of IPv6 address"; + reference + "RFC 4291: IP Version 6 Addressing Architecture + section 2.5"; + } + + typedef domain-name { + type string { + length "1..253"; + pattern + '(((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.)'; + oc-ext:posix-pattern + '^(((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.)$'; + } + description + "The domain-name type represents a DNS domain name. + Fully quallified left to the models which utilize this type. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be encoded in punycode as described in RFC + 3492"; + } + + typedef host { + type union { + type ip-address; + type domain-name; + } + description + "The host type represents either an unzoned IP address or a DNS + domain name."; + } + + typedef as-number { + type uint32; + description + "A numeric identifier for an autonomous system (AS). An AS is a + single domain, under common administrative control, which forms + a unit of routing policy. Autonomous systems can be assigned a + 2-byte identifier, or a 4-byte identifier which may have public + or private scope. Private ASNs are assigned from dedicated + ranges. Public ASNs are assigned from ranges allocated by IANA + to the regional internet registries (RIRs)."; + reference + "RFC 1930 Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271 A Border Gateway Protocol 4 (BGP-4)"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "A differentiated services code point (DSCP) marking within the + IP header."; + reference + "RFC 2474 Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The IPv6 flow-label is a 20-bit value within the IPv6 header + which is optionally used by the source of the IPv6 packet to + label sets of packets for which special handling may be + required."; + reference + "RFC 2460 Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16; + description + "A 16-bit port number used by a transport protocol such as TCP + or UDP."; + reference + "RFC 768 User Datagram Protocol + RFC 793 Transmission Control Protocol"; + } + + typedef uri { + type string; + description + "An ASCII-encoded Uniform Resource Identifier (URI) as defined + in RFC 3986."; + reference + "RFC 3986 Uniform Resource Identifier (URI): Generic Syntax"; + } + + typedef url { + type string; + description + "An ASCII-encoded Uniform Resource Locator (URL) as defined + in RFC 3986, section 1.1.3"; + reference + "RFC 3986, paragraph 1.1.3"; + } + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang new file mode 100644 index 000000000..a146b9b76 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang @@ -0,0 +1,485 @@ +module openconfig-types { + yang-version "1"; + + namespace "http://openconfig.net/yang/openconfig-types"; + + prefix "oc-types"; + + // import statements + import openconfig-extensions { prefix oc-ext; } + + // meta + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module contains a set of general type definitions that + are used across OpenConfig models. It can be imported by modules + that make use of these types."; + + oc-ext:openconfig-version "1.0.0"; + + revision "2024-01-31" { + description + "Add posix-eregexp type and promote model to version 1.0.0."; + reference "1.0.0"; + } + + revision "2019-04-16" { + description + "Clarify definition of timeticks64."; + reference "0.6.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.5.1"; + } + + revision "2018-05-05" { + description + "Add grouping of min-max-time and + included them to all stats with min/max/avg"; + reference "0.5.0"; + } + + revision "2018-01-16" { + description + "Add interval to min/max/avg stats; add percentage stat"; + reference "0.4.0"; + } + + revision "2017-08-16" { + description + "Apply fix for ieetfloat32 length parameter"; + reference "0.3.3"; + } + + revision "2017-01-13" { + description + "Add ADDRESS_FAMILY identity"; + reference "0.3.2"; + } + + revision "2016-11-14" { + description + "Correct length of ieeefloat32"; + reference "0.3.1"; + } + + revision "2016-11-11" { + description + "Additional types - ieeefloat32 and routing-password"; + reference "0.3.0"; + } + + revision "2016-05-31" { + description + "OpenConfig public release"; + reference "0.2.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + typedef percentage { + type uint8 { + range "0..100"; + } + description + "Integer indicating a percentage value"; + } + + typedef std-regexp { + type string; + description + "This type definition is a placeholder for a standard + definition of a regular expression that can be utilised in + OpenConfig models. Further discussion is required to + consider the type of regular expressions that are to be + supported. An initial proposal is POSIX compatible."; + } + + typedef posix-eregexp { + type string; + description + "This is a string which represents an extended POSIX + regular expression."; + reference "IEEE Std 1003.1-2017"; + } + + typedef timeticks64 { + type uint64; + units "nanoseconds"; + description + "The timeticks64 represents the time, modulo 2^64 in + nanoseconds between two epochs. The leaf using this + type must define the epochs that tests are relative to."; + } + + typedef ieeefloat32 { + type binary { + length "4"; + } + description + "An IEEE 32-bit floating point number. The format of this number + is of the form: + 1-bit sign + 8-bit exponent + 23-bit fraction + The floating point value is calculated using: + (-1)**S * 2**(Exponent-127) * (1+Fraction)"; + } + + typedef routing-password { + type string; + description + "This type is indicative of a password that is used within + a routing protocol which can be returned in plain text to the + NMS by the local system. Such passwords are typically stored + as encrypted strings. Since the encryption used is generally + well known, it is possible to extract the original value from + the string - and hence this format is not considered secure. + Leaves specified with this type should not be modified by + the system, and should be returned to the end-user in plain + text. This type exists to differentiate passwords, which + may be sensitive, from other string leaves. It could, for + example, be used by the NMS to censor this data when + viewed by particular users."; + } + + typedef stat-interval { + type uint64; + units nanoseconds; + description + "A time interval over which a set of statistics is computed. + A common usage is to report the interval over which + avg/min/max stats are computed and reported."; + } + + grouping stat-interval-state { + description + "Reusable leaf definition for stats computation interval"; + + leaf interval { + type oc-types:stat-interval; + description + "If supported by the system, this reports the time interval + over which the min/max/average statistics are computed by + the system."; + } + } + + grouping min-max-time { + description + "Common grouping for recording the absolute time at which + the minimum and maximum values occurred in the statistics"; + + leaf min-time { + type oc-types:timeticks64; + description + "The absolute time at which the minimum value occurred. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + } + + leaf max-time { + type oc-types:timeticks64; + description + "The absolute time at which the maximum value occurred. + The value is the timestamp in nanoseconds relative to + the Unix Epoch (Jan 1, 1970 00:00:00 UTC)."; + } + } + + grouping avg-min-max-stats-precision1 { + description + "Common nodes for recording average, minimum, and + maximum values for a statistic. These values all have + fraction-digits set to 1. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed is also reported."; + + leaf avg { + type decimal64 { + fraction-digits 1; + } + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 1; + } + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 1; + } + description + "The maximum value of the statitic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision1 { + description + "Common grouping for recording an instantaneous statistic value + in addition to avg-min-max stats"; + + leaf instant { + type decimal64 { + fraction-digits 1; + } + description + "The instantaneous value of the statistic."; + } + + uses avg-min-max-stats-precision1; + } + + grouping avg-min-max-instant-stats-precision2-dB { + description + "Common grouping for recording dB values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The minimum value of the statistic over the time interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units dB; + description + "The maximum value of the statistic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-dBm { + description + "Common grouping for recording dBm values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units dBm; + description + "The maximum value of the statistic over the time interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-precision2-mA { + description + "Common grouping for recording mA values with 2 decimal + precision. Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The instantaneous value of the statistic."; + } + + leaf avg { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The arithmetic mean value of the statistic over the + time interval."; + } + + leaf min { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The minimum value of the statistic over the time + interval."; + } + + leaf max { + type decimal64 { + fraction-digits 2; + } + units mA; + description + "The maximum value of the statistic over the time + interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + grouping avg-min-max-instant-stats-pct { + description + "Common grouping for percentage statistics. + Values include the instantaneous, average, + minimum, and maximum statistics. Statistics are computed + and reported based on a moving time interval (e.g., the last + 30s). If supported by the device, the time interval over which + the statistics are computed, and the times at which the minimum + and maximum values occurred, are also reported."; + + leaf instant { + type oc-types:percentage; + description + "The instantaneous percentage value."; + } + + leaf avg { + type oc-types:percentage; + description + "The arithmetic mean value of the percentage measure of the + statistic over the time interval."; + } + + leaf min { + type oc-types:percentage; + description + "The minimum value of the percentage measure of the + statistic over the time interval."; + } + + leaf max { + type oc-types:percentage; + description + "The maximum value of the percentage measure of the + statistic over the time interval."; + } + + uses stat-interval-state; + uses min-max-time; + } + + identity ADDRESS_FAMILY { + description + "A base identity for all address families"; + } + + identity IPV4 { + base ADDRESS_FAMILY; + description + "The IPv4 address family"; + } + + identity IPV6 { + base ADDRESS_FAMILY; + description + "The IPv6 address family"; + } + + identity MPLS { + base ADDRESS_FAMILY; + description + "The MPLS address family"; + } + + identity L2_ETHERNET { + base ADDRESS_FAMILY; + description + "The 802.3 Ethernet address family"; + } + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang new file mode 100644 index 000000000..c978cd049 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang @@ -0,0 +1,230 @@ +module openconfig-yang-types { + + yang-version "1"; + namespace "http://openconfig.net/yang/types/yang"; + prefix "oc-yang"; + + import openconfig-extensions { prefix "oc-ext"; } + + organization + "OpenConfig working group"; + + contact + "OpenConfig working group + www.openconfig.net"; + + description + "This module contains a set of extension types to the + YANG builtin types that are used across multiple + OpenConfig models. + + Portions of this code were derived from IETF RFC 6021. + Please reproduce this note if possible. + + IETF code is subject to the following copyright and license: + Copyright (c) IETF Trust and the persons identified as authors of + the code. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in + Section 4.c of the IETF Trust's Legal Provisions Relating + to IETF Documents (http://trustee.ietf.org/license-info)."; + + oc-ext:openconfig-version "0.3.1"; + + revision "2021-07-14" { + description + "Use auto-generated regex for certain pattern statements: + - dotted-quad + - date-and-time + - date + + For date-and-time, allow lowercase z and t in the pattern."; + reference "0.3.1"; + } + + revision "2021-03-02" { + description + "Fix date-and-time and date's pattern statement, and remove the + regexp-posix extension, which makes pattern statements conform to the + YANG standard."; + reference "0.3.0"; + } + + revision "2020-06-30" { + description + "Add OpenConfig POSIX pattern extensions."; + reference "0.2.2"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "0.2.1"; + } + + revision 2018-04-24 { + description + "Add date typedef"; + reference "0.2.0"; + } + + revision 2017-07-30 { + description + "Fixed unprintable character"; + reference "0.1.2"; + } + + revision 2017-04-03 { + description + "Update copyright notice."; + reference "0.1.1"; + } + + revision 2017-01-26 { + description + "Initial module for inet types"; + reference "0.1.0"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + typedef dotted-quad { + type string { + pattern + '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'; + oc-ext:posix-pattern + '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|' + + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$'; + } + description + "An unsigned 32-bit integer expressed as a dotted quad. The + format is four octets written as decimal numbers separated + with a period character."; + } + + typedef hex-string { + type string { + pattern '[0-9a-fA-F]*'; + oc-ext:posix-pattern '^[0-9a-fA-F]*$'; + } + description + "A string consisting of a hexadecimal characters."; + } + + typedef counter32 { + type uint32; + description + + "A 32-bit counter. A counter value is a monotonically increasing + value which is used to express a count of a number of + occurrences of a particular event or entity. When the counter + reaches its maximum value, in this case 2^32-1, it wraps to 0. + + Discontinuities in the counter are generally triggered only when + the counter is reset to zero."; + } + + typedef counter64 { + type uint64; + description + "A 64-bit counter. A counter value is a monotonically increasing + value which is used to express a count of a number of + occurrences of a particular event or entity. When a counter64 + reaches its maximum value, 2^64-1, it loops to zero. + Discontinuities in a counter are generally triggered only when + the counter is reset to zero, through operator or system + intervention."; + } + + typedef date-and-time { + type string { + pattern + '[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|' + + '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|' + + '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|' + + '[1-5][0-9])))'; + oc-ext:posix-pattern + '^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|' + + '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|' + + '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|' + + '[1-5][0-9]))))$'; + } + description + "A date and time, expressed in the format described in RFC3339. + That is to say: + + YYYY-MM-DDTHH:MM:SSZ+-hh:mm + + where YYYY is the year, MM is the month expressed as a two-digit + month (zero padding if required), DD is the day of the month, + expressed as a two digit value. T is the literal character 'T', + HH is the hour of the day expressed as a two digit number, using + the 24-hour clock, MM is the minute of the hour expressed as a + two digit number. Z is the literal character 'Z', followed by a + timezone offset expressed in hours (hh) and minutes (mm), both + expressed as two digit numbers. The time offset is specified as + a positive or negative offset to UTC using the '+' or '-' + character preceding the offset. + + Optionally, fractional seconds can be expressed after the minute + of the hour as a decimal number of unspecified precision + reflecting fractions of a second."; + reference + "RFC3339 - Date and Time on the Internet: Timestamps"; + } + + typedef date { + type string { + pattern + '[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])'; + oc-ext:posix-pattern + '^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01]))$'; + } + description + "A full UTC date, expressed in the format described in RFC3339. + That is to say: + + YYYY-MM-DD + + where YYYY is the year, MM is the month expressed as a two-digit + month (zero padding if required), DD is the day of the month, + expressed as a two digit value."; + + reference + "RFC3339 - Date and Time on the Internet: full-date"; + } + + typedef gauge64 { + type uint64; + description + "A gauge value may increase or decrease - and reflects a value + at a particular point in time. If the value of the variable + being modeled using the gauge exceeds its maximum - 2^64-1 in + this case - the gauge is set to its maximum value."; + } + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + oc-ext:posix-pattern '^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?$'; + } + description + "A physical layer address, expressed as a series of pairs of + hexadecimal digits."; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + oc-ext:posix-pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$'; + } + description + "An IEEE 802 MAC address"; + } +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang new file mode 100644 index 000000000..09af39887 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang @@ -0,0 +1,283 @@ +module openconfig-vlan-types { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/vlan-types"; + + prefix "oc-vlan-types"; + + // import some basic types + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module defines configuration and state variables for VLANs, + in addition to VLAN parameters associated with interfaces"; + + oc-ext:openconfig-version "3.2.0"; + + revision "2022-05-24" { + description + "Remove module extension oc-ext:regexp-posix by making pattern regexes + conform to RFC6020/7950. + + Types impacted: + - vlan-range + - qinq-id + - qinq-id-range"; + reference "3.2.0"; + } + + revision "2020-06-30" { + description + "Add OpenConfig POSIX pattern extensions."; + reference "3.1.1"; + } + + revision "2019-01-31" { + description + "Add TPID_ANY wildcard match and a QinQ list type."; + reference "3.1.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "3.0.1"; + } + + revision "2018-02-14" { + description + "Fix bug with name of 802.1ad identity."; + reference "3.0.0"; + } + + revision "2017-07-14" { + description + "Move top-level vlan data to network-instance; Update + identities to comply to style guide; fixed pattern + quoting; corrected trunk vlan types; added TPID config to + base interface."; + reference "2.0.0"; + } + + revision "2016-05-26" { + description + "OpenConfig public release"; + reference "1.0.2"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // extension statements + + // feature statements + + // identity statements + + identity TPID_TYPES { + description + "Base identity for TPID values that can be matched or that override + the VLAN ethertype value"; + } + + identity TPID_0X8100 { + base TPID_TYPES; + description + "Default TPID value for 802.1q single-tagged VLANs."; + } + + identity TPID_0X88A8 { + base TPID_TYPES; + description + "TPID value for 802.1ad provider bridging, QinQ or + stacked VLANs."; + } + + identity TPID_0X9100 { + base TPID_TYPES; + description + "Alternate TPID value."; + } + + identity TPID_0X9200 { + base TPID_TYPES; + description + "Alternate TPID value."; + } + + identity TPID_ANY { + base TPID_TYPES; + description + "A wildcard that matches any of the generally used TPID values + for singly- or multiply-tagged VLANs. Equivalent to matching + any of TPID_0X8100, TPID_0X88A8, TPID_0X9100 and TPID_0x9200. + This value is only applicable where the TPID of a packet is + being matched."; + } + + // typedef statements + + // TODO: typedefs should be defined in a vlan-types.yang file. + typedef vlan-id { + type uint16 { + range 1..4094; + } + description + "Type definition representing a single-tagged VLAN"; + } + + typedef vlan-range { + type string { + // range specified as [lower]..[upper] + pattern '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|' + + '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' + + '[1-9])'; + oc-ext:posix-pattern '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|' + + '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' + + '[1-9])$'; + } + description + "Type definition representing a range of single-tagged + VLANs. A range is specified as x..y where x and y are + valid VLAN IDs (1 <= vlan-id <= 4094). The range is + assumed to be inclusive, such that any VLAN-ID matching + x <= VLAN-ID <= y falls within the range."; + } + + typedef qinq-id { + type string { + pattern + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)'; + oc-ext:posix-pattern + '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)$'; + } + description + "Type definition representing a single double-tagged/QinQ VLAN + identifier. The format of a QinQ VLAN-ID is x.y where X is the + 'outer' VLAN identifier, and y is the 'inner' VLAN identifier. + Both x and y must be valid VLAN IDs (1 <= vlan-id <= 4094) + with the exception that y may be equal to a wildcard (*). In + cases where y is set to the wildcard, this represents all inner + VLAN identifiers where the outer VLAN identifier is equal to + x."; + } + + typedef qinq-id-range { + type union { + type string { + // match cases where the range is specified as x..y.z + pattern + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)'; + oc-ext:posix-pattern + '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.' + + '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])|\*)$'; + } + type string { + // match cases where the range is specified as x.y..z + pattern + '(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9]))\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])'; + oc-ext:posix-pattern + '^(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9]))\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])\.\.' + + '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|' + + '[1-9][0-9]{1,2}|[1-9])$'; + } + } + description + "A type definition representing a range of double-tagged/QinQ + VLAN identifiers. The format of a QinQ VLAN-ID range can be + specified in two formats. Where the range is outer VLAN IDs + the range is specified as x..y.z. In this case outer VLAN + identifiers meeting the criteria x <= outer-vlan-id <= y are + accepted if and only if the inner VLAN-ID is equal to y - or + any inner-tag if the wildcard is specified. Alternatively the + ange can be specified as x.y..z. In this case only VLANs with an + outer-vlan-id qual to x are accepted (x may again be the + wildcard). Inner VLANs are accepted if they meet the inequality + y <= inner-vlan-id <= z."; + } + + typedef vlan-mode-type { + type enumeration { + enum ACCESS { + description "Access mode VLAN interface (No 802.1q header)"; + } + enum TRUNK { + description "Trunk mode VLAN interface"; + } + } + description + "VLAN interface mode (trunk or access)"; + } + + typedef vlan-ref { + type union { + type vlan-id; + type string; + // TODO: string should be changed to leafref to reference + // an existing VLAN. this is not allowed in YANG 1.0 but + // is expected to be in YANG 1.1. + // type leafref { + // path "vlan:vlans/vlan:vlan/vlan:config/vlan:name"; + // } + } + description + "Reference to a VLAN by name or id"; + } + + typedef vlan-stack-action { + type enumeration { + enum PUSH { + description + "Push a VLAN onto the VLAN stack."; + } + enum POP { + description + "Pop a VLAN from the VLAN stack."; + } + enum SWAP { + description + "Swap the VLAN at the top of the VLAN stack."; + } + // TODO: add push-push, pop-pop, push-swap etc + } + description + "Operations that can be performed on a VLAN stack."; + } + + +} diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang new file mode 100644 index 000000000..905d48150 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang @@ -0,0 +1,1001 @@ +module openconfig-vlan { + + yang-version "1"; + + // namespace + namespace "http://openconfig.net/yang/vlan"; + + prefix "oc-vlan"; + + // import some basic types + import openconfig-vlan-types { prefix oc-vlan-types; } + import openconfig-interfaces { prefix oc-if; } + import openconfig-if-ethernet { prefix oc-eth; } + import openconfig-if-aggregate { prefix oc-lag; } + import iana-if-type { prefix ianaift; } + import openconfig-extensions { prefix oc-ext; } + + // meta + organization "OpenConfig working group"; + + contact + "OpenConfig working group + netopenconfig@googlegroups.com"; + + description + "This module defines configuration and state variables for VLANs, + in addition to VLAN parameters associated with interfaces"; + + oc-ext:openconfig-version "3.2.2"; + + revision "2023-02-07" { + description + "Remove prefix from enums in when statements"; + reference "3.2.2"; + } + + revision "2021-07-28" { + description + "Add prefix to qualify when statements"; + reference "3.2.1"; + } + + revision "2019-04-16" { + description + "Update import prefix for iana-if-type module"; + reference "3.2.0"; + } + + revision "2019-01-31" { + description + "Revise QinQ matching and add input/output VLAN stack operations."; + reference "3.1.0"; + } + + revision "2018-11-21" { + description + "Add OpenConfig module metadata extensions."; + reference "3.0.2"; + } + + revision "2018-06-05" { + description + "Fix bugs in when statements."; + reference "3.0.1"; + } + + revision "2018-02-14" { + description + "Fix bug with name of 802.1ad identity."; + reference "3.0.0"; + } + + revision "2017-07-14" { + description + "Move top-level vlan data to network-instance; Update + identities to comply to style guide; fixed pattern + quoting; corrected trunk vlan types; added TPID config to + base interface."; + reference "2.0.0"; + } + + revision "2016-05-26" { + description + "OpenConfig public release"; + reference "1.0.2"; + } + + // OpenConfig specific extensions for module metadata. + oc-ext:regexp-posix; + oc-ext:catalog-organization "openconfig"; + oc-ext:origin "openconfig"; + + // grouping statements + + grouping vlan-config { + description "VLAN configuration container."; + + leaf vlan-id { + type oc-vlan-types:vlan-id; + description "Interface VLAN id."; + } + + leaf name { + type string; + description "Interface VLAN name."; + } + + leaf status { + type enumeration { + enum ACTIVE { + description "VLAN is active"; + } + enum SUSPENDED { + description "VLAN is inactive / suspended"; + } + } + default ACTIVE; + description "Admin state of the VLAN"; + } + + } + + grouping vlan-state { + description "State variables for VLANs"; + + // placeholder + + } + + grouping vlan-tpid-config { + description + "TPID configuration for dot1q-enabled interfaces"; + + leaf tpid { + type identityref { + base oc-vlan-types:TPID_TYPES; + } + default oc-vlan-types:TPID_0X8100; + description + "Optionally set the tag protocol identifier field (TPID) that + is accepted on the VLAN"; + } + } + + grouping vlan-tpid-state { + description + "TPID opstate for dot1q-enabled interfaces"; + + // placeholder + + } + + grouping vlan-members-state { + description + "List of interfaces / subinterfaces belonging to the VLAN."; + + container members { + description + "Enclosing container for list of member interfaces"; + + list member { + config false; + description + "List of references to interfaces / subinterfaces + associated with the VLAN."; + + uses oc-if:base-interface-ref-state; + } + } + } + + grouping vlan-switched-config { + description + "VLAN related configuration that is part of the physical + Ethernet interface."; + + leaf interface-mode { + type oc-vlan-types:vlan-mode-type; + description + "Set the interface to access or trunk mode for + VLANs"; + } + + leaf native-vlan { + when "../interface-mode = 'TRUNK'" { + description + "Native VLAN is valid for trunk mode interfaces"; + } + type oc-vlan-types:vlan-id; + description + "Set the native VLAN id for untagged frames arriving on + a trunk interface. Tagged frames sent on an interface + configured with a native VLAN should have their tags + stripped prior to transmission. This configuration is only + valid on a trunk interface."; + } + + leaf access-vlan { + when "../interface-mode = 'ACCESS'" { + description + "Access VLAN assigned to the interfaces"; + } + type oc-vlan-types:vlan-id; + description + "Assign the access vlan to the access port."; + } + + leaf-list trunk-vlans { + when "../interface-mode = 'TRUNK'" { + description + "Allowed VLANs may be specified for trunk mode + interfaces."; + } + type union { + type oc-vlan-types:vlan-id; + type oc-vlan-types:vlan-range; + } + description + "Specify VLANs, or ranges thereof, that the interface may + carry when in trunk mode. If not specified, all VLANs are + allowed on the interface. Ranges are specified in the form + x..y, where x 0: continue + chains_to_remove.add(chain_name) + for chain_name in chains_to_remove: + table.chains.pop(chain_name) + if len(nft.tables) > 0: continue + tables_to_remove.add(table_key) + for table_key in tables_to_remove: + nft.tables.pop(table_key) + return nft.to_openconfig(), 200 + + def delete(self, name : str): + nft = NFTables() + nft.load(FamilyEnum.IPV4, TableEnum.FILTER) + tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set() + for table_key, table in nft.tables.items(): + chains_to_remove : Set[str] = set() + for chain_name, chain in table.chains.items(): + for rule in reversed(chain.rules): + if rule.comment == name: continue + chain.rules.remove(rule) # not a rule of interest + if len(chain.rules) > 0: continue + chains_to_remove.add(chain_name) + for chain_name in chains_to_remove: + table.chains.pop(chain_name) + if len(nft.tables) > 0: continue + tables_to_remove.add(table_key) + for table_key in tables_to_remove: + nft.tables.pop(table_key) + nft.execute(removal=True, verbose=True) + return {}, 204 + + +def register_restconf_openconfig_acls(api : Api): + api.add_resource(ACLs, BASE_URL_ROOT) + api.add_resource(ACL, BASE_URL_ITEM) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py new file mode 100644 index 000000000..a00f6d54e --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py @@ -0,0 +1,40 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import netifaces +from flask_restful import Api, Resource + +BASE_URL = '/restconf/data/openconfig-platform:components' + +class Components(Resource): + def get(self): + # Build components list from interface names, reporting only PORT type + comps = list() + if_names = netifaces.interfaces() + for if_name in if_names: + comp = { + 'name': if_name, + 'config': {'name': if_name}, + 'state': { + 'name': if_name, + 'type': 'openconfig-platform-types:PORT', + 'empty': False + }, + } + comps.append(comp) + return {'openconfig-platform:components': {'component': comps}}, 200 + +def register_restconf_openconfig_components(api : Api): + api.add_resource(Components, BASE_URL) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py b/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py new file mode 100644 index 000000000..1ef52084b --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py @@ -0,0 +1,25 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from flask_restful import Api, Resource + +BASE_URL = '/.well-known/host-meta' + +class HostMeta(Resource): + def get(self): + return {'links': [{'rel': 'restconf', 'href': '/restconf/data'}]}, 200 + +def register_host_meta(api : Api): + api.add_resource(HostMeta, BASE_URL) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py new file mode 100644 index 000000000..6a33f70b9 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py @@ -0,0 +1,88 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import copy, ipaddress, netifaces +from flask_restful import Api, Resource + +BASE_URL = '/restconf/data/openconfig-interfaces:interfaces' + +class Interfaces(Resource): + def get(self): + if_list = list() + for if_name in netifaces.interfaces(): + if if_name.startswith('lo'): + if_type = 'iana-if-type:softwareLoopback' + else: + if_type = 'iana-if-type:ethernetCsmacd' + + if_config = {'name': if_name, 'type': if_type, 'enabled': True} + if_state = copy.deepcopy(if_config) + if_state.update({'admin-status': 'UP', 'oper-status': 'UP'}) + if_data = {'name': if_name, 'config': if_config, 'state': if_state} + + sif_index = 1 + sif_config = {'index': sif_index, 'enabled': True} + sif_state = copy.deepcopy(sif_config) + sif_state.update({'admin-status': 'UP', 'oper-status': 'UP'}) + sif_data = {'index': sif_index, 'config': sif_config, 'state': sif_state} + sifs = {'subinterface': [sif_data]} + if_data['subinterfaces'] = sifs + + if_addresses = netifaces.ifaddresses(if_name) + + # MAC + link_addresses = if_addresses.get(netifaces.AF_LINK, list()) + if not if_name.startswith('lo') and len(link_addresses) > 0: + mac_address = link_addresses[0].get('addr') + eth_config = {'mac-address': mac_address} + eth_state = copy.deepcopy(eth_config) + eth_state.update({'hw-mac-address': mac_address}) + eth_data = {'config': eth_config, 'state': eth_state} + if_data['openconfig-if-ethernet:ethernet'] = eth_data + + # IPv4 + ipv4_addresses = if_addresses.get(netifaces.AF_INET, list()) + oc_addrs = list() + for ipv4_address in ipv4_addresses: + address = ipv4_address['addr'] + netmask = ipv4_address['netmask'] + ipv4n = ipaddress.ip_network(f'{address}/{netmask}', strict=False) + prefix_len = ipv4n.prefixlen + addr_config = {'ip': address, 'prefix-length': prefix_len} + addr_state = copy.deepcopy(addr_config) + ipv4_addr_data = {'ip': address, 'config': addr_config, 'state': addr_state} + oc_addrs.append(ipv4_addr_data) + if len(oc_addrs) > 0: + sif_data['openconfig-if-ip:ipv4'] = {'addresses': {'address': oc_addrs}} + + # IPv6 + ipv6_addresses = if_addresses.get(netifaces.AF_INET6, list()) + oc_addrs = list() + for ipv6_address in ipv6_addresses: + address = ipv6_address['addr'] + netmask = ipv6_address['netmask'] + ipv6n = ipaddress.ip_network(netmask, strict=False) + prefix_len = ipv6n.prefixlen + addr_config = {'ip': address, 'prefix-length': prefix_len} + addr_state = copy.deepcopy(addr_config) + ipv6_addr_data = {'ip': address, 'config': addr_config, 'state': addr_state} + oc_addrs.append(ipv6_addr_data) + if len(oc_addrs) > 0: + sif_data['openconfig-if-ip:ipv6'] = {'addresses': {'address': oc_addrs}} + + return {'openconfig-interfaces:interfaces': {'interface': if_list}}, 200 + +def register_restconf_openconfig_interfaces(api : Api): + api.add_resource(Interfaces, BASE_URL) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py new file mode 100644 index 000000000..951a3c888 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py @@ -0,0 +1,25 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from flask_restful import Api, Resource + +BASE_URL = '/restconf/data' + +class Root(Resource): + def get(self): + return {'restconf': {'data': {}}}, 200 + +def register_restconf_root(api : Api): + api.add_resource(Root, BASE_URL) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py new file mode 100644 index 000000000..6db7d15e0 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py @@ -0,0 +1,24 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import enum + +class ActionEnum(enum.Enum): + ACCEPT = 'accept' + DROP = 'drop' + REJECT = 'reject' + +def get_action_from_str(action : str) -> ActionEnum: + return ActionEnum._value2member_map_[action] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py new file mode 100644 index 000000000..53db9463f --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -0,0 +1,94 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Set, Tuple +from .DirectionEnum import DirectionEnum +from .FamilyEnum import FamilyEnum +from .TableEnum import TableEnum +from .Rule import Rule + + +@dataclass +class Chain: + family : FamilyEnum + table : TableEnum + chain : str + handle : Optional[int] = None + rules : List[Rule] = field(default_factory=list) + + def add_rule(self, entry : Dict) -> None: + self.rules.append(Rule.from_nft_entry(self.family, self.table, self.chain, entry)) + + def to_openconfig(self) -> Tuple[Optional[Dict], Dict]: + acl_set_name = f'{self.family.value}-{self.table.value}-{self.chain}' + acl_set_type = { + FamilyEnum.IPV4 : 'ACL_IPV4', + FamilyEnum.IPV6 : 'ACL_IPV6', + }.get(self.family) + + acl_set_entries : List[Dict] = list() + interfaces : Dict[str, Dict[DirectionEnum, Set[int]]] = dict() + + for sequence_id, rule in enumerate(self.rules, start=1): + acl_entry, rule_interfaces = rule.to_openconfig(sequence_id) + acl_set_entries.append(acl_entry) + + for if_name, direction_sequence_ids in rule_interfaces.items(): + interface : Dict = interfaces.setdefault(if_name, dict()) + for direction, sequence_ids in direction_sequence_ids.items(): + if_dir_sequence_ids : Set = interface.setdefault(direction, set()) + if_dir_sequence_ids.update(sequence_ids) + + + if len(acl_set_entries) > 0: + acl_set = { + 'name': acl_set_name, + 'type': acl_set_type, + 'config': {'name': acl_set_name, 'type': acl_set_type}, + 'state': {'name': acl_set_name, 'type': acl_set_type}, + 'acl-entries': {'acl-entry': acl_set_entries} + } + else: + acl_set = None + return acl_set, interfaces + + def dump(self) -> List[Dict]: + chain = {'family': self.family.value, 'table': self.table.value, 'name': self.chain} + if self.handle is not None: chain['handle'] = self.handle + + entries : List[str] = list() + entries.append({'chain': chain}) + for rule in self.rules: entries.extend(rule.dump()) + return entries + + def get_commands(self, removal : bool = False) -> List[str]: + commands : List[Dict] = list() + if removal: + # NOTE: For now, do not remove chains. We do not process all kinds of + # chains and their removal might cause side effects on NFTables. + pass + else: + parts = [ + 'add', 'chain', self.family.value, self.table.value, self.chain, + '{', + 'type', self.table.value, 'hook', self.chain, 'priority', self.table.value, ';', + 'policy', 'accept', ';', + '}' + ] + commands.append(' '.join(parts)) + for rule in self.rules: + commands.append(rule.get_command(removal=removal)) + return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py new file mode 100644 index 000000000..dec3813dc --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py @@ -0,0 +1,23 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import enum + +class DirectionEnum(enum.Enum): + INGRESS = 'ingress' + EGRESS = 'egress' + +def get_direction_from_str(direction : str) -> DirectionEnum: + return DirectionEnum._value2member_map_[direction] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py new file mode 100644 index 000000000..0ac157de9 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py @@ -0,0 +1,89 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from typing import Dict, Optional +from .FamilyEnum import FamilyEnum +from .TableEnum import TableEnum + + +class InvalidArgumentException(Exception): + def __init__( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> None: + super().__init__( + f'Invalid combination of parameters: ' + f'family={str(family)} table={str(table)} chain={str(chain)}' + ) + +class RuntimeException(Exception): + def __init__(self, rc : int, output : str, error : str) -> None: + super().__init__( + f'nft command failed: ' + f'rc={str(rc)} output={str(output)} error={str(error)}' + ) + +class MalformedOutputException(Exception): + def __init__(self, reason : str, command : str, output : str) -> None: + super().__init__( + f'nft command malformed output: ' + f'reason={str(reason)} command={str(command)} output={str(output)}' + ) + +class UnsupportedElementException(Exception): + def __init__(self, element_type : str, value : str) -> None: + super().__init__( + f'Unsupported: element_type={str(element_type)} value={str(value)}' + ) + +class MissingFieldException(Exception): + def __init__(self, field_name : str, objekt : Dict) -> None: + super().__init__( + f'Missing Field: name={str(field_name)} object={str(objekt)}' + ) + +class AlreadyExistsTableException(Exception): + def __init__( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None + ) -> None: + super().__init__( + f'Already Exists Table: family={str(family)} table={str(table)}' + ) + +class MissingTableException(Exception): + def __init__( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None + ) -> None: + super().__init__( + f'Missing Table: family={str(family)} table={str(table)}' + ) + +class AlreadyExistsChainException(Exception): + def __init__( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> None: + super().__init__( + f'Already Exists Chain: family={str(family)} table={str(table)} chain={str(chain)}' + ) + +class MissingChainException(Exception): + def __init__( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> None: + super().__init__( + f'Missing Chain: family={str(family)} table={str(table)} chain={str(chain)}' + ) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py new file mode 100644 index 000000000..f0e2a933a --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py @@ -0,0 +1,27 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import enum + +class FamilyEnum(enum.Enum): + IPV4 = 'ip' # IPv4 address family. + IPV6 = 'ip6' # IPv6 address family. + INET = 'inet' # Internet (IPv4/IPv6) address family. + ARP = 'arp' # ARP address family, handling IPv4 ARP packets. + BRIDGE = 'bridge' # Bridge address family, handling packets which traverse a bridge device. + NETDEV = 'netdev' # Netdev address family, handling packets on ingress and egress. + +def get_family_from_str(family : str) -> FamilyEnum: + return FamilyEnum._value2member_map_[family] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py new file mode 100644 index 000000000..a1c0b6d90 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py @@ -0,0 +1,153 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Set, Tuple +from .DirectionEnum import DirectionEnum +from .Exceptions import UnsupportedElementException +from .FamilyEnum import FamilyEnum, get_family_from_str +from .NFTablesCommand import NFTablesCommand +from .Table import Table +from .TableEnum import TableEnum, get_table_from_str + + +LOGGER = logging.getLogger(__name__) + + +@dataclass +class NFTables: + tables : Dict[Tuple[FamilyEnum, TableEnum], Table] = field(default_factory=dict) + + def load( + self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> None: + entries = NFTablesCommand.list(family=family, table=table, chain=chain) + for entry in entries: self.parse_entry(entry) + + def execute(self, removal : bool = False, verbose : bool = True) -> None: + commands = self.get_commands(removal=removal) + NFTablesCommand.execute(commands, verbose=verbose) + + def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table: + return self.tables.setdefault((family, table), Table(family, table)) + + def parse_entry(self, entry : Dict) -> None: + entry_fields = set(entry.keys()) + if len(entry_fields) != 1: raise UnsupportedElementException('entry', entry) + entry_type = entry_fields.pop() + if entry_type in {'metainfo'}: + return # skipping unneeded entry + elif entry_type in {'table'}: + self.parse_entry_table(entry['table']) + elif entry_type in {'chain'}: + self.parse_entry_chain(entry['chain']) + elif entry_type in {'rule'}: + self.parse_entry_rule(entry['rule']) + else: + raise UnsupportedElementException('entry', entry) + + def parse_entry_table(self, entry : Dict) -> None: + family = get_family_from_str(entry['family']) + if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return + table = get_table_from_str(entry['name']) + if table not in {TableEnum.FILTER}: return + table_obj = self.get_or_create_table(family, table) + table_obj.handle = entry['handle'] + + def parse_entry_chain(self, entry : Dict) -> None: + family = get_family_from_str(entry.pop('family')) + if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return + table = get_table_from_str(entry.pop('table')) + if table not in {TableEnum.FILTER}: return + self.get_or_create_table(family, table).add_chain_by_entry(entry) + + def parse_entry_rule(self, entry : Dict) -> None: + family = get_family_from_str(entry.pop('family')) + if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return + table = get_table_from_str(entry.pop('table')) + if table not in {TableEnum.FILTER}: return + self.get_or_create_table(family, table).add_rule_by_entry(entry) + + def to_openconfig(self) -> List[Dict]: + acl_sets : List[Dict] = list() + interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict() + acl_set_name_to_type : Dict[str, str] = dict() + + for table in self.tables.values(): + table_acl_sets, table_interfaces = table.to_openconfig() + acl_sets.extend(table_acl_sets) + + for table_acl_set in table_acl_sets: + acl_set_name = table_acl_set['name'] + acl_set_type = table_acl_set['type'] + acl_set_name_to_type[acl_set_name] = acl_set_type + + for if_name, dir_aclname_seqids in table_interfaces.items(): + interface : Dict = interfaces_struct.setdefault(if_name, dict()) + for direction, aclname_seqids in dir_aclname_seqids.items(): + if_direction : Dict = interface.setdefault(direction, dict()) + for acl_name, sequence_ids in aclname_seqids.items(): + if_dir_aclname : Set[int] = if_direction.setdefault(acl_name, set()) + if_dir_aclname.update(sequence_ids) + + interfaces = list() + for if_name, dir_aclname_seqids in interfaces_struct.items(): + if_data = { + 'id': if_name, + 'config': {'id': if_name}, + 'state': {'id': if_name}, + 'interface-ref': { + 'config': {'interface': if_name, 'subinterface': 1}, + 'state': {'interface': if_name, 'subinterface': 1}, + } + } + + for direction, aclname_seqids in dir_aclname_seqids.items(): + if_dir_obj : Dict = if_data.setdefault(f'{direction.value}-acl-sets', dict()) + if_dir_list : List = if_dir_obj.setdefault(f'{direction.value}-acl-set', list()) + + for acl_set_name, sequence_ids in aclname_seqids.items(): + acl_set_type = acl_set_name_to_type[acl_set_name] + if_dir_acl_set = { + 'set-name': acl_set_name, + 'type': acl_set_type, + 'config': {'set-name': acl_set_name, 'type': acl_set_type}, + 'state': {'set-name': acl_set_name, 'type': acl_set_type}, + } + if_dir_acl_set['acl-entries'] = {'acl-entry': [ + {'sequence-id': sequence_id, 'state': {'sequence-id': sequence_id}} + for sequence_id in sequence_ids + ]} + if_dir_list.append(if_dir_acl_set) + + interfaces.append(if_data) + + acl_data = dict() + if len(acl_sets) > 0: acl_data.update({'acl-sets': {'acl-set': acl_sets}}) + if len(interfaces) > 0: acl_data.update({'interfaces': {'interface': interfaces}}) + return {'openconfig-acl:acl': acl_data} + + def dump(self) -> List[Dict]: + entries : List[Dict] = list() + for table in self.tables.values(): entries.extend(table.dump()) + return entries + + def get_commands(self, removal : bool = False) -> List[str]: + commands : List[Dict] = list() + for table in self.tables.values(): + commands.extend(table.get_commands(removal=removal)) + return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py new file mode 100644 index 000000000..0b3170aee --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py @@ -0,0 +1,79 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import json, logging, nftables +from typing import Dict, List, Optional +from .Exceptions import ( + InvalidArgumentException, MalformedOutputException, RuntimeException +) +from .FamilyEnum import FamilyEnum +from .TableEnum import TableEnum + + +LOGGER = logging.getLogger(__name__) + + +class NFTablesCommand: + @staticmethod + def get_command_list( + family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> str: + if chain is None: + if table is None: + if family is None: + return 'list ruleset' + else: + return f'list ruleset {family.value}' + else: + if family is not None: + return f'list table {family.value} {table.value}' + else: + if table is not None: + if family is not None: + return f'list chain {family.value} {table.value} {chain}' + + raise InvalidArgumentException(family, table, chain) + + @staticmethod + def list( + family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, + chain : Optional[str] = None + ) -> List[Dict]: + nft = nftables.Nftables() + nft.set_json_output(True) + str_cmd = NFTablesCommand.get_command_list( + family=family, table=table, chain=chain + ) + rc, output, error = nft.cmd(str_cmd) + if rc != 0: raise RuntimeException(rc, output, error) + json_nftables = json.loads(output) + if 'nftables' not in json_nftables: + raise MalformedOutputException( + 'Missing field "nftables"', str_cmd, output + ) + return json_nftables['nftables'] + + @staticmethod + def execute(commands : List[str], verbose : bool = True) -> None: + nft = nftables.Nftables() + nft.set_json_output(True) + for command in commands: + if verbose: + LOGGER.info(f'Executing: {command}') + rc, output, error = nft.cmd(command) + if verbose: + LOGGER.info(f'rc={str(rc)} output={str(output)} error={str(error)}') + if rc != 0: raise RuntimeException(rc, output, error) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py new file mode 100644 index 000000000..8d3476c67 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py @@ -0,0 +1,77 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import ipaddress +from typing import TYPE_CHECKING, Dict, Union +from .Exceptions import MissingFieldException, UnsupportedElementException +from .ProtocolEnum import get_protocol_from_str + +if TYPE_CHECKING: + from .Rule import Rule + + +def parse_nft_ip_addr(right : Union[str, Dict]) -> ipaddress.IPv4Interface: + if isinstance(right, str): + address = right + prefix_len = 32 + elif isinstance(right, Dict): + if 'prefix' not in right: raise MissingFieldException('match[ip].right.prefix', right) + prefix = right['prefix'] + if 'addr' not in prefix: raise MissingFieldException('match[ip].right.prefix.addr', prefix) + if 'len' not in prefix: raise MissingFieldException('match[ip].right.prefix.len', prefix) + address = prefix['addr'] + prefix_len = prefix['len'] + else: + raise UnsupportedElementException('match[ip].right', right) + return ipaddress.IPv4Interface(f'{address}/{str(prefix_len)}') + + +def parse_nft_match(rule : 'Rule', match : Dict) -> None: + if 'op' not in match: raise MissingFieldException('rule.expr.match.op', match) + if 'left' not in match: raise MissingFieldException('rule.expr.match.left', match) + if 'right' not in match: raise MissingFieldException('rule.expr.match.right', match) + if match['op'] != '==': raise UnsupportedElementException('rule.expr.match.op', match) + + match_left = match['left'] + match_right = match['right'] + if 'meta' in match_left and 'key' in match_left['meta']: + meta_key = match_left['meta']['key'] + if 'iifname' in meta_key: + rule.input_if_name = match_right + elif 'oifname' in meta_key: + rule.output_if_name = match_right + else: + raise UnsupportedElementException('rule.expr.match', match) + elif 'payload' in match_left: + payload = match_left['payload'] + if 'protocol' in payload and 'field' in payload: + protocol = payload['protocol'] + field_name = payload['field'] + if protocol == 'ip' and field_name == 'saddr': + rule.src_ip_addr = parse_nft_ip_addr(match_right) + elif protocol == 'ip' and field_name == 'daddr': + rule.dst_ip_addr = parse_nft_ip_addr(match_right) + elif protocol in {'tcp', 'udp'} and field_name == 'sport': + rule.ip_protocol = get_protocol_from_str(protocol) + rule.src_port = match_right + elif protocol in {'tcp', 'udp'} and field_name == 'dport': + rule.ip_protocol = get_protocol_from_str(protocol) + rule.dst_port = match_right + else: + raise UnsupportedElementException('rule.expr.match', match) + else: + raise UnsupportedElementException('rule.expr.match', match) + else: + raise UnsupportedElementException('rule.expr.match', match) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py new file mode 100644 index 000000000..c54ed6365 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py @@ -0,0 +1,24 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import enum + +class ProtocolEnum(enum.Enum): + TCP = 'tcp' + UDP = 'udp' + ICMP = 'icmp' + +def get_protocol_from_str(protocol : str) -> ProtocolEnum: + return ProtocolEnum._value2member_map_[protocol] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py new file mode 100644 index 000000000..301dc1346 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -0,0 +1,201 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import copy, ipaddress, logging +from dataclasses import asdict, dataclass +from typing import Dict, List, Optional, Set, Tuple +from .ActionEnum import ActionEnum, get_action_from_str +from .DirectionEnum import DirectionEnum +from .Exceptions import MissingFieldException, UnsupportedElementException +from .FamilyEnum import FamilyEnum +from .NFTablesParserTools import parse_nft_match +from .ProtocolEnum import ProtocolEnum +from .TableEnum import TableEnum + + +LOGGER = logging.getLogger(__name__) + + +@dataclass +class Rule: + family : FamilyEnum + table : TableEnum + chain : str + handle : Optional[int] = None + + input_if_name : Optional[str] = None + output_if_name : Optional[str] = None + src_ip_addr : Optional[ipaddress.IPv4Interface] = None + dst_ip_addr : Optional[ipaddress.IPv4Interface] = None + ip_protocol : Optional[ProtocolEnum] = None + src_port : Optional[int] = None + dst_port : Optional[int] = None + + action : Optional[ActionEnum] = None + + comment : Optional[str] = None + + @classmethod + def from_nft_entry( + cls, family : FamilyEnum, table : TableEnum, chain : str, entry : Dict + ) -> 'Rule': + print(entry) + rule : 'Rule' = cls(family, table, chain) + + if 'expr' not in entry: raise MissingFieldException('rule.expr', entry) + expr_list : List[Dict] = entry.pop('expr') + for expr_entry in expr_list: + expr_entry_fields = set(expr_entry.keys()) + expr_entry_type = expr_entry_fields.pop() + if expr_entry_type == 'match': + match = expr_entry['match'] + parse_nft_match(rule, match) + elif expr_entry_type in {'accept', 'drop', 'reject'}: + rule.action = get_action_from_str(expr_entry_type) + else: + raise UnsupportedElementException('expr_entry', expr_entry) + + rule.comment = entry.pop('comment', None) + rule.handle = entry['handle'] + return rule + + def to_openconfig(self, sequence_id : int) -> Tuple[Dict, Dict]: + acl_entry_config = {'sequence-id': sequence_id} + if self.comment is not None: acl_entry_config['description'] = self.comment + + acl_entry = { + 'sequence-id': sequence_id, + 'config': acl_entry_config, + 'state': copy.deepcopy(acl_entry_config), + } + + ip_version = { + FamilyEnum.IPV4: 'ipv4', + FamilyEnum.IPV6: 'ipv6', + }.get(self.family) + + ip_protocol = { + ProtocolEnum.TCP : 'IP_TCP', + ProtocolEnum.UDP : 'IP_UDP', + ProtocolEnum.ICMP : 'IP_ICMP', + }.get(self.ip_protocol, None) + + if self.src_ip_addr is not None: + acl_entry_ipvx = acl_entry.setdefault(ip_version, dict()) + acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict()) + acl_entry_ipvx_config['source-address'] = str(self.src_ip_addr.network) + acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict()) + acl_entry_ipvx_state['source-address'] = str(self.src_ip_addr.network) + + if self.dst_ip_addr is not None: + acl_entry_ipvx = acl_entry.setdefault(ip_version, dict()) + acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict()) + acl_entry_ipvx_config['destination-address'] = str(self.dst_ip_addr.network) + acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict()) + acl_entry_ipvx_state['destination-address'] = str(self.dst_ip_addr.network) + + if ip_protocol is not None: + acl_entry_ipvx = acl_entry.setdefault(ip_version, dict()) + acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict()) + acl_entry_ipvx_config['protocol'] = ip_protocol + acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict()) + acl_entry_ipvx_state['protocol'] = ip_protocol + + if self.src_port is not None: + acl_entry_trans = acl_entry.setdefault('transport', dict()) + acl_entry_trans_config = acl_entry_trans.setdefault('config', dict()) + acl_entry_trans_config['source-port'] = self.src_port + acl_entry_trans_state = acl_entry_trans.setdefault('state', dict()) + acl_entry_trans_state['source-port'] = self.src_port + + if self.dst_port is not None: + acl_entry_trans = acl_entry.setdefault('transport', dict()) + acl_entry_trans_config = acl_entry_trans.setdefault('config', dict()) + acl_entry_trans_config['destination-port'] = self.dst_port + acl_entry_trans_state = acl_entry_trans.setdefault('state', dict()) + acl_entry_trans_state['destination-port'] = self.dst_port + + if self.action is not None: + acl_forwarding_action = { + ActionEnum.ACCEPT : 'ACCEPT', + ActionEnum.DROP : 'DROP', + ActionEnum.REJECT : 'REJECT', + }.get(self.action) + acl_action = {'forwarding-action': acl_forwarding_action} + acl_entry['actions'] = {'config': acl_action, 'state': acl_action} + + interfaces : Dict[str, Dict[DirectionEnum, Set[int]]] = dict() + + if self.input_if_name is not None: + interface : Dict = interfaces.setdefault(self.input_if_name, dict()) + direction : Set = interface.setdefault(DirectionEnum.INGRESS, set()) + direction.add(sequence_id) + + if self.output_if_name is not None: + interface : Dict = interfaces.setdefault(self.output_if_name, dict()) + direction : Set = interface.setdefault(DirectionEnum.EGRESS, set()) + direction.add(sequence_id) + + return acl_entry, interfaces + + + def dump(self) -> List[Dict]: + rule = {'family': self.family.value, 'table': self.table.value, 'chain': self.chain} + expr = list() + if self.input_if_name is not None: + match_left = {'meta': {'key': 'iifname'}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': self.input_if_name}}) + if self.output_if_name is not None: + match_left = {'meta': {'key': 'oifname'}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': self.output_if_name}}) + if self.src_ip_addr is not None: + match_left = {'payload': {'protocol': 'ip', 'field': 'saddr'}} + match_right = {'prefix': {'addr': str(self.src_ip_addr.ip), 'len': self.src_ip_addr.network.prefixlen}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': match_right}}) + if self.dst_ip_addr is not None: + match_left = {'payload': {'protocol': 'ip', 'field': 'daddr'}} + match_right = {'prefix': {'addr': str(self.dst_ip_addr.ip), 'len': self.dst_ip_addr.network.prefixlen}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': match_right}}) + if self.src_port is not None: + match_left = {'payload': {'protocol': self.ip_protocol.value, 'field': 'sport'}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': self.src_port}}) + if self.dst_port is not None: + match_left = {'payload': {'protocol': self.ip_protocol.value, 'field': 'dport'}} + expr.append({'match': {'op': '==', 'left': match_left, 'right': self.dst_port}}) + if self.action is not None: expr.append({self.action.value : None}) + if len(expr) > 0: rule['expr'] = expr + if self.comment is not None: rule['comment'] = self.comment + if self.handle is not None: rule['handle'] = self.handle + return [{'rule': rule}] + + def get_command(self, removal : bool = False) -> str: + if removal: + if self.handle is None: raise MissingFieldException('handle', asdict(self)) + parts = [ + 'delete', 'rule', # Ideally destroy (fail silently if not exist), but seems not supported. + self.family.value, self.table.value, self.chain, + 'handle', str(self.handle) + ] + else: + parts = ['add', 'rule', self.family.value, self.table.value, self.chain] + if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name]) + if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name]) + if self.src_ip_addr is not None: parts.extend(['ip', 'saddr', str(self.src_ip_addr)]) + if self.dst_ip_addr is not None: parts.extend(['ip', 'daddr', str(self.dst_ip_addr)]) + if self.src_port is not None: parts.extend([self.ip_protocol.value, 'sport', str(self.src_port)]) + if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)]) + if self.action is not None: parts.append(self.action.value) + if self.comment is not None: parts.extend(['comment', f'"{self.comment}"']) + return ' '.join(parts) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py new file mode 100644 index 000000000..2d2b07884 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -0,0 +1,86 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Set, Tuple +from .Chain import Chain +from .DirectionEnum import DirectionEnum +from .FamilyEnum import FamilyEnum +from .TableEnum import TableEnum + + +@dataclass +class Table: + family : FamilyEnum + table : TableEnum + handle : Optional[int] = None + chains : Dict[str, Chain] = field(default_factory=dict) + + def get_or_create_chain(self, name : str) -> Chain: + return self.chains.setdefault(name, Chain(self.family, self.table, name)) + + def add_chain_by_entry(self, entry : Dict) -> Chain: + name : str = entry.pop('name') + if name.lower() not in {'input', 'output'}: return None + chain_obj = self.get_or_create_chain(name) + chain_obj.handle = entry['handle'] + return chain_obj + + def add_rule_by_entry(self, entry : Dict) -> None: + chain : str = entry.pop('chain') + if chain.lower() not in {'input', 'output'}: return + self.get_or_create_chain(chain).add_rule(entry) + + def to_openconfig(self) -> Tuple[List[Dict], Dict]: + acl_sets : List[Dict] = list() + interfaces : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict() + + for chain in self.chains.values(): + chain_acl_set, chain_interfaces = chain.to_openconfig() + if chain_acl_set is None: continue + + acl_sets.append(chain_acl_set) + + acl_set_name = chain_acl_set['name'] + for if_name, direction_sequence_ids in chain_interfaces.items(): + interface : Dict = interfaces.setdefault(if_name, dict()) + for direction, sequence_ids in direction_sequence_ids.items(): + if_direction : Dict = interface.setdefault(direction, dict()) + if_dir_aclname : Set[int] = if_direction.setdefault(acl_set_name, set()) + if_dir_aclname.update(sequence_ids) + + return acl_sets, interfaces + + def dump(self) -> List[Dict]: + table = {'family': self.family.value, 'name': self.table.value} + if self.handle is not None: table['handle'] = self.handle + + entries : List[str] = list() + entries.append({'table': table}) + for chain in self.chains.values(): entries.extend(chain.dump()) + return entries + + def get_commands(self, removal : bool = False) -> List[str]: + commands : List[Dict] = list() + if removal: + # NOTE: For now, do not remove tables. We do not process all kinds of + # tables and their removal might cause side effects on NFTables. + pass + else: + parts = ['add', 'table', self.family.value, self.table.value] + commands.append(' '.join(parts)) + for chain in self.chains.values(): + commands.extend(chain.get_commands(removal=removal)) + return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py new file mode 100644 index 000000000..fa8658d24 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py @@ -0,0 +1,24 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import enum + +class TableEnum(enum.Enum): + FILTER = 'filter' + NAT = 'nat' + ROUTE = 'route' + +def get_table_from_str(table : str) -> TableEnum: + return TableEnum._value2member_map_[table] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py new file mode 100644 index 000000000..dc838bd26 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py @@ -0,0 +1,31 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from .FamilyEnum import FamilyEnum +from .NFTables import NFTables +from .TableEnum import TableEnum + +def main(): + nft = NFTables() + nft.load(FamilyEnum.IPV4, TableEnum.FILTER) + + entries = nft.dump() + for entry in entries: + print(entry) + + print(nft.to_openconfig()) + +if __name__ == '__main__': + main() diff --git a/src/tests/tools/firewall_agent/redeploy.sh b/src/tests/tools/firewall_agent/redeploy.sh new file mode 100755 index 000000000..62dada77b --- /dev/null +++ b/src/tests/tools/firewall_agent/redeploy.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -euo pipefail + +docker stop firewall-agent || true +docker rm firewall-agent || true + +docker build --tag "firewall-agent:dev" . +docker run --detach --name firewall-agent --cap-add=NET_ADMIN --network host --publish 8888:8888 firewall-agent:dev + +docker logs --follow firewall-agent diff --git a/src/tests/tools/firewall_agent/requirements.txt b/src/tests/tools/firewall_agent/requirements.txt new file mode 100644 index 000000000..af4fe3e7c --- /dev/null +++ b/src/tests/tools/firewall_agent/requirements.txt @@ -0,0 +1,21 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +flask-restful>=0.3.9 +Flask>=2.0 +netifaces>=0.11 +pip-nftables==1.0.2.post1 +pytest>=7.0 +requests>=2.0 diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json new file mode 100644 index 000000000..70efb0d4b --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json @@ -0,0 +1,27 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "drop-8001-host"}, + "ipv4": {"config": {"source-address": "127.0.0.1/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 8001}}, + "actions": {"config": {"forwarding-action": "DROP"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "lo", + "config": {"id": "lo"}, + "interface-ref": {"config": {"interface": "lo", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json new file mode 100644 index 000000000..2d20df7b2 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json @@ -0,0 +1,27 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "drop-8002-ext"}, + "ipv4": {"config": {"source-address": "10.0.2.1/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 8002}}, + "actions": {"config": {"forwarding-action": "DROP"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "enp0s3", + "config": {"id": "enp0s3"}, + "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json new file mode 100644 index 000000000..55f41c033 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json @@ -0,0 +1,39 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "drop-8001-host"}, + "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 8001}}, + "actions": {"config": {"forwarding-action": "DROP"}} + }, + { + "sequence-id": 2, + "config": {"sequence-id": 2, "description": "drop-8002-ext"}, + "ipv4": {"config": {"source-address": "10.0.2.1/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 8002}}, + "actions": {"config": {"forwarding-action": "DROP"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "enp0s3", + "config": {"id": "enp0s3"}, + "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + }, + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 2}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/run_nft_model.sh b/src/tests/tools/firewall_agent/scripts/run_nft_model.sh new file mode 100755 index 000000000..d57ad29f9 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/run_nft_model.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +sudo true +sudo -E "$(which python)" -m firewall_agent.nft_model diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh new file mode 100755 index 000000000..25438b2d5 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components +curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces +curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl + +wget -q -O- http://localhost:8001 +wget -q -O- http://localhost:8002 + +curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl + +wget -q -O- http://localhost:8001 +wget -q -O- http://localhost:8002 + +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext -- GitLab From 3b14aafe55b63612eb0e9f643b5317f625793801 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 10:35:26 +0000 Subject: [PATCH 092/371] Tests - Tools - Firewall Agent: - Update TODO.md file - Update test commands - Enable add/insert rules - Enabled sorting of rules - Factorized code for converting openconfig to NFT --- src/tests/tools/firewall_agent/docs/TODO.md | 10 + .../firewall_agent/resources/ACLs.py | 278 +++++++++--------- .../resources/nft_model/Chain.py | 6 +- .../resources/nft_model/NFTables.py | 22 +- .../resources/nft_model/NFTablesCommand.py | 8 +- .../resources/nft_model/Rule.py | 45 ++- .../resources/nft_model/Table.py | 6 +- .../scripts/data/oc_acl_block_30435_all.json | 27 ++ .../firewall_agent/scripts/test_commands.sh | 3 + 9 files changed, 237 insertions(+), 168 deletions(-) create mode 100644 src/tests/tools/firewall_agent/docs/TODO.md create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json diff --git a/src/tests/tools/firewall_agent/docs/TODO.md b/src/tests/tools/firewall_agent/docs/TODO.md new file mode 100644 index 000000000..75a026986 --- /dev/null +++ b/src/tests/tools/firewall_agent/docs/TODO.md @@ -0,0 +1,10 @@ +# TODO + +- To block traffic to a MicroK8s service, apply rule: + `sudo nft add/insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop` + + - when applying to ingress, also apply to FORWARD + - when applying to egress, also apply to FORWARD + - rules (INPUT, FORWARD, OUTPUT) should be applied based on sequence_id + - negative sequence_id => insert on top (first -1, then -2, then -3) so that order of rules is -3,-2,-1 at top of the chain + - positive sequence_id => append on bottom (first 0, then 1, then 2) so that order of rules is 0, 1, 2 at bottom of the chain diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py index 79772ad81..70424cf25 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py @@ -13,22 +13,88 @@ # limitations under the License. -import ipaddress, logging +import logging from flask import request from flask_restful import Api, Resource, abort from typing import Dict, List, Set, Tuple -from .nft_model.ActionEnum import ActionEnum, get_action_from_str from .nft_model.DirectionEnum import DirectionEnum from .nft_model.FamilyEnum import FamilyEnum from .nft_model.NFTables import NFTables -from .nft_model.ProtocolEnum import ProtocolEnum, get_protocol_from_str from .nft_model.Rule import Rule from .nft_model.TableEnum import TableEnum + +LOGGER = logging.getLogger(__name__) + + BASE_URL_ROOT = '/restconf/data/openconfig-acl:acl' BASE_URL_ITEM = '/restconf/data/openconfig-acl:acl/acl-sets/acl-set=' -LOGGER = logging.getLogger(__name__) +CHAIN_NAME_INPUT = 'INPUT' +CHAIN_NAME_FORWARD = 'FORWARD' +CHAIN_NAME_OUTPUT = 'OUTPUT' + +CHAINS_INPUT = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD] +CHAINS_OUTPUT = [CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT] +CHAINS_ALL = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT] + +TYPE_ACL_RULE_SEQ_ID = Tuple[str, int] +TYPE_IFACE_DIRECTION = Tuple[str, DirectionEnum] +TYPE_IFACE_DIRECTIONS = List[TYPE_IFACE_DIRECTION] +TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS] + +def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum: + return { + 'ACL_IPV4' : FamilyEnum.IPV4, + 'ACL_IPV6' : FamilyEnum.IPV6, + }[acl_set_type] + +class AclRuleToInterfaceDirection: + def __init__(self, nft : NFTables): + self._nft = nft + self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict() + + def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None: + family = get_family_from_acl_set_type(acl_set_type) + table = self._nft.get_or_create_table(family, TableEnum.FILTER) + for chain_name in chain_names: + table.get_or_create_chain(chain_name) + + def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None: + acl_set_name = acl_set['config']['set-name'] + acl_set_type = acl_set['config']['type'] + + if direction == DirectionEnum.INGRESS: + self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT) + elif direction == DirectionEnum.EGRESS: + self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT) + else: + self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL) + + for acl_set_entry in acl_set['acl-entries']['acl-entry']: + sequence_id = int(acl_set_entry['sequence-id']) + key = (acl_set_name, sequence_id) + if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list()) + if_dir_list.append((if_name, direction)) + + def add_interface(self, interface : Dict) -> None: + if_name = interface['config']['id'] + for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]: + direction_value = direction.value + acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict()) + acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list()) + for acl_set in acl_sets_lst: + self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS) + + def add_interfaces(self, interfaces : List[Dict]) -> None: + for interface in interfaces: + self.add_interface(interface) + + def get_interfaces_directions( + self, acl_set_name : str, sequence_id : int + ) -> TYPE_IFACE_DIRECTIONS: + return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), []) + class ACLs(Resource): def get(self): @@ -38,185 +104,103 @@ class ACLs(Resource): def post(self): payload = request.get_json(force=True) - # RESTCONF wrapper may be 'openconfig-acl:acl-set' or 'acl-set' - if not isinstance(payload, dict): abort(400, message='invalid payload') - if 'openconfig-acl:acl' in payload: - content = payload.get('openconfig-acl:acl') - elif 'acl' in payload: - content = payload.get('acl') - else: + if not isinstance(payload, dict): abort(400, message='invalid payload') - if not isinstance(content, dict): abort(400, message='invalid content') + content = payload.get('openconfig-acl:acl') + if content is None: + content = payload.get('acl') + if content is None: + abort(400, message='invalid payload') + if not isinstance(content, dict): + abort(400, message='invalid content') + + interfaces = content['interfaces']['interface'] + if not isinstance(interfaces, list): + abort(400, message='invalid interfaces') nft = NFTables() - interfaces = content['interfaces']['interface'] - if not isinstance(interfaces, list): abort(400, message='invalid interfaces') - interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict() - acl_rule_to_iface_direction : Dict[Tuple[str, int], List[Tuple[str, DirectionEnum]]] = dict() - for interface in interfaces: - if_name = interface['config']['id'] - - ingress_acl_sets = interface.get('ingress-acl-sets', dict()).get('ingress-acl-set', list()) - for ingress_acl_set in ingress_acl_sets: - acl_set_name = ingress_acl_set['config']['set-name'] - acl_set_type = ingress_acl_set['config']['type'] - - family = { - 'ACL_IPV4' : FamilyEnum.IPV4, - 'ACL_IPV6' : FamilyEnum.IPV6, - }.get(acl_set_type) - table = nft.get_or_create_table(family, TableEnum.FILTER) - table.get_or_create_chain('input') - - acl_set_sequence_ids = { - int(acl_set_entry['sequence-id']) - for acl_set_entry in ingress_acl_set['acl-entries']['acl-entry'] - } - - interfaces_struct.setdefault(if_name, dict())\ - .setdefault(DirectionEnum.INGRESS, dict())\ - .setdefault(acl_set_name, set())\ - .update(acl_set_sequence_ids) - - for sequence_id in acl_set_sequence_ids: - key = (acl_set_name, sequence_id) - acl_rule_to_iface_direction.setdefault(key, list()).append((if_name, DirectionEnum.INGRESS)) - - egress_acl_sets = interface.get('egress-acl-sets', dict()).get('egress-acl-set', list()) - for egress_acl_set in egress_acl_sets: - acl_set_name = egress_acl_set['config']['set-name'] - acl_set_type = egress_acl_set['config']['type'] - - family = { - 'ACL_IPV4' : FamilyEnum.IPV4, - 'ACL_IPV6' : FamilyEnum.IPV6, - }.get(acl_set_type) - table = nft.get_or_create_table(family, TableEnum.FILTER) - table.get_or_create_chain('output') - - acl_set_sequence_ids = { - int(acl_set_entry['sequence-id']) - for acl_set_entry in egress_acl_set['acl-entries']['acl-entry'] - } - - interfaces_struct.setdefault(if_name, dict())\ - .setdefault(DirectionEnum.EGRESS, dict())\ - .setdefault(acl_set_name, set())\ - .update(acl_set_sequence_ids) - - for sequence_id in acl_set_sequence_ids: - key = (acl_set_name, sequence_id) - acl_rule_to_iface_direction.setdefault(key, list()).append((if_name, DirectionEnum.EGRESS)) + arid = AclRuleToInterfaceDirection(nft) + arid.add_interfaces(interfaces) acl_sets = content['acl-sets']['acl-set'] - if not isinstance(acl_sets, list): abort(400, message='invalid acl_sets') + if not isinstance(acl_sets, list): + abort(400, message='invalid acl_sets') + for acl_set in acl_sets: acl_set_name = acl_set['config']['name'] acl_set_type = acl_set['config']['type'] - family = { - 'ACL_IPV4' : FamilyEnum.IPV4, - 'ACL_IPV6' : FamilyEnum.IPV6, - }.get(acl_set_type) + family = get_family_from_acl_set_type(acl_set_type) + table = TableEnum.FILTER for acl_entry in acl_set['acl-entries']['acl-entry']: - sequence_id = acl_entry['config']['sequence-id'] - description = acl_entry['config']['description'] - ipv4_config = acl_entry.get('ipv4', {}).get('config', {}) - transp_config = acl_entry.get('transport', {}).get('config', {}) - - interfaces_directions = acl_rule_to_iface_direction[(acl_set_name, sequence_id)] + interfaces_directions = arid.get_interfaces_directions( + acl_set_name, acl_entry['config']['sequence-id'] + ) for if_name, direction in interfaces_directions: - table = nft.get_or_create_table(family, TableEnum.FILTER) - if direction == DirectionEnum.INGRESS: - rule = Rule(family=family, table=TableEnum.FILTER, chain='input') - rule.input_if_name = if_name - chain = table.get_or_create_chain('input') + chain_list = CHAINS_INPUT + input_if_name, output_if_name = if_name, None elif direction == DirectionEnum.EGRESS: - rule = Rule(family=family, table=TableEnum.FILTER, chain='output') - rule.output_if_name = if_name - chain = table.get_or_create_chain('output') + chain_list = CHAINS_OUTPUT + input_if_name, output_if_name = None, if_name else: raise Exception('Unsupported direction: {:s}'.format(str(direction))) - rule.comment = description + for chain_name in chain_list: + rule = Rule.from_openconfig(family, table, chain_name, acl_entry) + rule.input_if_name = input_if_name + rule.output_if_name = output_if_name + nft.add_rule(rule) - if 'source-address' in ipv4_config: - rule.src_ip_addr = ipaddress.IPv4Interface(ipv4_config['source-address']) + entries = nft.dump() + for entry in entries: + LOGGER.warning('POST rules: {:s}'.format(str(entry))) - if 'destination-address' in ipv4_config: - rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address']) + nft.execute(verbose=True) - if 'protocol' in ipv4_config: - rule.ip_protocol = { - 'IP_TCP' : ProtocolEnum.TCP, - 'IP_UDP' : ProtocolEnum.UDP, - 'IP_ICMP' : ProtocolEnum.ICMP, - }.get(ipv4_config['protocol'], None) + return {}, 201 - rule.src_port = transp_config.get('source-port') - rule.dst_port = transp_config.get('destination-port') - rule.action = { - 'ACCEPT' : ActionEnum.ACCEPT, - 'DROP' : ActionEnum.DROP, - 'REJECT' : ActionEnum.REJECT, - }.get(acl_entry['actions']['config']['forwarding-action'], None) +def load_nftables_by_rule_comment(rule_comment : str) -> NFTables: + nft = NFTables() + nft.load(FamilyEnum.IPV4, TableEnum.FILTER) - chain.rules.append(rule) + tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set() + for table_key, table in nft.tables.items(): - entries = nft.dump() - for entry in entries: - LOGGER.warning('POST rules: {:s}'.format(str(entry))) + chains_to_remove : Set[str] = set() + for chain_name, chain in table.chains.items(): - nft.execute(verbose=True) + for rule in reversed(chain.rules): + if rule.comment == rule_comment: continue + chain.rules.remove(rule) # not a rule of interest - return {}, 201 + if len(chain.rules) > 0: continue + chains_to_remove.add(chain_name) + + for chain_name in chains_to_remove: + table.chains.pop(chain_name) + + if len(nft.tables) > 0: continue + tables_to_remove.add(table_key) + + for table_key in tables_to_remove: + nft.tables.pop(table_key) + + return nft class ACL(Resource): def get(self, name : str): - nft = NFTables() - nft.load(FamilyEnum.IPV4, TableEnum.FILTER) - tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set() - for table_key, table in nft.tables.items(): - chains_to_remove : Set[str] = set() - for chain_name, chain in table.chains.items(): - for rule in reversed(chain.rules): - if rule.comment == name: continue - chain.rules.remove(rule) # not a rule of interest - if len(chain.rules) > 0: continue - chains_to_remove.add(chain_name) - for chain_name in chains_to_remove: - table.chains.pop(chain_name) - if len(nft.tables) > 0: continue - tables_to_remove.add(table_key) - for table_key in tables_to_remove: - nft.tables.pop(table_key) + nft = load_nftables_by_rule_comment(name) return nft.to_openconfig(), 200 def delete(self, name : str): - nft = NFTables() - nft.load(FamilyEnum.IPV4, TableEnum.FILTER) - tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set() - for table_key, table in nft.tables.items(): - chains_to_remove : Set[str] = set() - for chain_name, chain in table.chains.items(): - for rule in reversed(chain.rules): - if rule.comment == name: continue - chain.rules.remove(rule) # not a rule of interest - if len(chain.rules) > 0: continue - chains_to_remove.add(chain_name) - for chain_name in chains_to_remove: - table.chains.pop(chain_name) - if len(nft.tables) > 0: continue - tables_to_remove.add(table_key) - for table_key in tables_to_remove: - nft.tables.pop(table_key) + nft = load_nftables_by_rule_comment(name) nft.execute(removal=True, verbose=True) return {}, 204 diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 53db9463f..7062fea25 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -74,8 +74,8 @@ class Chain: for rule in self.rules: entries.extend(rule.dump()) return entries - def get_commands(self, removal : bool = False) -> List[str]: - commands : List[Dict] = list() + def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]: + commands : List[Tuple[int, str]] = list() if removal: # NOTE: For now, do not remove chains. We do not process all kinds of # chains and their removal might cause side effects on NFTables. @@ -88,7 +88,7 @@ class Chain: 'policy', 'accept', ';', '}' ] - commands.append(' '.join(parts)) + commands.append(-1, ' '.join(parts)) for rule in self.rules: commands.append(rule.get_command(removal=removal)) return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py index a1c0b6d90..1d13aa93b 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py @@ -15,11 +15,13 @@ import logging from dataclasses import dataclass, field +import operator from typing import Dict, List, Optional, Set, Tuple from .DirectionEnum import DirectionEnum from .Exceptions import UnsupportedElementException from .FamilyEnum import FamilyEnum, get_family_from_str from .NFTablesCommand import NFTablesCommand +from .Rule import Rule from .Table import Table from .TableEnum import TableEnum, get_table_from_str @@ -38,10 +40,6 @@ class NFTables: entries = NFTablesCommand.list(family=family, table=table, chain=chain) for entry in entries: self.parse_entry(entry) - def execute(self, removal : bool = False, verbose : bool = True) -> None: - commands = self.get_commands(removal=removal) - NFTablesCommand.execute(commands, verbose=verbose) - def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table: return self.tables.setdefault((family, table), Table(family, table)) @@ -82,6 +80,11 @@ class NFTables: if table not in {TableEnum.FILTER}: return self.get_or_create_table(family, table).add_rule_by_entry(entry) + def add_rule(self, rule : Rule) -> None: + table = self.get_or_create_table(rule.family, rule.table) + chain = table.get_or_create_chain(rule.chain) + chain.rules.append(rule) + def to_openconfig(self) -> List[Dict]: acl_sets : List[Dict] = list() interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict() @@ -146,8 +149,13 @@ class NFTables: for table in self.tables.values(): entries.extend(table.dump()) return entries - def get_commands(self, removal : bool = False) -> List[str]: - commands : List[Dict] = list() + def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]: + commands : List[Tuple[int, str]] = list() for table in self.tables.values(): commands.extend(table.get_commands(removal=removal)) - return commands + # return a sorted list of commands by their priority (lower first) + return sorted(commands, key=operator.itemgetter(0)) + + def execute(self, removal : bool = False, verbose : bool = True) -> None: + commands = self.get_commands(removal=removal) + NFTablesCommand.execute(commands, verbose=verbose) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py index 0b3170aee..983acf506 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py @@ -14,7 +14,7 @@ import json, logging, nftables -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Tuple from .Exceptions import ( InvalidArgumentException, MalformedOutputException, RuntimeException ) @@ -67,12 +67,12 @@ class NFTablesCommand: return json_nftables['nftables'] @staticmethod - def execute(commands : List[str], verbose : bool = True) -> None: + def execute(commands : List[Tuple[int, str]], verbose : bool = True) -> None: nft = nftables.Nftables() nft.set_json_output(True) - for command in commands: + for priority, command in commands: if verbose: - LOGGER.info(f'Executing: {command}') + LOGGER.info(f'Executing [priority={str(priority)}]: {command}') rc, output, error = nft.cmd(command) if verbose: LOGGER.info(f'rc={str(rc)} output={str(output)} error={str(error)}') diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index 301dc1346..25d3ed3b6 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -35,6 +35,8 @@ class Rule: chain : str handle : Optional[int] = None + sequence_id : int = 0 + input_if_name : Optional[str] = None output_if_name : Optional[str] = None src_ip_addr : Optional[ipaddress.IPv4Interface] = None @@ -51,7 +53,6 @@ class Rule: def from_nft_entry( cls, family : FamilyEnum, table : TableEnum, chain : str, entry : Dict ) -> 'Rule': - print(entry) rule : 'Rule' = cls(family, table, chain) if 'expr' not in entry: raise MissingFieldException('rule.expr', entry) @@ -71,6 +72,41 @@ class Rule: rule.handle = entry['handle'] return rule + @classmethod + def from_openconfig( + cls, family : FamilyEnum, table : TableEnum, chain : str, acl_entry : Dict + ) -> 'Rule': + rule : 'Rule' = cls(family, table, chain) + + rule.sequence_id = int(acl_entry['config']['sequence-id']) + rule.comment = acl_entry['config']['description'] + + ipv4_config = acl_entry.get('ipv4', {}).get('config', {}) + if 'source-address' in ipv4_config: + rule.src_ip_addr = ipaddress.IPv4Interface(ipv4_config['source-address']) + + if 'destination-address' in ipv4_config: + rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address']) + + if 'protocol' in ipv4_config: + rule.ip_protocol = { + 'IP_TCP' : ProtocolEnum.TCP, + 'IP_UDP' : ProtocolEnum.UDP, + 'IP_ICMP' : ProtocolEnum.ICMP, + }.get(ipv4_config['protocol'], None) + + transp_config = acl_entry.get('transport', {}).get('config', {}) + rule.src_port = transp_config.get('source-port') + rule.dst_port = transp_config.get('destination-port') + + rule.action = { + 'ACCEPT' : ActionEnum.ACCEPT, + 'DROP' : ActionEnum.DROP, + 'REJECT' : ActionEnum.REJECT, + }.get(acl_entry['actions']['config']['forwarding-action'], None) + + return rule + def to_openconfig(self, sequence_id : int) -> Tuple[Dict, Dict]: acl_entry_config = {'sequence-id': sequence_id} if self.comment is not None: acl_entry_config['description'] = self.comment @@ -180,7 +216,7 @@ class Rule: if self.handle is not None: rule['handle'] = self.handle return [{'rule': rule}] - def get_command(self, removal : bool = False) -> str: + def get_command(self, removal : bool = False) -> Tuple[int, str]: if removal: if self.handle is None: raise MissingFieldException('handle', asdict(self)) parts = [ @@ -189,7 +225,8 @@ class Rule: 'handle', str(self.handle) ] else: - parts = ['add', 'rule', self.family.value, self.table.value, self.chain] + verb = 'add' if self.sequence_id < 1000 else 'insert' + parts = [verb, 'rule', self.family.value, self.table.value, self.chain] if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name]) if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name]) if self.src_ip_addr is not None: parts.extend(['ip', 'saddr', str(self.src_ip_addr)]) @@ -198,4 +235,4 @@ class Rule: if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)]) if self.action is not None: parts.append(self.action.value) if self.comment is not None: parts.extend(['comment', f'"{self.comment}"']) - return ' '.join(parts) + return self.sequence_id, ' '.join(parts) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py index 2d2b07884..b9d1fa86f 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -72,15 +72,15 @@ class Table: for chain in self.chains.values(): entries.extend(chain.dump()) return entries - def get_commands(self, removal : bool = False) -> List[str]: - commands : List[Dict] = list() + def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]: + commands : List[Tuple[int, str]] = list() if removal: # NOTE: For now, do not remove tables. We do not process all kinds of # tables and their removal might cause side effects on NFTables. pass else: parts = ['add', 'table', self.family.value, self.table.value] - commands.append(' '.join(parts)) + commands.append(-2, ' '.join(parts)) for chain in self.chains.values(): commands.extend(chain.get_commands(removal=removal)) return commands diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json new file mode 100644 index 000000000..5e50f560a --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json @@ -0,0 +1,27 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "drop-30435-all"}, + "ipv4": {"config": {"protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 30435}}, + "actions": {"config": {"forwarding-action": "DROP"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "enp0s3", + "config": {"id": "enp0s3"}, + "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh index 25438b2d5..9db629ff9 100755 --- a/src/tests/tools/firewall_agent/scripts/test_commands.sh +++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh @@ -30,3 +30,6 @@ wget -q -O- http://localhost:8002 curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext + +curl -X POST -d @scripts/data/oc_acl_block_30435_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-30435-all -- GitLab From e2f1246a60b1262c7204d36ca6acfab9bf7bb236 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 10:38:41 +0000 Subject: [PATCH 093/371] Tests - Tools - Firewall Agent: - Update example commands --- src/tests/tools/firewall_agent/docs/Docs-and-Commands.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md index 7dd08a844..4f420ed0a 100644 --- a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md +++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md @@ -9,6 +9,10 @@ ## Example Commands: ```bash + +# WORKS to block traffic: +sudo nft insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop + sudo nft add table ip filter sudo nft add chain ip filter input {type filter hook input priority filter ; policy accept; } sudo nft add chain ip filter output {type filter hook output priority filter; policy accept; } -- GitLab From cc5833f5a062e982fb1358bcb36426f610bc16bf Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 14:16:37 +0000 Subject: [PATCH 094/371] Tests - Tools - Firewall Agent: - Updated example commands - Fixed chain priorities to "raw" - Fixed add/insert decission threshold - Added parsing of forward and prerouting tables - Separated ACLs.py into 2 files for clarity --- .../firewall_agent/docs/Docs-and-Commands.md | 29 +++++- .../firewall_agent/resources/ACLs.py | 71 +------------- .../resources/AclRuleToInterfaceDirection.py | 98 +++++++++++++++++++ .../resources/nft_model/Chain.py | 3 +- .../resources/nft_model/Rule.py | 4 +- .../resources/nft_model/Table.py | 4 +- 6 files changed, 137 insertions(+), 72 deletions(-) create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md index 4f420ed0a..2c133c875 100644 --- a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md +++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md @@ -9,9 +9,34 @@ ## Example Commands: ```bash +sudo nft --interactive --handle -# WORKS to block traffic: -sudo nft insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop +# WORKS to block traffic, but weird as external facing port is 30435, not 85 +insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop + +# WORKS to block/allow traffic by external facing port 30435 +add table ip filter +add chain ip filter PREROUTING { type filter hook prerouting priority raw; policy accept; } +add rule ip filter PREROUTING tcp dport 30435 reject +insert rule ip filter PREROUTING ip saddr 10.0.2.2/32 tcp dport 30435 accept +insert rule ip filter PREROUTING ip saddr 10.0.2.10/32 tcp dport 30435 accept + +list chain ip filter PREROUTING +table ip filter { + chain PREROUTING { # handle 30 + type filter hook prerouting priority raw; policy accept; + ip saddr 10.0.2.10 tcp dport 30435 accept # handle 34 + ip saddr 10.0.2.2 tcp dport 30435 accept # handle 33 + tcp dport 30435 reject # handle 31 + } +} + +delete rule ip filter PREROUTING handle 34 +delete rule ip filter PREROUTING handle 33 +delete rule ip filter PREROUTING handle 31 + + +# ============================= sudo nft add table ip filter sudo nft add chain ip filter input {type filter hook input priority filter ; policy accept; } diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py index 70424cf25..b947215d0 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py @@ -16,12 +16,16 @@ import logging from flask import request from flask_restful import Api, Resource, abort -from typing import Dict, List, Set, Tuple +from typing import Set, Tuple from .nft_model.DirectionEnum import DirectionEnum from .nft_model.FamilyEnum import FamilyEnum from .nft_model.NFTables import NFTables from .nft_model.Rule import Rule from .nft_model.TableEnum import TableEnum +from .AclRuleToInterfaceDirection import ( + CHAINS_INPUT, CHAINS_OUTPUT, AclRuleToInterfaceDirection, + get_family_from_acl_set_type +) LOGGER = logging.getLogger(__name__) @@ -30,71 +34,6 @@ LOGGER = logging.getLogger(__name__) BASE_URL_ROOT = '/restconf/data/openconfig-acl:acl' BASE_URL_ITEM = '/restconf/data/openconfig-acl:acl/acl-sets/acl-set=' -CHAIN_NAME_INPUT = 'INPUT' -CHAIN_NAME_FORWARD = 'FORWARD' -CHAIN_NAME_OUTPUT = 'OUTPUT' - -CHAINS_INPUT = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD] -CHAINS_OUTPUT = [CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT] -CHAINS_ALL = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT] - -TYPE_ACL_RULE_SEQ_ID = Tuple[str, int] -TYPE_IFACE_DIRECTION = Tuple[str, DirectionEnum] -TYPE_IFACE_DIRECTIONS = List[TYPE_IFACE_DIRECTION] -TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS] - -def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum: - return { - 'ACL_IPV4' : FamilyEnum.IPV4, - 'ACL_IPV6' : FamilyEnum.IPV6, - }[acl_set_type] - -class AclRuleToInterfaceDirection: - def __init__(self, nft : NFTables): - self._nft = nft - self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict() - - def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None: - family = get_family_from_acl_set_type(acl_set_type) - table = self._nft.get_or_create_table(family, TableEnum.FILTER) - for chain_name in chain_names: - table.get_or_create_chain(chain_name) - - def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None: - acl_set_name = acl_set['config']['set-name'] - acl_set_type = acl_set['config']['type'] - - if direction == DirectionEnum.INGRESS: - self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT) - elif direction == DirectionEnum.EGRESS: - self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT) - else: - self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL) - - for acl_set_entry in acl_set['acl-entries']['acl-entry']: - sequence_id = int(acl_set_entry['sequence-id']) - key = (acl_set_name, sequence_id) - if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list()) - if_dir_list.append((if_name, direction)) - - def add_interface(self, interface : Dict) -> None: - if_name = interface['config']['id'] - for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]: - direction_value = direction.value - acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict()) - acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list()) - for acl_set in acl_sets_lst: - self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS) - - def add_interfaces(self, interfaces : List[Dict]) -> None: - for interface in interfaces: - self.add_interface(interface) - - def get_interfaces_directions( - self, acl_set_name : str, sequence_id : int - ) -> TYPE_IFACE_DIRECTIONS: - return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), []) - class ACLs(Resource): def get(self): diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py b/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py new file mode 100644 index 000000000..6f2668fd0 --- /dev/null +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py @@ -0,0 +1,98 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from typing import Dict, List, Tuple +from .nft_model.DirectionEnum import DirectionEnum +from .nft_model.FamilyEnum import FamilyEnum +from .nft_model.NFTables import NFTables +from .nft_model.TableEnum import TableEnum + + +TYPE_ACL_RULE_SEQ_ID = Tuple[str, int] +TYPE_IFACE_DIRECTION = Tuple[str, DirectionEnum] +TYPE_IFACE_DIRECTIONS = List[TYPE_IFACE_DIRECTION] +TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS] + + +CHAIN_NAME_PREROUTING = 'PREROUTING' +CHAIN_NAME_INPUT = 'INPUT' +CHAIN_NAME_FORWARD = 'FORWARD' +CHAIN_NAME_OUTPUT = 'OUTPUT' +CHAIN_NAME_POSTROUTING = 'POSTROUTING' + +CHAINS_INPUT = [ + CHAIN_NAME_PREROUTING, CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD +] +CHAINS_OUTPUT = [ + CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT, CHAIN_NAME_POSTROUTING +] +CHAINS_ALL = [ + CHAIN_NAME_PREROUTING, CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD, + CHAIN_NAME_OUTPUT, CHAIN_NAME_POSTROUTING +] + + +def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum: + return { + 'ACL_IPV4' : FamilyEnum.IPV4, + 'ACL_IPV6' : FamilyEnum.IPV6, + }[acl_set_type] + + +class AclRuleToInterfaceDirection: + def __init__(self, nft : NFTables): + self._nft = nft + self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict() + + def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None: + family = get_family_from_acl_set_type(acl_set_type) + table = self._nft.get_or_create_table(family, TableEnum.FILTER) + for chain_name in chain_names: + table.get_or_create_chain(chain_name) + + def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None: + acl_set_name = acl_set['config']['set-name'] + acl_set_type = acl_set['config']['type'] + + if direction == DirectionEnum.INGRESS: + self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT) + elif direction == DirectionEnum.EGRESS: + self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT) + else: + self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL) + + for acl_set_entry in acl_set['acl-entries']['acl-entry']: + sequence_id = int(acl_set_entry['sequence-id']) + key = (acl_set_name, sequence_id) + if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list()) + if_dir_list.append((if_name, direction)) + + def add_interface(self, interface : Dict) -> None: + if_name = interface['config']['id'] + for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]: + direction_value = direction.value + acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict()) + acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list()) + for acl_set in acl_sets_lst: + self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS) + + def add_interfaces(self, interfaces : List[Dict]) -> None: + for interface in interfaces: + self.add_interface(interface) + + def get_interfaces_directions( + self, acl_set_name : str, sequence_id : int + ) -> TYPE_IFACE_DIRECTIONS: + return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), []) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 7062fea25..cb43a1f8a 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -81,10 +81,11 @@ class Chain: # chains and their removal might cause side effects on NFTables. pass else: + #chain_hook = str(self.chain).lower() parts = [ 'add', 'chain', self.family.value, self.table.value, self.chain, '{', - 'type', self.table.value, 'hook', self.chain, 'priority', self.table.value, ';', + 'type', self.table.value, 'hook', self.chain, 'priority', 'raw', ';', 'policy', 'accept', ';', '}' ] diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index 25d3ed3b6..cdfd1075f 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -225,7 +225,9 @@ class Rule: 'handle', str(self.handle) ] else: - verb = 'add' if self.sequence_id < 1000 else 'insert' + # NOTE: if sequence_id < 10000: insert the rules to the top; + # otherwise, append to the bottom. Anyways, sort rules by sequence_id. + verb = 'insert' if self.sequence_id < 10000 else 'add' parts = [verb, 'rule', self.family.value, self.table.value, self.chain] if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name]) if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name]) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py index b9d1fa86f..10289a0ec 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -33,14 +33,14 @@ class Table: def add_chain_by_entry(self, entry : Dict) -> Chain: name : str = entry.pop('name') - if name.lower() not in {'input', 'output'}: return None + if name.lower() not in {'input', 'output', 'forward', 'prerouting'}: return None chain_obj = self.get_or_create_chain(name) chain_obj.handle = entry['handle'] return chain_obj def add_rule_by_entry(self, entry : Dict) -> None: chain : str = entry.pop('chain') - if chain.lower() not in {'input', 'output'}: return + if chain.lower() not in {'input', 'output', 'forward', 'prerouting'}: return self.get_or_create_chain(chain).add_rule(entry) def to_openconfig(self) -> Tuple[List[Dict], Dict]: -- GitLab From 19c6585fbdfa6d1d3c8fcb193393128220dede84 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:03:48 +0000 Subject: [PATCH 095/371] Tests - Tools - Firewall Agent: - Fixed composition of OpenConfig Interfaces --- .../tools/firewall_agent/firewall_agent/resources/Interfaces.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py index 6a33f70b9..4c8d9e307 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py @@ -31,6 +31,7 @@ class Interfaces(Resource): if_state = copy.deepcopy(if_config) if_state.update({'admin-status': 'UP', 'oper-status': 'UP'}) if_data = {'name': if_name, 'config': if_config, 'state': if_state} + if_list.append(if_data) sif_index = 1 sif_config = {'index': sif_index, 'enabled': True} -- GitLab From 72e8cd84c0c29c4a290129dd56cc4af4ce3519ac Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:07:00 +0000 Subject: [PATCH 096/371] Tests - Tools - Firewall Agent: - Skipped counter rule entry types --- .../firewall_agent/firewall_agent/resources/nft_model/Rule.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index cdfd1075f..a7a0ab4bb 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -65,6 +65,8 @@ class Rule: parse_nft_match(rule, match) elif expr_entry_type in {'accept', 'drop', 'reject'}: rule.action = get_action_from_str(expr_entry_type) + elif expr_entry_type in {'counter'}: + pass # ignore these entry types else: raise UnsupportedElementException('expr_entry', expr_entry) -- GitLab From e4be98d39fe93a1ca18d39bec6dbe54ef3691cc1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:21:07 +0000 Subject: [PATCH 097/371] Tests - Tools - Firewall Agent: - Skipped rules with unsupported fields --- .../firewall_agent/resources/nft_model/Chain.py | 4 +++- .../resources/nft_model/NFTablesParserTools.py | 12 +++++++++++- .../firewall_agent/resources/nft_model/Rule.py | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index cb43a1f8a..a34b7e585 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -30,7 +30,9 @@ class Chain: rules : List[Rule] = field(default_factory=list) def add_rule(self, entry : Dict) -> None: - self.rules.append(Rule.from_nft_entry(self.family, self.table, self.chain, entry)) + rule = Rule.from_nft_entry(self.family, self.table, self.chain, entry) + if rule is None: return + self.rules.append(rule) def to_openconfig(self) -> Tuple[Optional[Dict], Dict]: acl_set_name = f'{self.family.value}-{self.table.value}-{self.chain}' diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py index 8d3476c67..cf9c97523 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py @@ -38,20 +38,24 @@ def parse_nft_ip_addr(right : Union[str, Dict]) -> ipaddress.IPv4Interface: return ipaddress.IPv4Interface(f'{address}/{str(prefix_len)}') -def parse_nft_match(rule : 'Rule', match : Dict) -> None: +def parse_nft_match(rule : 'Rule', match : Dict) -> int: if 'op' not in match: raise MissingFieldException('rule.expr.match.op', match) if 'left' not in match: raise MissingFieldException('rule.expr.match.left', match) if 'right' not in match: raise MissingFieldException('rule.expr.match.right', match) if match['op'] != '==': raise UnsupportedElementException('rule.expr.match.op', match) + num_fields_updated = 0 + match_left = match['left'] match_right = match['right'] if 'meta' in match_left and 'key' in match_left['meta']: meta_key = match_left['meta']['key'] if 'iifname' in meta_key: rule.input_if_name = match_right + num_fields_updated += 1 elif 'oifname' in meta_key: rule.output_if_name = match_right + num_fields_updated += 1 else: raise UnsupportedElementException('rule.expr.match', match) elif 'payload' in match_left: @@ -61,17 +65,23 @@ def parse_nft_match(rule : 'Rule', match : Dict) -> None: field_name = payload['field'] if protocol == 'ip' and field_name == 'saddr': rule.src_ip_addr = parse_nft_ip_addr(match_right) + num_fields_updated += 1 elif protocol == 'ip' and field_name == 'daddr': rule.dst_ip_addr = parse_nft_ip_addr(match_right) + num_fields_updated += 1 elif protocol in {'tcp', 'udp'} and field_name == 'sport': rule.ip_protocol = get_protocol_from_str(protocol) rule.src_port = match_right + num_fields_updated += 1 elif protocol in {'tcp', 'udp'} and field_name == 'dport': rule.ip_protocol = get_protocol_from_str(protocol) rule.dst_port = match_right + num_fields_updated += 1 else: raise UnsupportedElementException('rule.expr.match', match) else: raise UnsupportedElementException('rule.expr.match', match) else: raise UnsupportedElementException('rule.expr.match', match) + + return num_fields_updated \ No newline at end of file diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index a7a0ab4bb..6e66519c5 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -57,19 +57,25 @@ class Rule: if 'expr' not in entry: raise MissingFieldException('rule.expr', entry) expr_list : List[Dict] = entry.pop('expr') + num_fields_updated = 0 for expr_entry in expr_list: expr_entry_fields = set(expr_entry.keys()) expr_entry_type = expr_entry_fields.pop() if expr_entry_type == 'match': match = expr_entry['match'] - parse_nft_match(rule, match) + num_fields_updated += parse_nft_match(rule, match) elif expr_entry_type in {'accept', 'drop', 'reject'}: rule.action = get_action_from_str(expr_entry_type) + num_fields_updated += 1 elif expr_entry_type in {'counter'}: pass # ignore these entry types else: raise UnsupportedElementException('expr_entry', expr_entry) + if len(num_fields_updated) == 0: + # Ignoring empty/unsupported rule... + return None + rule.comment = entry.pop('comment', None) rule.handle = entry['handle'] return rule -- GitLab From 54e5f9069e51fa698a8c95c2868f898d9ad061ef Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:30:14 +0000 Subject: [PATCH 098/371] Tests - Tools - Firewall Agent: - Skipped jump rule entry types --- .../firewall_agent/firewall_agent/resources/nft_model/Rule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index 6e66519c5..bafc2f4a6 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -67,7 +67,7 @@ class Rule: elif expr_entry_type in {'accept', 'drop', 'reject'}: rule.action = get_action_from_str(expr_entry_type) num_fields_updated += 1 - elif expr_entry_type in {'counter'}: + elif expr_entry_type in {'counter', 'jump'}: pass # ignore these entry types else: raise UnsupportedElementException('expr_entry', expr_entry) -- GitLab From e2402e08fe045a8de5ce23ae5a35e0d4a41588a6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:30:57 +0000 Subject: [PATCH 099/371] Disabled CI/CD tests --- .gitlab-ci.yml | 98 +++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2856f9fed..1e757241d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,52 +12,54 @@ # See the License for the specific language governing permissions and # limitations under the License. -# stages of the cicd pipeline -stages: - #- dependencies - - build - - unit_test - - end2end_test -# include the individual .gitlab-ci.yml of each micro-service and tests -include: - #- local: '/manifests/.gitlab-ci.yml' - - local: '/src/monitoring/.gitlab-ci.yml' - - local: '/src/nbi/.gitlab-ci.yml' - - local: '/src/context/.gitlab-ci.yml' - - local: '/src/device/.gitlab-ci.yml' - - local: '/src/service/.gitlab-ci.yml' - - local: '/src/qkd_app/.gitlab-ci.yml' - - local: '/src/dbscanserving/.gitlab-ci.yml' - - local: '/src/opticalattackmitigator/.gitlab-ci.yml' - - local: '/src/opticalattackdetector/.gitlab-ci.yml' - - local: '/src/opticalattackmanager/.gitlab-ci.yml' - - local: '/src/opticalcontroller/.gitlab-ci.yml' - - local: '/src/ztp/.gitlab-ci.yml' - - local: '/src/policy/.gitlab-ci.yml' - - local: '/src/automation/.gitlab-ci.yml' - - local: '/src/forecaster/.gitlab-ci.yml' - #- local: '/src/webui/.gitlab-ci.yml' - #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' - #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' - - local: '/src/slice/.gitlab-ci.yml' - #- local: '/src/interdomain/.gitlab-ci.yml' - - local: '/src/pathcomp/.gitlab-ci.yml' - #- local: '/src/dlt/.gitlab-ci.yml' - - local: '/src/load_generator/.gitlab-ci.yml' - - local: '/src/bgpls_speaker/.gitlab-ci.yml' - - local: '/src/kpi_manager/.gitlab-ci.yml' - - local: '/src/kpi_value_api/.gitlab-ci.yml' - #- local: '/src/kpi_value_writer/.gitlab-ci.yml' - #- local: '/src/telemetry/.gitlab-ci.yml' - - local: '/src/analytics/.gitlab-ci.yml' - - local: '/src/qos_profile/.gitlab-ci.yml' - - local: '/src/vnt_manager/.gitlab-ci.yml' - - local: '/src/e2e_orchestrator/.gitlab-ci.yml' - - local: '/src/ztp_server/.gitlab-ci.yml' - - local: '/src/osm_client/.gitlab-ci.yml' - - local: '/src/simap_connector/.gitlab-ci.yml' - - # This should be last one: end-to-end integration tests - - local: '/src/tests/.gitlab-ci.yml' +## stages of the cicd pipeline +#stages: +# #- dependencies +# - build +# - unit_test +# - end2end_test +# +## include the individual .gitlab-ci.yml of each micro-service and tests +#include: +# #- local: '/manifests/.gitlab-ci.yml' +# - local: '/src/monitoring/.gitlab-ci.yml' +# - local: '/src/nbi/.gitlab-ci.yml' +# - local: '/src/context/.gitlab-ci.yml' +# - local: '/src/device/.gitlab-ci.yml' +# - local: '/src/service/.gitlab-ci.yml' +# - local: '/src/qkd_app/.gitlab-ci.yml' +# - local: '/src/dbscanserving/.gitlab-ci.yml' +# - local: '/src/opticalattackmitigator/.gitlab-ci.yml' +# - local: '/src/opticalattackdetector/.gitlab-ci.yml' +# - local: '/src/opticalattackmanager/.gitlab-ci.yml' +# - local: '/src/opticalcontroller/.gitlab-ci.yml' +# - local: '/src/ztp/.gitlab-ci.yml' +# - local: '/src/policy/.gitlab-ci.yml' +# - local: '/src/automation/.gitlab-ci.yml' +# - local: '/src/forecaster/.gitlab-ci.yml' +# #- local: '/src/webui/.gitlab-ci.yml' +# #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' +# #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' +# - local: '/src/slice/.gitlab-ci.yml' +# #- local: '/src/interdomain/.gitlab-ci.yml' +# - local: '/src/pathcomp/.gitlab-ci.yml' +# #- local: '/src/dlt/.gitlab-ci.yml' +# - local: '/src/load_generator/.gitlab-ci.yml' +# - local: '/src/bgpls_speaker/.gitlab-ci.yml' +# - local: '/src/kpi_manager/.gitlab-ci.yml' +# - local: '/src/kpi_value_api/.gitlab-ci.yml' +# #- local: '/src/kpi_value_writer/.gitlab-ci.yml' +# #- local: '/src/telemetry/.gitlab-ci.yml' +# - local: '/src/analytics/.gitlab-ci.yml' +# - local: '/src/qos_profile/.gitlab-ci.yml' +# - local: '/src/vnt_manager/.gitlab-ci.yml' +# - local: '/src/e2e_orchestrator/.gitlab-ci.yml' +# - local: '/src/ztp_server/.gitlab-ci.yml' +# - local: '/src/osm_client/.gitlab-ci.yml' +# - local: '/src/simap_connector/.gitlab-ci.yml' +# +# # This should be last one: end-to-end integration tests +# - local: '/src/tests/.gitlab-ci.yml' +# \ No newline at end of file -- GitLab From bd69eba917a33b70802892c3161239a86988846c Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:32:08 +0000 Subject: [PATCH 100/371] Tests - Tools - Firewall Agent: - Fix in rule skipper --- .../firewall_agent/firewall_agent/resources/nft_model/Rule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index bafc2f4a6..6be73c772 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -72,7 +72,7 @@ class Rule: else: raise UnsupportedElementException('expr_entry', expr_entry) - if len(num_fields_updated) == 0: + if num_fields_updated == 0: # Ignoring empty/unsupported rule... return None -- GitLab From 80a3a750a7923a65a54dfef47b075388fa99f196 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 15:45:59 +0000 Subject: [PATCH 101/371] Tests - Tools - Firewall Agent: - Fix in rule skipper --- .../firewall_agent/resources/nft_model/Exceptions.py | 4 ++-- .../firewall_agent/firewall_agent/resources/nft_model/Rule.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py index 0ac157de9..9c4956a7c 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py @@ -43,9 +43,9 @@ class MalformedOutputException(Exception): ) class UnsupportedElementException(Exception): - def __init__(self, element_type : str, value : str) -> None: + def __init__(self, element : str, value : str) -> None: super().__init__( - f'Unsupported: element_type={str(element_type)} value={str(value)}' + f'Unsupported: element={str(element)} value={str(value)}' ) class MissingFieldException(Exception): diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index 6be73c772..da59cdbdb 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -56,7 +56,7 @@ class Rule: rule : 'Rule' = cls(family, table, chain) if 'expr' not in entry: raise MissingFieldException('rule.expr', entry) - expr_list : List[Dict] = entry.pop('expr') + expr_list : List[Dict] = entry['expr'] num_fields_updated = 0 for expr_entry in expr_list: expr_entry_fields = set(expr_entry.keys()) @@ -67,7 +67,7 @@ class Rule: elif expr_entry_type in {'accept', 'drop', 'reject'}: rule.action = get_action_from_str(expr_entry_type) num_fields_updated += 1 - elif expr_entry_type in {'counter', 'jump'}: + elif expr_entry_type in {'counter', 'jump', 'xt'}: pass # ignore these entry types else: raise UnsupportedElementException('expr_entry', expr_entry) -- GitLab From cc528bc05e6f80c64a99bb9d711f067a04f1486e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 16:01:05 +0000 Subject: [PATCH 102/371] Tests - Tools - Firewall Agent: - Moved old test files to tests folder - Arranged new ACL data files and test commands - Removed olf TODO file --- src/tests/tools/firewall_agent/docs/TODO.md | 10 ------- .../data/allow_30435_from_10_0_2_10.json | 27 ++++++++++++++++++ .../data/allow_30435_from_10_0_2_2.json | 27 ++++++++++++++++++ ...435_all.json => block_30435_from_all.json} | 6 ++-- .../firewall_agent/scripts/test_commands.sh | 20 ++++++------- .../{ => tests}/docker-compose-down.sh | 0 .../{ => tests}/docker-compose-up.sh | 0 .../{ => tests}/docker-compose.yml | 0 .../data => tests}/oc_acl_block_8001.json | 0 .../data => tests}/oc_acl_block_8002.json | 0 .../data => tests}/oc_acl_multi_rule.json | 0 .../firewall_agent/tests/test_commands.sh | 28 +++++++++++++++++++ 12 files changed, 93 insertions(+), 25 deletions(-) delete mode 100644 src/tests/tools/firewall_agent/docs/TODO.md create mode 100644 src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json create mode 100644 src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json rename src/tests/tools/firewall_agent/scripts/data/{oc_acl_block_30435_all.json => block_30435_from_all.json} (81%) rename src/tests/tools/firewall_agent/{ => tests}/docker-compose-down.sh (100%) rename src/tests/tools/firewall_agent/{ => tests}/docker-compose-up.sh (100%) rename src/tests/tools/firewall_agent/{ => tests}/docker-compose.yml (100%) rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_block_8001.json (100%) rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_block_8002.json (100%) rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_multi_rule.json (100%) create mode 100755 src/tests/tools/firewall_agent/tests/test_commands.sh diff --git a/src/tests/tools/firewall_agent/docs/TODO.md b/src/tests/tools/firewall_agent/docs/TODO.md deleted file mode 100644 index 75a026986..000000000 --- a/src/tests/tools/firewall_agent/docs/TODO.md +++ /dev/null @@ -1,10 +0,0 @@ -# TODO - -- To block traffic to a MicroK8s service, apply rule: - `sudo nft add/insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop` - - - when applying to ingress, also apply to FORWARD - - when applying to egress, also apply to FORWARD - - rules (INPUT, FORWARD, OUTPUT) should be applied based on sequence_id - - negative sequence_id => insert on top (first -1, then -2, then -3) so that order of rules is -3,-2,-1 at top of the chain - - positive sequence_id => append on bottom (first 0, then 1, then 2) so that order of rules is 0, 1, 2 at bottom of the chain diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json new file mode 100644 index 000000000..e80184037 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json @@ -0,0 +1,27 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-10"}, + "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 30435}}, + "actions": {"config": {"forwarding-action": "ALLOW"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "enp0s3", + "config": {"id": "enp0s3"}, + "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json new file mode 100644 index 000000000..9029e91b4 --- /dev/null +++ b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json @@ -0,0 +1,27 @@ +{"openconfig-acl:acl": { + "acl-sets": {"acl-set": [{ + "name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [ + { + "sequence-id": 1, + "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-2"}, + "ipv4": {"config": {"source-address": "10.0.2.2/32", "protocol": "IP_TCP"}}, + "transport": {"config": {"destination-port": 30435}}, + "actions": {"config": {"forwarding-action": "ALLOW"}} + } + ]} + }]}, + "interfaces": {"interface": [{ + "id": "enp0s3", + "config": {"id": "enp0s3"}, + "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}}, + "ingress-acl-sets": {"ingress-acl-set": [ + { + "set-name": "ip-filter-input", "type": "ACL_IPV4", + "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, + "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + } + ]} + }]} +}} diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json b/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json similarity index 81% rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json rename to src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json index 5e50f560a..8f474d330 100644 --- a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json +++ b/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json @@ -4,8 +4,8 @@ "config": {"name": "ip-filter-input", "type": "ACL_IPV4"}, "acl-entries": {"acl-entry": [ { - "sequence-id": 1, - "config": {"sequence-id": 1, "description": "drop-30435-all"}, + "sequence-id": 10000, + "config": {"sequence-id": 10000, "description": "drop-30435-from-all"}, "ipv4": {"config": {"protocol": "IP_TCP"}}, "transport": {"config": {"destination-port": 30435}}, "actions": {"config": {"forwarding-action": "DROP"}} @@ -20,7 +20,7 @@ { "set-name": "ip-filter-input", "type": "ACL_IPV4", "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"}, - "acl-entries": {"acl-entry": [{"sequence-id": 1}]} + "acl-entries": {"acl-entry": [{"sequence-id": 10000}]} } ]} }]} diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh index 9db629ff9..9acad4ab0 100755 --- a/src/tests/tools/firewall_agent/scripts/test_commands.sh +++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh @@ -18,18 +18,14 @@ curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl -wget -q -O- http://localhost:8001 -wget -q -O- http://localhost:8002 +curl -X POST -d @scripts/data/block_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/allow_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/allow_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl - -wget -q -O- http://localhost:8001 -wget -q -O- http://localhost:8002 +curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-2 +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-10 +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=block-30435-from-all -curl -X POST -d @scripts/data/oc_acl_block_30435_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-30435-all +curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl diff --git a/src/tests/tools/firewall_agent/docker-compose-down.sh b/src/tests/tools/firewall_agent/tests/docker-compose-down.sh similarity index 100% rename from src/tests/tools/firewall_agent/docker-compose-down.sh rename to src/tests/tools/firewall_agent/tests/docker-compose-down.sh diff --git a/src/tests/tools/firewall_agent/docker-compose-up.sh b/src/tests/tools/firewall_agent/tests/docker-compose-up.sh similarity index 100% rename from src/tests/tools/firewall_agent/docker-compose-up.sh rename to src/tests/tools/firewall_agent/tests/docker-compose-up.sh diff --git a/src/tests/tools/firewall_agent/docker-compose.yml b/src/tests/tools/firewall_agent/tests/docker-compose.yml similarity index 100% rename from src/tests/tools/firewall_agent/docker-compose.yml rename to src/tests/tools/firewall_agent/tests/docker-compose.yml diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8001.json similarity index 100% rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json rename to src/tests/tools/firewall_agent/tests/oc_acl_block_8001.json diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8002.json similarity index 100% rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json rename to src/tests/tools/firewall_agent/tests/oc_acl_block_8002.json diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json b/src/tests/tools/firewall_agent/tests/oc_acl_multi_rule.json similarity index 100% rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json rename to src/tests/tools/firewall_agent/tests/oc_acl_multi_rule.json diff --git a/src/tests/tools/firewall_agent/tests/test_commands.sh b/src/tests/tools/firewall_agent/tests/test_commands.sh new file mode 100755 index 000000000..5e82b0913 --- /dev/null +++ b/src/tests/tools/firewall_agent/tests/test_commands.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +wget -q -O- http://localhost:8001 +wget -q -O- http://localhost:8002 + +curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl + +wget -q -O- http://localhost:8001 +wget -q -O- http://localhost:8002 + +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext -- GitLab From ff0f2d41e770ef02d6f6dab98dc553e56da3f389 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 16:10:10 +0000 Subject: [PATCH 103/371] Tests - Tools - Firewall Agent: - Fixed formatting of table and chain rules --- .../firewall_agent/firewall_agent/resources/nft_model/Chain.py | 2 +- .../firewall_agent/firewall_agent/resources/nft_model/Table.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index a34b7e585..6ff7e8d8d 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -91,7 +91,7 @@ class Chain: 'policy', 'accept', ';', '}' ] - commands.append(-1, ' '.join(parts)) + commands.append((-1, ' '.join(parts))) for rule in self.rules: commands.append(rule.get_command(removal=removal)) return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py index 10289a0ec..ea8bf064e 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -80,7 +80,7 @@ class Table: pass else: parts = ['add', 'table', self.family.value, self.table.value] - commands.append(-2, ' '.join(parts)) + commands.append((-2, ' '.join(parts))) for chain in self.chains.values(): commands.extend(chain.get_commands(removal=removal)) return commands -- GitLab From 8b3c5d3f2954c7fb1c23f496d2126f44cb726ee4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 16:12:12 +0000 Subject: [PATCH 104/371] Tests - Tools - Firewall Agent: - Fixed formatting of chain rules --- .../firewall_agent/resources/nft_model/Chain.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 6ff7e8d8d..0e217c80f 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -83,11 +83,11 @@ class Chain: # chains and their removal might cause side effects on NFTables. pass else: - #chain_hook = str(self.chain).lower() + chain_hook = str(self.chain).lower() parts = [ 'add', 'chain', self.family.value, self.table.value, self.chain, '{', - 'type', self.table.value, 'hook', self.chain, 'priority', 'raw', ';', + 'type', self.table.value, 'hook', chain_hook, 'priority', 'raw', ';', 'policy', 'accept', ';', '}' ] -- GitLab From 8a741e5ebeb8cbd1ef164f0b7350cd3f9ff10ce2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 16:57:23 +0000 Subject: [PATCH 105/371] Tests - Tools - Firewall Agent: - Discover existing tables and chains before configuring a rule from OpenConfigACL --- .../firewall_agent/resources/ACLs.py | 1 + .../resources/nft_model/Chain.py | 41 ++++++++++++++++++- .../resources/nft_model/NFTables.py | 7 ++-- .../resources/nft_model/Table.py | 16 +++++--- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py index b947215d0..945c98beb 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py @@ -60,6 +60,7 @@ class ACLs(Resource): abort(400, message='invalid interfaces') nft = NFTables() + nft.load(skip_rules=True) arid = AclRuleToInterfaceDirection(nft) arid.add_interfaces(interfaces) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 0e217c80f..9c20f6f0f 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -13,22 +13,61 @@ # limitations under the License. +import enum from dataclasses import dataclass, field from typing import Dict, List, Optional, Set, Tuple +from .ActionEnum import ActionEnum from .DirectionEnum import DirectionEnum from .FamilyEnum import FamilyEnum from .TableEnum import TableEnum from .Rule import Rule +class ChainPriorityEnum(enum.IntEnum): + RAW = -300 + MANGLE = -150 + FILTER = 0 + @dataclass class Chain: family : FamilyEnum table : TableEnum chain : str - handle : Optional[int] = None + handle : Optional[int ] = None + type : Optional[str ] = None + hook : Optional[str ] = None + prio : Optional[int ] = None + policy : Optional[ActionEnum] = None rules : List[Rule] = field(default_factory=list) + @classmethod + def from_manual( + cls, family : FamilyEnum, table : TableEnum, name : str, + handle : Optional[int] = None, type_ : Optional[str] = None, + hook : Optional[str] = None, prio : int = ChainPriorityEnum.RAW.value, + policy : ActionEnum = ActionEnum.ACCEPT + ) -> 'Chain': + chain : 'Chain' = cls(family, table, name) + chain.handle = handle + if type_ is None: type_ = str(table.value).lower() + if hook is None: hook = str(name).lower() + chain.prio = prio + chain.policy = policy + return chain + + @classmethod + def from_nft_entry( + cls, family : FamilyEnum, table : TableEnum, entry : Dict + ) -> 'Chain': + name : str = entry['name'] + chain : 'Chain' = cls(family, table, name) + chain.handle = entry['handle'] + chain.type = entry.get('type', table.value.lower()) + chain.hook = entry.get('hook', name.lower()) + chain.prio = entry.get('prio', ChainPriorityEnum.RAW.value) + chain.policy = entry.get('policy', ActionEnum.ACCEPT.value) + return chain + def add_rule(self, entry : Dict) -> None: rule = Rule.from_nft_entry(self.family, self.table, self.chain, entry) if rule is None: return diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py index 1d13aa93b..7c3aea14b 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py @@ -35,15 +35,15 @@ class NFTables: def load( self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None, - chain : Optional[str] = None + chain : Optional[str] = None, skip_rules : bool = False ) -> None: entries = NFTablesCommand.list(family=family, table=table, chain=chain) - for entry in entries: self.parse_entry(entry) + for entry in entries: self.parse_entry(entry, skip_rules=skip_rules) def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table: return self.tables.setdefault((family, table), Table(family, table)) - def parse_entry(self, entry : Dict) -> None: + def parse_entry(self, entry : Dict, skip_rules : bool = False) -> None: entry_fields = set(entry.keys()) if len(entry_fields) != 1: raise UnsupportedElementException('entry', entry) entry_type = entry_fields.pop() @@ -54,6 +54,7 @@ class NFTables: elif entry_type in {'chain'}: self.parse_entry_chain(entry['chain']) elif entry_type in {'rule'}: + if skip_rules: return self.parse_entry_rule(entry['rule']) else: raise UnsupportedElementException('entry', entry) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py index ea8bf064e..9522772e3 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -28,20 +28,24 @@ class Table: handle : Optional[int] = None chains : Dict[str, Chain] = field(default_factory=dict) + def get_chain(self, name : str) -> Chain: + return self.chains[name] + def get_or_create_chain(self, name : str) -> Chain: - return self.chains.setdefault(name, Chain(self.family, self.table, name)) + return self.chains.setdefault(name, Chain.from_manual(self.family, self.table, name)) def add_chain_by_entry(self, entry : Dict) -> Chain: - name : str = entry.pop('name') + name : str = entry['name'] if name.lower() not in {'input', 'output', 'forward', 'prerouting'}: return None - chain_obj = self.get_or_create_chain(name) - chain_obj.handle = entry['handle'] - return chain_obj + if name in self.chains: return self.chains[name] + chain = Chain.from_nft_entry(self.family, self.table, entry) + self.chains[name] = chain + return chain def add_rule_by_entry(self, entry : Dict) -> None: chain : str = entry.pop('chain') if chain.lower() not in {'input', 'output', 'forward', 'prerouting'}: return - self.get_or_create_chain(chain).add_rule(entry) + self.get_chain(chain).add_rule(entry) def to_openconfig(self) -> Tuple[List[Dict], Dict]: acl_sets : List[Dict] = list() -- GitLab From 59f2a1ea32a5333033428c11c784e31052cf723b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 17:49:14 +0000 Subject: [PATCH 106/371] Tests - Tools - Firewall Agent: - Fixed discovery of existing tables and chains - Fixed chain addition command - Fixed parsing of ACL entries - Fixed test commands and data files --- .../resources/nft_model/Chain.py | 6 +-- .../resources/nft_model/Exceptions.py | 10 ++-- .../resources/nft_model/Rule.py | 48 +++++++++++++++---- ....json => accept_30435_from_10_0_2_10.json} | 4 +- ...2.json => accept_30435_from_10_0_2_2.json} | 4 +- ...om_all.json => reject_30435_from_all.json} | 4 +- .../firewall_agent/scripts/test_commands.sh | 12 ++--- 7 files changed, 59 insertions(+), 29 deletions(-) rename src/tests/tools/firewall_agent/scripts/data/{allow_30435_from_10_0_2_10.json => accept_30435_from_10_0_2_10.json} (85%) rename src/tests/tools/firewall_agent/scripts/data/{allow_30435_from_10_0_2_2.json => accept_30435_from_10_0_2_2.json} (85%) rename src/tests/tools/firewall_agent/scripts/data/{block_30435_from_all.json => reject_30435_from_all.json} (91%) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 9c20f6f0f..261f19b64 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -64,7 +64,7 @@ class Chain: chain.handle = entry['handle'] chain.type = entry.get('type', table.value.lower()) chain.hook = entry.get('hook', name.lower()) - chain.prio = entry.get('prio', ChainPriorityEnum.RAW.value) + chain.prio = entry.get('prio', ChainPriorityEnum.FILTER.value) chain.policy = entry.get('policy', ActionEnum.ACCEPT.value) return chain @@ -126,8 +126,8 @@ class Chain: parts = [ 'add', 'chain', self.family.value, self.table.value, self.chain, '{', - 'type', self.table.value, 'hook', chain_hook, 'priority', 'raw', ';', - 'policy', 'accept', ';', + 'type', self.type, 'hook', self.hook, 'priority', str(self.prio), ';', + 'policy', self.policy, ';', '}' ] commands.append((-1, ' '.join(parts))) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py index 9c4956a7c..17bb3441e 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py @@ -43,10 +43,12 @@ class MalformedOutputException(Exception): ) class UnsupportedElementException(Exception): - def __init__(self, element : str, value : str) -> None: - super().__init__( - f'Unsupported: element={str(element)} value={str(value)}' - ) + def __init__( + self, element : str, value : str, extra : Optional[str] = None + ) -> None: + msg = f'Unsupported: element={str(element)} value={str(value)}' + if extra is not None: msg += f' {str(extra)}' + super().__init__(msg) class MissingFieldException(Exception): def __init__(self, field_name : str, objekt : Dict) -> None: diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index da59cdbdb..5a839f3e1 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -28,6 +28,40 @@ from .TableEnum import TableEnum LOGGER = logging.getLogger(__name__) +OPENCONFIG_ACL_ACTION_TO_NFT = { + 'ACCEPT' : ActionEnum.ACCEPT, + 'DROP' : ActionEnum.DROP, + 'REJECT' : ActionEnum.REJECT, +} + +def get_nft_action_from_openconfig(oc_action : str) -> ActionEnum: + nft_action = OPENCONFIG_ACL_ACTION_TO_NFT.get(oc_action) + if nft_action is None: + supported_values = set(OPENCONFIG_ACL_ACTION_TO_NFT.keys()) + raise UnsupportedElementException( + 'acl_entry.actions.config.forwarding-action', str(oc_action), + extra=f'supported_values={str(supported_values)}' + ) + return nft_action + + +OPENCONFIG_IPV4_PROTOCOL_TO_NFT = { + 'IP_TCP' : ProtocolEnum.TCP, + 'IP_UDP' : ProtocolEnum.UDP, + 'IP_ICMP' : ProtocolEnum.ICMP, +} + +def get_nft_ipv4_protocol_from_openconfig(oc_ipv4_protocol : str) -> ProtocolEnum: + nft_protocol = OPENCONFIG_IPV4_PROTOCOL_TO_NFT.get(oc_ipv4_protocol) + if nft_protocol is None: + supported_values = set(OPENCONFIG_IPV4_PROTOCOL_TO_NFT.keys()) + raise UnsupportedElementException( + 'acl_entry.ipv4.config.protocol', str(oc_ipv4_protocol), + extra=f'supported_values={str(supported_values)}' + ) + return nft_protocol + + @dataclass class Rule: family : FamilyEnum @@ -97,21 +131,15 @@ class Rule: rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address']) if 'protocol' in ipv4_config: - rule.ip_protocol = { - 'IP_TCP' : ProtocolEnum.TCP, - 'IP_UDP' : ProtocolEnum.UDP, - 'IP_ICMP' : ProtocolEnum.ICMP, - }.get(ipv4_config['protocol'], None) + ip_protocol = ipv4_config['protocol'] + rule.ip_protocol = get_nft_ipv4_protocol_from_openconfig(ip_protocol) transp_config = acl_entry.get('transport', {}).get('config', {}) rule.src_port = transp_config.get('source-port') rule.dst_port = transp_config.get('destination-port') - rule.action = { - 'ACCEPT' : ActionEnum.ACCEPT, - 'DROP' : ActionEnum.DROP, - 'REJECT' : ActionEnum.REJECT, - }.get(acl_entry['actions']['config']['forwarding-action'], None) + action = acl_entry['actions']['config']['forwarding-action'] + rule.action = get_nft_action_from_openconfig(action) return rule diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json similarity index 85% rename from src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json rename to src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json index e80184037..e46bd1f26 100644 --- a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json +++ b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json @@ -5,10 +5,10 @@ "acl-entries": {"acl-entry": [ { "sequence-id": 1, - "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-10"}, + "config": {"sequence-id": 1, "description": "accept-30435-from-10-0-2-10"}, "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}}, "transport": {"config": {"destination-port": 30435}}, - "actions": {"config": {"forwarding-action": "ALLOW"}} + "actions": {"config": {"forwarding-action": "ACCEPT"}} } ]} }]}, diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json similarity index 85% rename from src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json rename to src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json index 9029e91b4..df18d93c1 100644 --- a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json +++ b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json @@ -5,10 +5,10 @@ "acl-entries": {"acl-entry": [ { "sequence-id": 1, - "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-2"}, + "config": {"sequence-id": 1, "description": "accept-30435-from-10-0-2-2"}, "ipv4": {"config": {"source-address": "10.0.2.2/32", "protocol": "IP_TCP"}}, "transport": {"config": {"destination-port": 30435}}, - "actions": {"config": {"forwarding-action": "ALLOW"}} + "actions": {"config": {"forwarding-action": "ACCEPT"}} } ]} }]}, diff --git a/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json similarity index 91% rename from src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json rename to src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json index 8f474d330..99ac22dd0 100644 --- a/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json +++ b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json @@ -5,10 +5,10 @@ "acl-entries": {"acl-entry": [ { "sequence-id": 10000, - "config": {"sequence-id": 10000, "description": "drop-30435-from-all"}, + "config": {"sequence-id": 10000, "description": "reject-30435-from-all"}, "ipv4": {"config": {"protocol": "IP_TCP"}}, "transport": {"config": {"destination-port": 30435}}, - "actions": {"config": {"forwarding-action": "DROP"}} + "actions": {"config": {"forwarding-action": "REJECT"}} } ]} }]}, diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh index 9acad4ab0..22da27d92 100755 --- a/src/tests/tools/firewall_agent/scripts/test_commands.sh +++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh @@ -18,14 +18,14 @@ curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/block_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/allow_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl -curl -X POST -d @scripts/data/allow_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/reject_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/accept_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl +curl -X POST -d @scripts/data/accept_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-2 -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-10 -curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=block-30435-from-all +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=accept-30435-from-10-0-2-2 +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=accept-30435-from-10-0-2-10 +curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=reject-30435-from-all curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl -- GitLab From cdb68dca9f07e64f8ba5ee149980b920b297fd96 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 18:10:18 +0000 Subject: [PATCH 107/371] Declared new Device Driver RESTCONF_OPENCONFIG --- proto/context.proto | 1 + src/common/type_checkers/Assertions.py | 2 + .../database/models/enums/DeviceDriver.py | 1 + .../drivers/ietf_l2vpn/TfsApiClient.py | 3 + .../drivers/ietf_l3vpn/TfsApiClient.py | 3 + .../drivers/ietf_slice/TfsApiClient.py | 3 + .../drivers/optical_tfs/TfsApiClient.py | 3 + .../java/org/etsi/tfs/policy/Serializer.java | 40 +++++++++++ .../service_handler_api/FilterFields.py | 1 + src/webui/service/device/forms.py | 2 + src/webui/service/device/routes.py | 4 ++ .../java/org/etsi/tfs/ztp/Serializer.java | 72 +++++++++++++++---- 12 files changed, 121 insertions(+), 14 deletions(-) diff --git a/proto/context.proto b/proto/context.proto index 320e553c5..62b21b449 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -254,6 +254,7 @@ enum DeviceDriverEnum { DEVICEDRIVER_RYU = 18; DEVICEDRIVER_GNMI_NOKIA_SRLINUX = 19; DEVICEDRIVER_OPENROADM = 20; + DEVICEDRIVER_RESTCONF_OPENCONFIG = 21; } enum DeviceOperationalStatusEnum { diff --git a/src/common/type_checkers/Assertions.py b/src/common/type_checkers/Assertions.py index 478186059..4ceb620a5 100644 --- a/src/common/type_checkers/Assertions.py +++ b/src/common/type_checkers/Assertions.py @@ -58,6 +58,8 @@ def validate_device_driver_enum(message): 'DEVICEDRIVER_MORPHEUS', 'DEVICEDRIVER_RYU', 'DEVICEDRIVER_GNMI_NOKIA_SRLINUX', + 'DEVICEDRIVER_OPENROADM', + 'DEVICEDRIVER_GNMI_OPENCONFIG', ] def validate_device_operational_status_enum(message): diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index faa8ace3a..7f45d82ec 100644 --- a/src/context/service/database/models/enums/DeviceDriver.py +++ b/src/context/service/database/models/enums/DeviceDriver.py @@ -43,6 +43,7 @@ class ORM_DeviceDriverEnum(enum.Enum): RYU = DeviceDriverEnum.DEVICEDRIVER_RYU GNMI_NOKIA_SRLINUX = DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX OPENROADM = DeviceDriverEnum.DEVICEDRIVER_OPENROADM + RESTCONF_OPENCONFIG = DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG grpc_to_enum__device_driver = functools.partial( grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum) diff --git a/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py index ac2106716..1b906b820 100644 --- a/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py +++ b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py @@ -47,6 +47,9 @@ MAPPING_DRIVER = { 'DEVICEDRIVER_SMARTNIC' : 16, 'DEVICEDRIVER_MORPHEUS' : 17, 'DEVICEDRIVER_RYU' : 18, + 'DEVICEDRIVER_GNMI_NOKIA_SRLINUX' : 19, + 'DEVICEDRIVER_OPENROADM' : 20, + 'DEVICEDRIVER_RESTCONF_OPENCONFIG' : 21, } LOGGER = logging.getLogger(__name__) diff --git a/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py index de695685c..c984c1adf 100644 --- a/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py +++ b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py @@ -53,6 +53,9 @@ MAPPING_DRIVER = { 'DEVICEDRIVER_SMARTNIC' : 16, 'DEVICEDRIVER_MORPHEUS' : 17, 'DEVICEDRIVER_RYU' : 18, + 'DEVICEDRIVER_GNMI_NOKIA_SRLINUX' : 19, + 'DEVICEDRIVER_OPENROADM' : 20, + 'DEVICEDRIVER_RESTCONF_OPENCONFIG' : 21, } diff --git a/src/device/service/drivers/ietf_slice/TfsApiClient.py b/src/device/service/drivers/ietf_slice/TfsApiClient.py index 08c9b78e0..0388e9105 100644 --- a/src/device/service/drivers/ietf_slice/TfsApiClient.py +++ b/src/device/service/drivers/ietf_slice/TfsApiClient.py @@ -54,6 +54,9 @@ MAPPING_DRIVER = { 'DEVICEDRIVER_SMARTNIC' : 16, 'DEVICEDRIVER_MORPHEUS' : 17, 'DEVICEDRIVER_RYU' : 18, + 'DEVICEDRIVER_GNMI_NOKIA_SRLINUX' : 19, + 'DEVICEDRIVER_OPENROADM' : 20, + 'DEVICEDRIVER_RESTCONF_OPENCONFIG' : 21, } diff --git a/src/device/service/drivers/optical_tfs/TfsApiClient.py b/src/device/service/drivers/optical_tfs/TfsApiClient.py index 79802fcf6..59126c7b1 100644 --- a/src/device/service/drivers/optical_tfs/TfsApiClient.py +++ b/src/device/service/drivers/optical_tfs/TfsApiClient.py @@ -55,6 +55,9 @@ MAPPING_DRIVER = { 'DEVICEDRIVER_SMARTNIC' : 16, 'DEVICEDRIVER_MORPHEUS' : 17, 'DEVICEDRIVER_RYU' : 18, + 'DEVICEDRIVER_GNMI_NOKIA_SRLINUX' : 19, + 'DEVICEDRIVER_OPENROADM' : 20, + 'DEVICEDRIVER_RESTCONF_OPENCONFIG' : 21, } LOGGER = logging.getLogger(__name__) diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java b/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java index 7fc4c8b8c..20dcd2bd3 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java @@ -2319,8 +2319,28 @@ public class Serializer { return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS; case IETF_ACTN: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN; + case OC: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OC; + case QKD: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_QKD; + case IETF_L3VPN: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN; + case IETF_SLICE: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE; + case NCE: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_NCE; case SMARTNIC: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_SMARTNIC; + case MORPHEUS: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_MORPHEUS; + case RYU: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RYU; + case GNMI_NOKIA_SRLINUX: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX; + case OPENROADM: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPENROADM; + case RESTCONF_OPENCONFIG: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG; case UNDEFINED: default: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_UNDEFINED; @@ -2350,8 +2370,28 @@ public class Serializer { return DeviceDriverEnum.OPTICAL_TFS; case DEVICEDRIVER_IETF_ACTN: return DeviceDriverEnum.IETF_ACTN; + case DEVICEDRIVER_OC: + return DeviceDriverEnum.OC; + case DEVICEDRIVER_QKD: + return DeviceDriverEnum.QKD; + case DEVICEDRIVER_IETF_L3VPN: + return DeviceDriverEnum.IETF_L3VPN; + case DEVICEDRIVER_IETF_SLICE: + return DeviceDriverEnum.IETF_SLICE; + case DEVICEDRIVER_NCE: + return DeviceDriverEnum.NCE; case DEVICEDRIVER_SMARTNIC: return DeviceDriverEnum.SMARTNIC; + case DEVICEDRIVER_MORPHEUS: + return DeviceDriverEnum.MORPHEUS; + case DEVICEDRIVER_RYU: + return DeviceDriverEnum.RYU; + case DEVICEDRIVER_GNMI_NOKIA_SRLINUX: + return DeviceDriverEnum.GNMI_NOKIA_SRLINUX; + case DEVICEDRIVER_OPENROADM: + return DeviceDriverEnum.OPENROADM; + case DEVICEDRIVER_RESTCONF_OPENCONFIG: + return DeviceDriverEnum.RESTCONF_OPENCONFIG; case DEVICEDRIVER_UNDEFINED: case UNRECOGNIZED: default: diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index 6da1d6f55..473efa3e0 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -58,6 +58,7 @@ DEVICE_DRIVER_VALUES = { DeviceDriverEnum.DEVICEDRIVER_RYU, DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX, DeviceDriverEnum.DEVICEDRIVER_OPENROADM, + DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG, } # Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py index be6bda21b..33465eeca 100644 --- a/src/webui/service/device/forms.py +++ b/src/webui/service/device/forms.py @@ -42,6 +42,8 @@ class AddDeviceForm(FlaskForm): device_drivers_morpheus = BooleanField('MORPHEUS') device_drivers_ryu = BooleanField('RYU') device_drivers_gnmi_nokia_srlinux = BooleanField('GNMI NOKIA SR LINUX') + device_drivers_gnmi_nokia_srlinux = BooleanField('OPENROADM') + device_drivers_restconf_openconfig = BooleanField('RESTCONF OPENCONFIG') device_config_address = StringField('connect/address',default='127.0.0.1',validators=[DataRequired(), Length(min=5)]) device_config_port = StringField('connect/port',default='0',validators=[DataRequired(), Length(min=1)]) diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py index f48d5d300..d2975a75f 100644 --- a/src/webui/service/device/routes.py +++ b/src/webui/service/device/routes.py @@ -151,6 +151,10 @@ def add(): device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_RYU) if form.device_drivers_gnmi_nokia_srlinux.data: device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX) + if form.device_drivers_openroadm.data: + device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_OPENROADM) + if form.device_drivers_restconf_openconfig.data: + device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG) device_obj.device_drivers.extend(device_drivers) # pylint: disable=no-member try: diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java index 250a38680..77dc1f373 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java @@ -1,18 +1,18 @@ /* -* Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.etsi.tfs.ztp; @@ -869,6 +869,28 @@ public class Serializer { return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS; case IETF_ACTN: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN; + case OC: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OC; + case QKD: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_QKD; + case IETF_L3VPN: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN; + case IETF_SLICE: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE; + case NCE: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_NCE; + case SMARTNIC: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_SMARTNIC; + case MORPHEUS: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_MORPHEUS; + case RYU: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RYU; + case GNMI_NOKIA_SRLINUX: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX; + case OPENROADM: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPENROADM; + case RESTCONF_OPENCONFIG: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG; case UNDEFINED: default: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_UNDEFINED; @@ -898,6 +920,28 @@ public class Serializer { return DeviceDriverEnum.OPTICAL_TFS; case DEVICEDRIVER_IETF_ACTN: return DeviceDriverEnum.IETF_ACTN; + case DEVICEDRIVER_OC: + return DeviceDriverEnum.OC; + case DEVICEDRIVER_QKD: + return DeviceDriverEnum.QKD; + case DEVICEDRIVER_IETF_L3VPN: + return DeviceDriverEnum.IETF_L3VPN; + case DEVICEDRIVER_IETF_SLICE: + return DeviceDriverEnum.IETF_SLICE; + case DEVICEDRIVER_NCE: + return DeviceDriverEnum.NCE; + case DEVICEDRIVER_SMARTNIC: + return DeviceDriverEnum.SMARTNIC; + case DEVICEDRIVER_MORPHEUS: + return DeviceDriverEnum.MORPHEUS; + case DEVICEDRIVER_RYU: + return DeviceDriverEnum.RYU; + case DEVICEDRIVER_GNMI_NOKIA_SRLINUX: + return DeviceDriverEnum.GNMI_NOKIA_SRLINUX; + case DEVICEDRIVER_OPENROADM: + return DeviceDriverEnum.OPENROADM; + case DEVICEDRIVER_RESTCONF_OPENCONFIG: + return DeviceDriverEnum.RESTCONF_OPENCONFIG; case DEVICEDRIVER_UNDEFINED: case UNRECOGNIZED: default: -- GitLab From 921bcda2726a7fd2e0fb10ad24a2c32a89d72ca7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 5 Nov 2025 18:32:31 +0000 Subject: [PATCH 108/371] ZTP and Policy components: - Added RESTCONF_OPENCONFIG Driver --- .../context/model/DeviceDriverEnum.java | 3 +- .../java/org/etsi/tfs/ztp/Serializer.java | 28 +++++++++---------- .../ztp/context/model/DeviceDriverEnum.java | 3 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java index 1f7a4368c..d7db46f47 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java @@ -37,5 +37,6 @@ public enum DeviceDriverEnum { MORPHEUS, RYU, GNMI_NOKIA_SRLINUX, - OPENROADM + OPENROADM, + RESTCONF_OPENCONFIG } diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java index 77dc1f373..a1a008eb8 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java @@ -1,18 +1,18 @@ /* - * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +* Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ package org.etsi.tfs.ztp; diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java index 27187f254..d67dc62ca 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java @@ -37,5 +37,6 @@ public enum DeviceDriverEnum { MORPHEUS, RYU, GNMI_NOKIA_SRLINUX, - OPENROADM + OPENROADM, + RESTCONF_OPENCONFIG } -- GitLab From 8a0b21daed0a8ade67e02646d18b2b8eeb5dd164 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 6 Nov 2025 18:21:30 +0000 Subject: [PATCH 109/371] Tests - Tools - Firewall Agent: - Fixed manual instantiation of chain object --- .../firewall_agent/resources/nft_model/Chain.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index 261f19b64..f9b67ad3e 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -49,10 +49,10 @@ class Chain: ) -> 'Chain': chain : 'Chain' = cls(family, table, name) chain.handle = handle - if type_ is None: type_ = str(table.value).lower() - if hook is None: hook = str(name).lower() + if type_ is None: chain.type = str(table.value).lower() + if hook is None: chain.hook = str(name).lower() chain.prio = prio - chain.policy = policy + chain.policy = policy.value return chain @classmethod -- GitLab From 9617dfbd220edc79881c5d5343a58ff03076897e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 6 Nov 2025 18:22:52 +0000 Subject: [PATCH 110/371] Common - Tools - RestConf - Client: - Fixed discovery of base URL from host-meta --- src/common/tools/rest_conf/client/RestConfClient.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/tools/rest_conf/client/RestConfClient.py b/src/common/tools/rest_conf/client/RestConfClient.py index 088bb4ae1..953e68716 100644 --- a/src/common/tools/rest_conf/client/RestConfClient.py +++ b/src/common/tools/rest_conf/client/RestConfClient.py @@ -61,6 +61,10 @@ class RestConfClient(RestApiClient): self._base_url = str(href).replace('//', '/') if self._restconf_version is not None: self._base_url += '/{:s}'.format(self._restconf_version) + if self._base_url.endswith('/data/'): + self._base_url = self._base_url.split('/data/')[0] + elif self._base_url.endswith('/data'): + self._base_url = self._base_url.split('/data')[0] def get( -- GitLab From fc2674a87d8df89e713df83da41daed4a75d6257 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 6 Nov 2025 18:25:47 +0000 Subject: [PATCH 111/371] Device component - RESTCONF OPENCONFIG Driver: - Added test scripts and data files - Implemented driver skeleton - Implemented discovery of endpoints - Implemented management of ACL rules --- ...ests_locally-device-restconf-openconfig.sh | 25 ++ .../RestConfOpenConfigDriver.py | 173 ++++++++++++ .../drivers/restconf_openconfig/__init__.py | 14 + .../handlers/AclRuleSetHandler.py | 248 ++++++++++++++++++ .../handlers/ComponentsHandler.py | 71 +++++ .../restconf_openconfig/handlers/__init__.py | 13 + .../tests/restconf_openconfig/__init__.py | 14 + .../data/accept_30435_from_10_0_2_10.json | 19 ++ .../data/accept_30435_from_10_0_2_2.json | 19 ++ .../data/reject_30435_from_all.json | 19 ++ .../test_unitary_restconf_openconfig.py | 150 +++++++++++ 11 files changed, 765 insertions(+) create mode 100755 scripts/run_tests_locally-device-restconf-openconfig.sh create mode 100644 src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py create mode 100644 src/device/service/drivers/restconf_openconfig/__init__.py create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/__init__.py create mode 100644 src/device/tests/restconf_openconfig/__init__.py create mode 100644 src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json create mode 100644 src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json create mode 100644 src/device/tests/restconf_openconfig/data/reject_30435_from_all.json create mode 100644 src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py diff --git a/scripts/run_tests_locally-device-restconf-openconfig.sh b/scripts/run_tests_locally-device-restconf-openconfig.sh new file mode 100755 index 000000000..974d584b1 --- /dev/null +++ b/scripts/run_tests_locally-device-restconf-openconfig.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +RCFILE=$PROJECTDIR/coverage/.coveragerc + +# Run unitary tests and analyze coverage of code at same time +# helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 +coverage run --rcfile=$RCFILE --append -m pytest --log-level=DEBUG --verbose -o log_cli=true \ + device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py diff --git a/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py b/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py new file mode 100644 index 000000000..b940f27ba --- /dev/null +++ b/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py @@ -0,0 +1,173 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import copy, json, logging, re, requests, threading +from typing import Any, Iterator, List, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.tools.rest_conf.client.RestConfClient import RestConfClient +from common.type_checkers.Checkers import chk_string, chk_type +from device.service.driver_api._Driver import ( + _Driver, RESOURCE_ACL, RESOURCE_ENDPOINTS, RESOURCE_INTERFACES +) +from .handlers.ComponentsHandler import ComponentsHandler +from .handlers.AclRuleSetHandler import AclRuleSetHandler + + +ALL_RESOURCE_KEYS = [ + RESOURCE_ACL, + RESOURCE_ENDPOINTS, + RESOURCE_INTERFACES, +] + + +RE_ACL_RULESET = re.compile( + r'^\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/acl\_ruleset\[([^\]]+)\]$' +) + +def parse_resource_key(resource_key : str) -> Optional[Tuple[str, str, str]]: + re_match_acl_ruleset = RE_ACL_RULESET.match(resource_key) + if re_match_acl_ruleset is None: return None + device_key, endpoint_key, acl_ruleset_name = re_match_acl_ruleset.groups() + return device_key, endpoint_key, acl_ruleset_name + + + +DRIVER_NAME = 'restconf_openconfig' +METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME}) + + +class RestConfOpenConfigDriver(_Driver): + def __init__(self, address : str, port : int, **settings) -> None: + super().__init__(DRIVER_NAME, address, port, **settings) + logger_prefix = '{:s}:[{:s}:{:s}]'.format( + str(__name__), str(self.address), str(self.port) + ) + self.__logger = logging.getLogger(logger_prefix) + self.__lock = threading.Lock() + self.__started = threading.Event() + self.__terminate = threading.Event() + + restconf_settings = copy.deepcopy(settings) + restconf_settings['logger'] = logging.getLogger(logger_prefix + '.RestConfClient_v1') + + self._rest_conf_client = RestConfClient(address, port=port, **restconf_settings) + self._handler_components = ComponentsHandler(self._rest_conf_client) + self._handler_acl_ruleset = AclRuleSetHandler(self._rest_conf_client) + + def Connect(self) -> bool: + with self.__lock: + if self.__started.is_set(): return True + try: + self._rest_conf_client._discover_base_url() + except requests.exceptions.Timeout: + self.__logger.exception('Timeout exception checking connectivity') + return False + except Exception: # pylint: disable=broad-except + self.__logger.exception('Unhandled exception checking connectivity') + return False + else: + self.__started.set() + return True + + def Disconnect(self) -> bool: + with self.__lock: + self.__terminate.set() + if not self.__started.is_set(): return True + return True + + @metered_subclass_method(METRICS_POOL) + def GetInitialConfig(self) -> List[Tuple[str, Any]]: + with self.__lock: + return [] + + @metered_subclass_method(METRICS_POOL) + def GetConfig(self, resource_keys : List[str] = []) -> List[Tuple[str, Union[Any, None, Exception]]]: + chk_type('resources', resource_keys, list) + results = list() + with self.__lock: + if len(resource_keys) == 0: resource_keys = ALL_RESOURCE_KEYS + for i, resource_key in enumerate(resource_keys): + str_resource_name = 'resource_key[#{:d}]'.format(i) + try: + chk_string(str_resource_name, resource_key, allow_empty=False) + if resource_key == RESOURCE_ENDPOINTS: + results.extend(self._handler_components.get()) + elif resource_key == RESOURCE_ACL: + results.extend(self._handler_acl_ruleset.get()) + else: + parts = parse_resource_key(resource_key) + if parts is None: continue + device_key, endpoint_key, acl_ruleset_name = parts + results.extend(self._handler_acl_ruleset.get(acl_ruleset_name=acl_ruleset_name)) + except Exception as e: + MSG = 'Error processing resource_key({:s}, {:s})' + self.__logger.exception(MSG.format(str_resource_name, str(resource_key))) + results.append((resource_key, e)) # if processing fails, store the exception + + return results + + @metered_subclass_method(METRICS_POOL) + def SetConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + results = [] + with self.__lock: + for resource_key, resource_value in resources: + self.__logger.info('resource: key({:s}) => value({:s})'.format(str(resource_key), str(resource_value))) + try: + if isinstance(resource_value, str): resource_value = json.loads(resource_value) + if parse_resource_key(resource_key) is None: continue + results.append(self._handler_acl_ruleset.update(resource_value)) + except Exception as e: + results.append(e) + + return results + + @metered_subclass_method(METRICS_POOL) + def DeleteConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + results = [] + with self.__lock: + for resource_key, resource_value in resources: + self.__logger.info('resource: key({:s}) => value({:s})'.format(str(resource_key), str(resource_value))) + try: + #if isinstance(resource_value, str): resource_value = json.loads(resource_value) + resource_key_parts = parse_resource_key(resource_key) + if resource_key_parts is None: continue + _, _, acl_ruleset_name = resource_key_parts + results.append(self._handler_acl_ruleset.delete(acl_ruleset_name)) + except Exception as e: + results.append(e) + + return results + + @metered_subclass_method(METRICS_POOL) + def SubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + # TODO: RESTCONF OPENCONFIG does not support monitoring by now + return [False for _ in subscriptions] + + @metered_subclass_method(METRICS_POOL) + def UnsubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + # TODO: RESTCONF OPENCONFIG does not support monitoring by now + return [False for _ in subscriptions] + + def GetState( + self, blocking=False, terminate : Optional[threading.Event] = None + ) -> Iterator[Tuple[float, str, Any]]: + # TODO: RESTCONF OPENCONFIG does not support monitoring by now + return [] diff --git a/src/device/service/drivers/restconf_openconfig/__init__.py b/src/device/service/drivers/restconf_openconfig/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/device/service/drivers/restconf_openconfig/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py new file mode 100644 index 000000000..7e52980fc --- /dev/null +++ b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py @@ -0,0 +1,248 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import logging +from typing import Any, Dict, List, Optional, Tuple, Union +from common.proto.context_pb2 import AclDirectionEnum +from common.tools.rest_conf.client.RestConfClient import RestConfClient + + +LOGGER = logging.getLogger(__name__) + + +_TFS_2_OC_RULE_TYPE = { + 'ACLRULETYPE_IPV4': 'ACL_IPV4', + 'ACLRULETYPE_IPV6': 'ACL_IPV6', +} +_OC_2_TFS_RULE_TYPE = {v: k for k, v in _TFS_2_OC_RULE_TYPE.items() } + +_TFS_2_OC_PROTOCOL = { + 1 : 'IP_ICMP', + 6 : 'IP_TCP', + 17 : 'IP_UDP', +} +_OC_2_TFS_PROTOCOL = {v: k for k, v in _TFS_2_OC_PROTOCOL.items() } + +_TFS_2_OC_FWD_ACTION = { + 'ACLFORWARDINGACTION_DROP' : 'DROP', + 'ACLFORWARDINGACTION_ACCEPT': 'ACCEPT', + 'ACLFORWARDINGACTION_REJECT': 'REJECT', +} +_OC_2_TFS_FWD_ACTION = {v: k for k, v in _TFS_2_OC_FWD_ACTION.items()} + + +DIRECTION_INGRESS = { + AclDirectionEnum.ACLDIRECTION_BOTH, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH), + AclDirectionEnum.ACLDIRECTION_INGRESS, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_INGRESS), +} + +DIRECTION_EGRESS = { + AclDirectionEnum.ACLDIRECTION_BOTH, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH), + AclDirectionEnum.ACLDIRECTION_EGRESS, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_EGRESS), +} + + +class AclRuleSetHandler: + def __init__(self, rest_conf_client : RestConfClient) -> None: + self._rest_conf_client = rest_conf_client + self._subpath_root = '/openconfig-acl:acl' + self._subpath_item = self._subpath_root + '/acl-sets/acl-set={acl_ruleset_name:s}' + + + def get(self, acl_ruleset_name : Optional[str] = None) -> Union[Dict, List]: + if acl_ruleset_name is None: + subpath_url = self._subpath_root + else: + subpath_url = self._subpath_item.format(acl_ruleset_name=acl_ruleset_name) + + reply = self._rest_conf_client.get(subpath_url) + + if 'openconfig-acl:acl' not in reply: + raise Exception('Malformed reply. "openconfig-acl:acl" missing') + acls = reply['openconfig-acl:acl'] + + if 'acl-sets' not in acls: + raise Exception('Malformed reply. "openconfig-acl:acl/acl-sets" missing') + aclsets = acls['acl-sets'] + + if 'acl-set' not in aclsets: + raise Exception('Malformed reply. "openconfig-acl:acl/acl-sets/acl-set" missing') + aclset_lst = aclsets['acl-set'] + + if len(aclset_lst) == 0: + MSG = '[get] No ACL-Sets are reported' + LOGGER.debug(MSG) + return list() + + results : List[Tuple[str, Dict[str, Any]]] = list() + for acl_set in aclset_lst: + acl_set_name = acl_set['name'] + oc_acl_set_type = acl_set['config']['type'] + tfs_acl_set_type = _OC_2_TFS_RULE_TYPE[oc_acl_set_type] + + rule_set: Dict[str, Any] = { + 'name' : acl_set_name, + 'type' : tfs_acl_set_type, + 'entries' : [], + } + + acl_set_config : Dict = acl_set.get('config', {}) + acl_set_description = acl_set_config.get('description') + if acl_set_description is not None: + rule_set['description'] = acl_set_description + + for ace in acl_set.get('acl-entries', {}).get('acl-entry', []): + seq = ace['sequence-id'] + + ipv4_cfg = ace.get('ipv4', {}).get('config', {}) + match = dict() + if 'source-address' in ipv4_cfg: + match['src_address'] = ipv4_cfg['source-address'] + if 'destination-address' in ipv4_cfg: + match['dst_address'] = ipv4_cfg['destination-address'] + if 'protocol' in ipv4_cfg: + match['protocol'] = _OC_2_TFS_PROTOCOL[ipv4_cfg['protocol']] + + transp_cfg = ace.get('transport', {}).get('config', {}) + if 'source-port' in transp_cfg: + match['src_port'] = transp_cfg['source-port'] + if 'destination-port' in transp_cfg: + match['dst_port'] = transp_cfg['destination-port'] + + act = ace.get('actions', {}).get('config', {}).get('forwarding-action', 'DROP') + fwd_tfs = _OC_2_TFS_FWD_ACTION[act] + + rule_set['entries'].append({ + 'sequence_id': seq, + 'match': match, + 'action': {'forward_action': fwd_tfs}, + }) + + # find where that ACL is bound (first matching interface) + if_name = '' + for intf in acls.get('interfaces', {}).get('interface', []): + for ing in intf.get('ingress-acl-sets', {}).get('ingress-acl-set', []): + if ing['set-name'] == acl_set_name: + if_name = intf['id'] + break + + path = '/device[]/endpoint[{:s}]/acl_ruleset[{:s}]'.format( + if_name, acl_set_name + ) + tfs_acl_data = { + 'endpoint_id': {'endpoint_uuid': {'uuid': if_name}}, + 'direction': 'ACLDIRECTION_INGRESS', + 'rule_set': rule_set, + } + results.append((path, tfs_acl_data)) + + return results + + + def update(self, acl_data : Dict) -> bool: + if_name = acl_data['endpoint_id']['endpoint_uuid']['uuid'] + direction = acl_data['direction'] + rule_set = acl_data['rule_set'] + + if direction in DIRECTION_INGRESS: + acl_set_name = 'ip-filter-input' + elif direction in DIRECTION_EGRESS: + acl_set_name = 'ip-filter-output' + else: + MSG = 'Unsupported direction: {:s}' + raise Exception(MSG.format(str(direction))) + + acl_entry_desc = rule_set['name'] + acl_set_type = _TFS_2_OC_RULE_TYPE[rule_set['type']] + + oc_acl_entries = list() + sequence_ids : List[int] = list() + for entry in rule_set.get('entries', []): + sequence_id = int(entry['sequence_id']) + oc_action = _TFS_2_OC_FWD_ACTION[entry['action']['forward_action']] + oc_acl_entry = { + 'sequence-id': sequence_id, + 'config': {'sequence-id': sequence_id, 'description' : acl_entry_desc}, + 'actions': {'config': {'forwarding-action': oc_action}} + } + + entry_match = entry.get('match', dict()) + + ipv4_config = dict() + if 'protocol' in entry_match: + ipv4_config['protocol'] = _TFS_2_OC_PROTOCOL[entry_match['protocol']] + if 'src_address' in entry_match: + ipv4_config['source-address'] = entry_match['src_address'] + if 'dst_address' in entry_match: + ipv4_config['destination-address'] = entry_match['dst_address'] + if len(ipv4_config) > 0: + oc_acl_entry.setdefault('ipv4', dict())['config'] = ipv4_config + + transport_config = dict() + if 'src_port' in entry_match: + transport_config['source-port'] = entry_match['src_port'] + if 'dst_port' in entry_match: + transport_config['destination-port'] = entry_match['dst_port'] + if len(transport_config) > 0: + oc_acl_entry.setdefault('transport', dict())['config'] = transport_config + + oc_acl_entries.append(oc_acl_entry) + sequence_ids.append(sequence_id) + + oc_interface = { + 'id': if_name, + 'config': {'id': if_name}, + 'interface-ref': {'config': {'interface': if_name, 'subinterface': 1}}, + } + + if direction in DIRECTION_INGRESS: + oc_interface['ingress-acl-sets'] = {'ingress-acl-set': [{ + 'set-name': acl_set_name, 'type': acl_set_type, + 'config': {'set-name': acl_set_name, 'type': acl_set_type}, + 'acl-entries': {'acl-entry': [ + {'sequence-id': sequence_id} + for sequence_id in sequence_ids + ]} + }]} + + if direction in DIRECTION_EGRESS: + oc_interface['egress-acl-sets'] = {'egress-acl-set': [{ + 'set-name': acl_set_name, 'type': acl_set_type, + 'config': {'set-name': acl_set_name, 'type': acl_set_type}, + 'acl-entries': {'acl-entry': [ + {'sequence-id': sequence_id} + for sequence_id in sequence_ids + ]} + }]} + + oc_acl_data = {'openconfig-acl:acl': { + 'acl-sets': {'acl-set': [{ + 'name': acl_set_name, 'type': acl_set_type, + 'config': {'name': acl_set_name, 'type': acl_set_type}, + 'acl-entries': {'acl-entry': oc_acl_entries}, + }]}, + 'interfaces': {'interface': [oc_interface]}, + }} + return self._rest_conf_client.post(self._subpath_root, body=oc_acl_data) is not None + + + def delete(self, acl_ruleset_name : str) -> bool: + if acl_ruleset_name is None: raise Exception('acl_ruleset_name is None') + subpath_url = self._subpath_item.format(acl_ruleset_name=acl_ruleset_name) + return self._rest_conf_client.delete(subpath_url) diff --git a/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py new file mode 100644 index 000000000..f2c9fc6e3 --- /dev/null +++ b/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py @@ -0,0 +1,71 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from typing import Dict, List, Tuple +from common.tools.rest_conf.client.RestConfClient import RestConfClient + + +LOGGER = logging.getLogger(__name__) + + +class ComponentsHandler: + def __init__(self, rest_conf_client : RestConfClient) -> None: + self._rest_conf_client = rest_conf_client + self._subpath_root = '/openconfig-platform:components' + + def get(self) -> List[Tuple[str, Dict]]: + reply = self._rest_conf_client.get(self._subpath_root) + + if 'openconfig-platform:components' not in reply: + raise Exception('Malformed reply. "openconfig-platform:components" missing') + components = reply['openconfig-platform:components'] + + if 'component' not in components: + raise Exception('Malformed reply. "openconfig-platform:components/component" missing') + component_lst = components['component'] + + if len(component_lst) == 0: + MSG = '[get] No components are reported' + LOGGER.debug(MSG) + return list() + + entries : List[Tuple[str, Dict]] = list() + for component in component_lst: + if 'state' not in component: + MSG = 'Malformed component. "state" missing: {:s}' + raise Exception(MSG.format(str(component))) + comp_state = component['state'] + + if 'type' not in comp_state: + MSG = 'Malformed component. "state/type" missing: {:s}' + raise Exception(MSG.format(str(component))) + comp_type : str = comp_state['type'] + comp_type = comp_type.split(':')[-1] + if comp_type != 'PORT': continue + + if 'name' not in component: + MSG = 'Malformed component. "name" missing: {:s}' + raise Exception(MSG.format(str(component))) + comp_name = component['name'] + + if comp_name.startswith('cali'): continue # calico port + if comp_name.startswith('vxlan'): continue # vxlan.calico port + if comp_name.startswith('docker'): continue # docker port + if comp_name in {'lo', 'loop', 'loopback'}: continue # loopback port + + endpoint = {'uuid': comp_name, 'type': '-'} + entries.append(('/endpoints/endpoint[{:s}]'.format(endpoint['uuid']), endpoint)) + + return entries diff --git a/src/device/service/drivers/restconf_openconfig/handlers/__init__.py b/src/device/service/drivers/restconf_openconfig/handlers/__init__.py new file mode 100644 index 000000000..7363515f0 --- /dev/null +++ b/src/device/service/drivers/restconf_openconfig/handlers/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/device/tests/restconf_openconfig/__init__.py b/src/device/tests/restconf_openconfig/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/device/tests/restconf_openconfig/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json new file mode 100644 index 000000000..edb3b9177 --- /dev/null +++ b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json @@ -0,0 +1,19 @@ +{ + "endpoint_id": { + "device_id": {"device_uuid": {"uuid": "my-firewall"}}, + "endpoint_uuid": {"uuid": "enp0s3"} + }, + "direction": "ACLDIRECTION_INGRESS", + "rule_set": { + "name" : "accept-30435-from-10-0-2-10", + "type" : "ACLRULETYPE_IPV4", + "description" : "accept-30435-from-10-0-2-10", + "user_id" : "teraflowsdn", + "entries" : [{ + "sequence_id" : 1, + "description" : "accept-30435-from-10-0-2-10", + "match" : {"src_address": "10.0.2.10/32", "protocol": 6, "dst_port": 30435}, + "action" : {"forward_action": "ACLFORWARDINGACTION_ACCEPT"} + }] + } +} diff --git a/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json new file mode 100644 index 000000000..9a2b7c7c1 --- /dev/null +++ b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json @@ -0,0 +1,19 @@ +{ + "endpoint_id": { + "device_id": {"device_uuid": {"uuid": "my-firewall"}}, + "endpoint_uuid": {"uuid": "enp0s3"} + }, + "direction": "ACLDIRECTION_INGRESS", + "rule_set": { + "name" : "accept-30435-from-10-0-2-2", + "type" : "ACLRULETYPE_IPV4", + "description" : "accept-30435-from-10-0-2-2", + "user_id" : "teraflowsdn", + "entries" : [{ + "sequence_id" : 1, + "description" : "accept-30435-from-10-0-2-2", + "match" : {"src_address": "10.0.2.2/32", "protocol": 6, "dst_port": 30435}, + "action" : {"forward_action": "ACLFORWARDINGACTION_ACCEPT"} + }] + } +} diff --git a/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json b/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json new file mode 100644 index 000000000..79a87086a --- /dev/null +++ b/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json @@ -0,0 +1,19 @@ +{ + "endpoint_id": { + "device_id": {"device_uuid": {"uuid": "my-firewall"}}, + "endpoint_uuid": {"uuid": "enp0s3"} + }, + "direction": "ACLDIRECTION_INGRESS", + "rule_set": { + "name" : "reject-30435-from-all", + "type" : "ACLRULETYPE_IPV4", + "description" : "reject-30435-from-all", + "user_id" : "teraflowsdn", + "entries" : [{ + "sequence_id" : 10000, + "description" : "reject-30435-from-all", + "match" : {"protocol": 6, "dst_port": 30435}, + "action" : {"forward_action": "ACLFORWARDINGACTION_REJECT"} + }] + } +} diff --git a/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py b/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py new file mode 100644 index 000000000..0d4aa6253 --- /dev/null +++ b/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py @@ -0,0 +1,150 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +os.environ['DEVICE_EMULATED_ONLY'] = 'YES' + + +# pylint: disable=wrong-import-position +import json, logging, pytest, time +from typing import Dict, List, Tuple, Union +from device.service.driver_api._Driver import RESOURCE_ACL, RESOURCE_ENDPOINTS +from device.service.drivers.restconf_openconfig.RestConfOpenConfigDriver import RestConfOpenConfigDriver + + +DATA_FILE_PATH = 'device/tests/restconf_openconfig/data/' + +##### LOGGERS ########################################################################################################## + +logging.basicConfig(level=logging.DEBUG) +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + + +##### DRIVER FIXTURE ################################################################################################### + +DRIVER_ADDRESS = '10.0.2.25' +DRIVER_PORT = 8888 +DRIVER_SETTINGS = dict( + scheme='http', username='admin', password='admin', + timeout=30, verify_certs=False, allow_redirects=True, +) + +@pytest.fixture(scope='session') +def driver() -> RestConfOpenConfigDriver: + _driver = RestConfOpenConfigDriver( + DRIVER_ADDRESS, DRIVER_PORT, **DRIVER_SETTINGS + ) + _driver.Connect() + yield _driver + time.sleep(1) + _driver.Disconnect() + + +##### HELPER METHODS ################################################################################################### + +def get_config( + driver : RestConfOpenConfigDriver, resources_to_get : List[str] +) -> List[Tuple[str, Dict]]: + LOGGER.info('[get_config] resources_to_get = {:s}'.format(str(resources_to_get))) + results_getconfig = driver.GetConfig(resources_to_get) + LOGGER.info('[get_config] results_getconfig = {:s}'.format(str(results_getconfig))) + return results_getconfig + +def set_config( + driver : RestConfOpenConfigDriver, resources_to_set : List[Tuple[str, Dict]] +) -> List[Tuple[str, Union[bool, Exception]]]: + LOGGER.info('[set_config] resources_to_set = {:s}'.format(str(resources_to_set))) + results_setconfig = driver.SetConfig(resources_to_set) + LOGGER.info('[set_config] results_setconfig = {:s}'.format(str(results_setconfig))) + return results_setconfig + +def del_config( + driver : RestConfOpenConfigDriver, resources_to_delete : List[Tuple[str, Dict]] +) -> List[Tuple[str, Union[bool, Exception]]]: + LOGGER.info('[del_config] resources_to_delete = {:s}'.format(str(resources_to_delete))) + results_deleteconfig = driver.DeleteConfig(resources_to_delete) + LOGGER.info('[del_config] results_deleteconfig = {:s}'.format(str(results_deleteconfig))) + return results_deleteconfig + +def create_acl_from_file(file_name : str) -> Tuple[str, Dict]: + with open(DATA_FILE_PATH + file_name, 'r', encoding='UTF-8') as f: + acl_data = json.load(f) + device_uuid = acl_data['endpoint_id']['device_id']['device_uuid']['uuid'] + endpoint_uuid = acl_data['endpoint_id']['endpoint_uuid']['uuid'] + aclset_name = acl_data['rule_set']['name'] + key_or_path = '/device[{:s}]/endpoint[{:s}]/acl_ruleset[{:s}]'.format( + device_uuid, endpoint_uuid, aclset_name + ) + return key_or_path, acl_data + + +##### TEST METHODS ##################################################################################################### + +def test_get_endpoints( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + results_getconfig = get_config(driver, [RESOURCE_ENDPOINTS]) + assert len(results_getconfig) > 0 + endpoint_names = {res_val['uuid'] for _, res_val in results_getconfig} + assert len(endpoint_names) == 1 + assert 'enp0s3' in endpoint_names + + +def test_get_acls( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + get_config(driver, [RESOURCE_ACL]) + + +def test_set_acl_reject_30435_from_all( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_set = [create_acl_from_file('reject_30435_from_all.json')] + set_config(driver, resources_to_set) + + +def test_set_acl_accept_30435_from_10_0_2_2( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_set = [create_acl_from_file('accept_30435_from_10_0_2_2.json')] + set_config(driver, resources_to_set) + + +def test_set_acl_accept_30435_from_10_0_2_10( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_set = [create_acl_from_file('accept_30435_from_10_0_2_10.json')] + set_config(driver, resources_to_set) + + +def test_del_acl_accept_30435_from_10_0_2_10( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_delete = [create_acl_from_file('accept_30435_from_10_0_2_10.json')] + del_config(driver, resources_to_delete) + + +def test_del_acl_accept_30435_from_10_0_2_2( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_delete = [create_acl_from_file('accept_30435_from_10_0_2_2.json')] + del_config(driver, resources_to_delete) + + +def test_del_acl_reject_30435_from_all( + driver : RestConfOpenConfigDriver, # pylint: disable=redefined-outer-name +) -> None: + resources_to_delete = [create_acl_from_file('reject_30435_from_all.json')] + del_config(driver, resources_to_delete) -- GitLab From 509c62d4d9a435491d69ced5561e25854cdba1dd Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 15:36:57 +0000 Subject: [PATCH 112/371] Common - Device Types: - Added packet firewall device type --- src/common/DeviceTypes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index a8006b3da..948de0e98 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -33,6 +33,7 @@ class DeviceTypeEnum(Enum): EMULATED_OPEN_ROADM = 'emu-optical-openroadm' EMULATED_OPTICAL_SPLITTER = 'emu-optical-splitter' # passive component required for XR Constellation EMULATED_P4_SWITCH = 'emu-p4-switch' + EMULATED_PACKET_FIREWALL = 'emu-packet-firewall' EMULATED_PACKET_RADIO_ROUTER = 'emu-packet-radio-router' EMULATED_PACKET_ROUTER = 'emu-packet-router' EMULATED_PACKET_SWITCH = 'emu-packet-switch' @@ -51,6 +52,7 @@ class DeviceTypeEnum(Enum): OPTICAL_ROADM = 'optical-roadm' OPTICAL_TRANSPONDER = 'optical-transponder' P4_SWITCH = 'p4-switch' + PACKET_FIREWALL = 'packet-firewall' PACKET_POP = 'packet-pop' PACKET_RADIO_ROUTER = 'packet-radio-router' PACKET_ROUTER = 'packet-router' -- GitLab From 933bcb6bdde1f2dc6ee6b4af0a91c8b9b9ad92da Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 15:37:20 +0000 Subject: [PATCH 113/371] WebUI component: - Fixed names of firewall icons --- .../{emu-firewall.png => emu-packet-firewall.png} | Bin .../{firewall.png => packet-firewall.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename src/webui/service/static/topology_icons/{emu-firewall.png => emu-packet-firewall.png} (100%) rename src/webui/service/static/topology_icons/{firewall.png => packet-firewall.png} (100%) diff --git a/src/webui/service/static/topology_icons/emu-firewall.png b/src/webui/service/static/topology_icons/emu-packet-firewall.png similarity index 100% rename from src/webui/service/static/topology_icons/emu-firewall.png rename to src/webui/service/static/topology_icons/emu-packet-firewall.png diff --git a/src/webui/service/static/topology_icons/firewall.png b/src/webui/service/static/topology_icons/packet-firewall.png similarity index 100% rename from src/webui/service/static/topology_icons/firewall.png rename to src/webui/service/static/topology_icons/packet-firewall.png -- GitLab From 4c3399f3830c95e28430129459700c9079e9893b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 15:37:42 +0000 Subject: [PATCH 114/371] Device component: - Registered RESTCONF/OpenConfig Driver --- src/device/service/drivers/__init__.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index ba5298292..ff0419a3e 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -249,3 +249,24 @@ if LOAD_ALL_DEVICE_DRIVERS: FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_QKD, } ])) + +if LOAD_ALL_DEVICE_DRIVERS: + # pylint: disable=wrong-import-position + from .restconf_openconfig.RestConfOpenConfigDriver import RestConfOpenConfigDriver + DRIVERS.append( + (RestConfOpenConfigDriver, [ + { + FilterFieldEnum.DEVICE_TYPE: [ + DeviceTypeEnum.CLIENT, + DeviceTypeEnum.DATACENTER, + DeviceTypeEnum.EMULATED_CLIENT, + DeviceTypeEnum.EMULATED_COMPUTER, + DeviceTypeEnum.EMULATED_DATACENTER, + DeviceTypeEnum.EMULATED_PACKET_FIREWALL, + DeviceTypeEnum.EMULATED_VIRTUAL_MACHINE, + DeviceTypeEnum.NETWORK, + DeviceTypeEnum.PACKET_FIREWALL, + ], + FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG, + } + ])) -- GitLab From 9b4d71cb4d4860d7c2448487b89f3c7dab8a37f4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 15:48:58 +0000 Subject: [PATCH 115/371] Load Generator component: - Fixed Python requirements --- src/load_generator/requirements.in | 1 + 1 file changed, 1 insertion(+) diff --git a/src/load_generator/requirements.in b/src/load_generator/requirements.in index a2ee41d83..aa83a97e3 100644 --- a/src/load_generator/requirements.in +++ b/src/load_generator/requirements.in @@ -13,3 +13,4 @@ # limitations under the License. APScheduler>=3.10.4 +pytz>=2025.2 -- GitLab From c414bac83714be22bd3d8a7f0987ee5a85407ddd Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Fri, 7 Nov 2025 17:00:52 +0000 Subject: [PATCH 116/371] fix: telemetry INT collector misplacement issue --- src/telemetry/backend/service/HelperMethods.py | 5 +++-- src/telemetry/backend/service/collectors/__init__.py | 3 +-- .../backend/service/collectors/gnmi_oc/SubscriptionNew.py | 4 ++-- .../{ => service}/collectors/intcollector/INTCollector.py | 2 +- .../collectors/intcollector/INTCollectorCommon.py | 0 .../{ => service}/collectors/intcollector/__init__.py | 0 6 files changed, 7 insertions(+), 7 deletions(-) rename src/telemetry/backend/{ => service}/collectors/intcollector/INTCollector.py (99%) rename src/telemetry/backend/{ => service}/collectors/intcollector/INTCollectorCommon.py (100%) rename src/telemetry/backend/{ => service}/collectors/intcollector/__init__.py (100%) diff --git a/src/telemetry/backend/service/HelperMethods.py b/src/telemetry/backend/service/HelperMethods.py index db56c9a76..332b3f10d 100644 --- a/src/telemetry/backend/service/HelperMethods.py +++ b/src/telemetry/backend/service/HelperMethods.py @@ -19,12 +19,13 @@ from .collector_api.DriverInstanceCache import get_driver from common.proto.kpi_manager_pb2 import KpiId from common.tools.context_queries.Device import get_device from common.tools.context_queries.EndPoint import get_endpoint_names +from typing import List, Tuple, Optional LOGGER = logging.getLogger(__name__) def get_subscription_parameters( kpi_id : str, kpi_manager_client, context_client, duration, interval - ) -> list[tuple] | None: + ) -> Optional[List[Tuple]]: """ Method to get subscription parameters based on KPI ID. Returns a list of tuples with subscription parameters. @@ -95,7 +96,7 @@ def get_subscription_parameters( def get_collector_by_kpi_id(kpi_id: str, kpi_manager_client, context_client, driver_instance_cache - ) -> _Collector | None: + ) -> Optional[_Collector]: """ Method to get a collector instance based on KPI ID. Preconditions: diff --git a/src/telemetry/backend/service/collectors/__init__.py b/src/telemetry/backend/service/collectors/__init__.py index 1e07dc43f..b2391d623 100644 --- a/src/telemetry/backend/service/collectors/__init__.py +++ b/src/telemetry/backend/service/collectors/__init__.py @@ -49,7 +49,7 @@ if LOAD_ALL_DEVICE_DRIVERS: ) if LOAD_ALL_DEVICE_DRIVERS: - from ...collectors.intcollector.INTCollector import INTCollector # pylint: disable=wrong-import-position + from .intcollector.INTCollector import INTCollector # pylint: disable=wrong-import-position COLLECTORS.append( (INTCollector, [ { @@ -58,4 +58,3 @@ if LOAD_ALL_DEVICE_DRIVERS: } ]) ) - diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py index e34b2e472..cbf0ebf42 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py @@ -41,7 +41,7 @@ class Subscription: metric_queue: Queue, mode: str = "stream", sample_interval_ns: int = 10_000_000_000, - heartbeat_interval_ns: int | None = None, # ← NEW + heartbeat_interval_ns: Optional[int] = None, # ← NEW encoding: str = "json_ietf", on_update: Optional[Callable[[dict], None]] = None, ) -> None: @@ -82,7 +82,7 @@ class Subscription: path_list: List[str], mode: str, sample_interval_ns: int, - heartbeat_interval_ns: int | None, + heartbeat_interval_ns: Optional[int], encoding: str, on_update: Optional[Callable[[dict], None]], ) -> None: # pragma: no cover diff --git a/src/telemetry/backend/collectors/intcollector/INTCollector.py b/src/telemetry/backend/service/collectors/intcollector/INTCollector.py similarity index 99% rename from src/telemetry/backend/collectors/intcollector/INTCollector.py rename to src/telemetry/backend/service/collectors/intcollector/INTCollector.py index 9d89827f4..5931f33f3 100644 --- a/src/telemetry/backend/collectors/intcollector/INTCollector.py +++ b/src/telemetry/backend/service/collectors/intcollector/INTCollector.py @@ -20,7 +20,7 @@ from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.jobstores.memory import MemoryJobStore from apscheduler.executors.pool import ThreadPoolExecutor from datetime import datetime -from telemetry.backend.collector_api._Collector import _Collector +from telemetry.backend.service.collector_api._Collector import _Collector from scapy.all import * import struct diff --git a/src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py b/src/telemetry/backend/service/collectors/intcollector/INTCollectorCommon.py similarity index 100% rename from src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py rename to src/telemetry/backend/service/collectors/intcollector/INTCollectorCommon.py diff --git a/src/telemetry/backend/collectors/intcollector/__init__.py b/src/telemetry/backend/service/collectors/intcollector/__init__.py similarity index 100% rename from src/telemetry/backend/collectors/intcollector/__init__.py rename to src/telemetry/backend/service/collectors/intcollector/__init__.py -- GitLab From 48cb70eb7b51abf30853d0b10ccd3524ffc1e283 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 18:45:11 +0000 Subject: [PATCH 117/371] NBI component - IETF ACL: - Add support for REJECT action --- src/nbi/service/ietf_acl/ietf_acl_parser.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/nbi/service/ietf_acl/ietf_acl_parser.py b/src/nbi/service/ietf_acl/ietf_acl_parser.py index 65e9129a2..7305775b8 100644 --- a/src/nbi/service/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/ietf_acl/ietf_acl_parser.py @@ -118,7 +118,8 @@ IETF_TFS_RULE_TYPE_MAPPING = { IETF_TFS_FORWARDING_ACTION_MAPPING = { 'accept': 'ACLFORWARDINGACTION_ACCEPT', - 'drop': 'ACLFORWARDINGACTION_DROP', + 'drop' : 'ACLFORWARDINGACTION_DROP', + 'reject': 'ACLFORWARDINGACTION_REJECT', } TFS_IETF_RULE_TYPE_MAPPING = { @@ -128,7 +129,8 @@ TFS_IETF_RULE_TYPE_MAPPING = { TFS_IETF_FORWARDING_ACTION_MAPPING = { 'ACLFORWARDINGACTION_ACCEPT': 'accept', - 'ACLFORWARDINGACTION_DROP': 'drop', + 'ACLFORWARDINGACTION_DROP' : 'drop', + 'ACLFORWARDINGACTION_REJECT': 'reject', } -- GitLab From 51fb0c5145ae6fb4b3f3edf9cb582b4e33c6a8ce Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 7 Nov 2025 18:45:53 +0000 Subject: [PATCH 118/371] Device component - RESTCONF OpenConfig Driver: - Filter out default values to prevent injecting wrong values on ACL rules --- .../restconf_openconfig/handlers/AclRuleSetHandler.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py index 7e52980fc..9ef029c09 100644 --- a/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py +++ b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py @@ -185,19 +185,19 @@ class AclRuleSetHandler: entry_match = entry.get('match', dict()) ipv4_config = dict() - if 'protocol' in entry_match: + if 'protocol' in entry_match and entry_match['protocol'] > 0: ipv4_config['protocol'] = _TFS_2_OC_PROTOCOL[entry_match['protocol']] - if 'src_address' in entry_match: + if 'src_address' in entry_match and len(entry_match['src_address']) > 0: ipv4_config['source-address'] = entry_match['src_address'] - if 'dst_address' in entry_match: + if 'dst_address' in entry_match and len(entry_match['dst_address']) > 0: ipv4_config['destination-address'] = entry_match['dst_address'] if len(ipv4_config) > 0: oc_acl_entry.setdefault('ipv4', dict())['config'] = ipv4_config transport_config = dict() - if 'src_port' in entry_match: + if 'src_port' in entry_match and entry_match['src_port'] > 0: transport_config['source-port'] = entry_match['src_port'] - if 'dst_port' in entry_match: + if 'dst_port' in entry_match and entry_match['dst_port'] > 0: transport_config['destination-port'] = entry_match['dst_port'] if len(transport_config) > 0: oc_acl_entry.setdefault('transport', dict())['config'] = transport_config -- GitLab From 3ca92b519079bf6c9694694bf08e0bfbcc0e4594 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 16:12:08 +0000 Subject: [PATCH 119/371] Tests - Tools - Firewall Agent: - Added missing firewall Table types - Enhanced NFT parser to skip additional unknown rules - Enhanced command executor to skip changes on pre-existing rules - Added deployability as Kubernetes workload --- .../tools/firewall_agent/DeploymentSet.yaml | 42 +++++++++++++++++++ .../resources/nft_model/Chain.py | 11 ++++- .../nft_model/NFTablesParserTools.py | 3 ++ .../resources/nft_model/Rule.py | 8 +++- .../resources/nft_model/Table.py | 6 +++ .../resources/nft_model/TableEnum.py | 2 + .../{redeploy.sh => redeploy-docker.sh} | 0 .../firewall_agent/redeploy-kubernetes.sh | 26 ++++++++++++ 8 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/tests/tools/firewall_agent/DeploymentSet.yaml rename src/tests/tools/firewall_agent/{redeploy.sh => redeploy-docker.sh} (100%) create mode 100755 src/tests/tools/firewall_agent/redeploy-kubernetes.sh diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml new file mode 100644 index 000000000..d4271e63e --- /dev/null +++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml @@ -0,0 +1,42 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: firewall-agent +spec: + replicas: 1 + selector: + matchLabels: + app: firewall-agent + template: + metadata: + labels: + app: firewall-agent + spec: + hostNetwork: true # like --network host + dnsPolicy: ClusterFirstWithHostNet + containers: + - name: firewall-agent + image: firewall-agent:dev + #image: localhost:32000/tfs/firewall-agent:dev + securityContext: + capabilities: + add: ["NET_ADMIN"] # like --cap-add=NET_ADMIN + # privileged: true # uncomment if your code needs full net admin / sysctl + ports: + - containerPort: 8888 # container listens on 8888 on the host now + hostPort: 8888 # optional, but makes it explicit diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py index f9b67ad3e..3cd0ff769 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py @@ -117,12 +117,15 @@ class Chain: def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]: commands : List[Tuple[int, str]] = list() + if removal: # NOTE: For now, do not remove chains. We do not process all kinds of # chains and their removal might cause side effects on NFTables. pass + elif self.handle is not None: + # NOTE: Chain was already there, do not modify it + pass else: - chain_hook = str(self.chain).lower() parts = [ 'add', 'chain', self.family.value, self.table.value, self.chain, '{', @@ -131,6 +134,10 @@ class Chain: '}' ] commands.append((-1, ' '.join(parts))) + for rule in self.rules: - commands.append(rule.get_command(removal=removal)) + rule_cmd = rule.get_command(removal=removal) + if rule_cmd is None: continue + commands.append(rule_cmd) + return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py index cf9c97523..0546787d8 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py @@ -81,6 +81,9 @@ def parse_nft_match(rule : 'Rule', match : Dict) -> int: raise UnsupportedElementException('rule.expr.match', match) else: raise UnsupportedElementException('rule.expr.match', match) + elif '&' in match_left: + # matches on masks and marks are skipped + pass else: raise UnsupportedElementException('rule.expr.match', match) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py index 5a839f3e1..040a03ca8 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py @@ -252,7 +252,7 @@ class Rule: if self.handle is not None: rule['handle'] = self.handle return [{'rule': rule}] - def get_command(self, removal : bool = False) -> Tuple[int, str]: + def get_command(self, removal : bool = False) -> Optional[Tuple[int, str]]: if removal: if self.handle is None: raise MissingFieldException('handle', asdict(self)) parts = [ @@ -260,6 +260,10 @@ class Rule: self.family.value, self.table.value, self.chain, 'handle', str(self.handle) ] + return self.sequence_id, ' '.join(parts) + elif self.handle is not None: + # NOTE: Rule was already there, do not modify it + return None else: # NOTE: if sequence_id < 10000: insert the rules to the top; # otherwise, append to the bottom. Anyways, sort rules by sequence_id. @@ -273,4 +277,4 @@ class Rule: if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)]) if self.action is not None: parts.append(self.action.value) if self.comment is not None: parts.extend(['comment', f'"{self.comment}"']) - return self.sequence_id, ' '.join(parts) + return self.sequence_id, ' '.join(parts) diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py index 9522772e3..85512f352 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py @@ -78,13 +78,19 @@ class Table: def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]: commands : List[Tuple[int, str]] = list() + if removal: # NOTE: For now, do not remove tables. We do not process all kinds of # tables and their removal might cause side effects on NFTables. pass + elif self.handle is not None: + # NOTE: Table was already there, do not modify it + pass else: parts = ['add', 'table', self.family.value, self.table.value] commands.append((-2, ' '.join(parts))) + for chain in self.chains.values(): commands.extend(chain.get_commands(removal=removal)) + return commands diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py index fa8658d24..8388b2abe 100644 --- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py +++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py @@ -17,7 +17,9 @@ import enum class TableEnum(enum.Enum): FILTER = 'filter' + MANGLE = 'mangle' NAT = 'nat' + RAW = 'raw' ROUTE = 'route' def get_table_from_str(table : str) -> TableEnum: diff --git a/src/tests/tools/firewall_agent/redeploy.sh b/src/tests/tools/firewall_agent/redeploy-docker.sh similarity index 100% rename from src/tests/tools/firewall_agent/redeploy.sh rename to src/tests/tools/firewall_agent/redeploy-docker.sh diff --git a/src/tests/tools/firewall_agent/redeploy-kubernetes.sh b/src/tests/tools/firewall_agent/redeploy-kubernetes.sh new file mode 100755 index 000000000..ad42c14c4 --- /dev/null +++ b/src/tests/tools/firewall_agent/redeploy-kubernetes.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -euo pipefail + +docker build --tag "firewall-agent:dev" . +docker tag "firewall-agent:dev" "http://localhost:32000/tfs/firewall-agent:dev" +docker push "http://localhost:32000/tfs/firewall-agent:dev" + +kubectl delete namespace firewall-agent +kubectl create namespace firewall-agent +kubectl apply --namespace firewall-agent --filename=DeploymentSet.yaml +kubectl logs --namespace firewall-agent deployment/firewall-agent --follow -- GitLab From 243dfd4950f97035f82ad6a4bb206fe2189542b6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 16:26:38 +0000 Subject: [PATCH 120/371] Tests - Tools - Firewall Agent: - Added Kubernetes readinessProbe and livenessProbe --- src/tests/tools/firewall_agent/DeploymentSet.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml index d4271e63e..a8a01c28c 100644 --- a/src/tests/tools/firewall_agent/DeploymentSet.yaml +++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml @@ -40,3 +40,15 @@ spec: ports: - containerPort: 8888 # container listens on 8888 on the host now hostPort: 8888 # optional, but makes it explicit + readinessProbe: + httpGet: + path: /restconf/data + port: 8888 + initialDelaySeconds: 5 + timeoutSeconds: 1 + livenessProbe: + httpGet: + path: /restconf/data + port: 8888 + initialDelaySeconds: 5 + timeoutSeconds: 1 -- GitLab From e8d37cd0b6226f89b3caba3eb9eb1d3eca9f75ba Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 17:33:44 +0000 Subject: [PATCH 121/371] Restored CI/CD pipeline --- .gitlab-ci.yml | 100 ++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0985a50c1..e11c8474a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,53 +13,53 @@ # limitations under the License. -## stages of the cicd pipeline -#stages: -# #- dependencies -# - build -# - unit_test -# - end2end_test -# -## include the individual .gitlab-ci.yml of each micro-service and tests -#include: -# #- local: '/manifests/.gitlab-ci.yml' -# - local: '/src/monitoring/.gitlab-ci.yml' -# - local: '/src/nbi/.gitlab-ci.yml' -# - local: '/src/context/.gitlab-ci.yml' -# - local: '/src/device/.gitlab-ci.yml' -# - local: '/src/service/.gitlab-ci.yml' -# - local: '/src/qkd_app/.gitlab-ci.yml' -# - local: '/src/dbscanserving/.gitlab-ci.yml' -# - local: '/src/opticalattackmitigator/.gitlab-ci.yml' -# - local: '/src/opticalattackdetector/.gitlab-ci.yml' -# - local: '/src/opticalattackmanager/.gitlab-ci.yml' -# - local: '/src/opticalcontroller/.gitlab-ci.yml' -# - local: '/src/ztp/.gitlab-ci.yml' -# - local: '/src/policy/.gitlab-ci.yml' -# - local: '/src/automation/.gitlab-ci.yml' -# - local: '/src/forecaster/.gitlab-ci.yml' -# #- local: '/src/webui/.gitlab-ci.yml' -# #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' -# #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' -# #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' -# - local: '/src/slice/.gitlab-ci.yml' -# #- local: '/src/interdomain/.gitlab-ci.yml' -# - local: '/src/pathcomp/.gitlab-ci.yml' -# #- local: '/src/dlt/.gitlab-ci.yml' -# - local: '/src/load_generator/.gitlab-ci.yml' -# - local: '/src/bgpls_speaker/.gitlab-ci.yml' -# - local: '/src/kpi_manager/.gitlab-ci.yml' -# - local: '/src/kpi_value_api/.gitlab-ci.yml' -# #- local: '/src/kpi_value_writer/.gitlab-ci.yml' -# #- local: '/src/telemetry/.gitlab-ci.yml' -# - local: '/src/analytics/.gitlab-ci.yml' -# - local: '/src/qos_profile/.gitlab-ci.yml' -# - local: '/src/vnt_manager/.gitlab-ci.yml' -# - local: '/src/e2e_orchestrator/.gitlab-ci.yml' -# - local: '/src/ztp_server/.gitlab-ci.yml' -# - local: '/src/osm_client/.gitlab-ci.yml' -# - local: '/src/simap_connector/.gitlab-ci.yml' -# - local: '/src/pluggables/.gitlab-ci.yml' -# -# # This should be last one: end-to-end integration tests -# - local: '/src/tests/.gitlab-ci.yml' +# stages of the cicd pipeline +stages: + #- dependencies + - build + - unit_test + - end2end_test + +# include the individual .gitlab-ci.yml of each micro-service and tests +include: + #- local: '/manifests/.gitlab-ci.yml' + - local: '/src/monitoring/.gitlab-ci.yml' + - local: '/src/nbi/.gitlab-ci.yml' + - local: '/src/context/.gitlab-ci.yml' + - local: '/src/device/.gitlab-ci.yml' + - local: '/src/service/.gitlab-ci.yml' + - local: '/src/qkd_app/.gitlab-ci.yml' + - local: '/src/dbscanserving/.gitlab-ci.yml' + - local: '/src/opticalattackmitigator/.gitlab-ci.yml' + - local: '/src/opticalattackdetector/.gitlab-ci.yml' + - local: '/src/opticalattackmanager/.gitlab-ci.yml' + - local: '/src/opticalcontroller/.gitlab-ci.yml' + - local: '/src/ztp/.gitlab-ci.yml' + - local: '/src/policy/.gitlab-ci.yml' + - local: '/src/automation/.gitlab-ci.yml' + - local: '/src/forecaster/.gitlab-ci.yml' + #- local: '/src/webui/.gitlab-ci.yml' + #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml' + #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml' + #- local: '/src/l3_attackmitigator/.gitlab-ci.yml' + - local: '/src/slice/.gitlab-ci.yml' + #- local: '/src/interdomain/.gitlab-ci.yml' + - local: '/src/pathcomp/.gitlab-ci.yml' + #- local: '/src/dlt/.gitlab-ci.yml' + - local: '/src/load_generator/.gitlab-ci.yml' + - local: '/src/bgpls_speaker/.gitlab-ci.yml' + - local: '/src/kpi_manager/.gitlab-ci.yml' + - local: '/src/kpi_value_api/.gitlab-ci.yml' + #- local: '/src/kpi_value_writer/.gitlab-ci.yml' + #- local: '/src/telemetry/.gitlab-ci.yml' + - local: '/src/analytics/.gitlab-ci.yml' + - local: '/src/qos_profile/.gitlab-ci.yml' + - local: '/src/vnt_manager/.gitlab-ci.yml' + - local: '/src/e2e_orchestrator/.gitlab-ci.yml' + - local: '/src/ztp_server/.gitlab-ci.yml' + - local: '/src/osm_client/.gitlab-ci.yml' + - local: '/src/simap_connector/.gitlab-ci.yml' + - local: '/src/pluggables/.gitlab-ci.yml' + + # This should be last one: end-to-end integration tests + - local: '/src/tests/.gitlab-ci.yml' -- GitLab From 7cdaeb78eec82efa8783763fcf0e1abab01d9ce0 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 17:34:25 +0000 Subject: [PATCH 122/371] Tests - Tools - Firewall Agent: - Fixed Dockerfile - Fixed requirements.txt --- src/tests/tools/firewall_agent/Dockerfile | 6 +++--- src/tests/tools/firewall_agent/requirements.txt | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/tests/tools/firewall_agent/Dockerfile b/src/tests/tools/firewall_agent/Dockerfile index dec746c5c..3207a5fff 100644 --- a/src/tests/tools/firewall_agent/Dockerfile +++ b/src/tests/tools/firewall_agent/Dockerfile @@ -17,9 +17,9 @@ FROM python:3.11-slim ENV PYTHONUNBUFFERED=0 -RUN apt-get update -y -RUN apt-get install -y --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables -RUN apt-get clean -y && rm -rf /var/lib/apt/lists/* +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables && \ + apt-get clean -y && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt ./ diff --git a/src/tests/tools/firewall_agent/requirements.txt b/src/tests/tools/firewall_agent/requirements.txt index af4fe3e7c..4ed5d0f4e 100644 --- a/src/tests/tools/firewall_agent/requirements.txt +++ b/src/tests/tools/firewall_agent/requirements.txt @@ -17,5 +17,3 @@ flask-restful>=0.3.9 Flask>=2.0 netifaces>=0.11 pip-nftables==1.0.2.post1 -pytest>=7.0 -requests>=2.0 -- GitLab From 59066ee916761c04f91078d8bc6060eaf07764d7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 19:00:43 +0000 Subject: [PATCH 123/371] Tests - Tools - Firewall Agent: - Fixed DeploymentSet --- .../tools/firewall_agent/DeploymentSet.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml index a8a01c28c..f23b33f26 100644 --- a/src/tests/tools/firewall_agent/DeploymentSet.yaml +++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml @@ -33,6 +33,7 @@ spec: - name: firewall-agent image: firewall-agent:dev #image: localhost:32000/tfs/firewall-agent:dev + imagePullPolicy: Always securityContext: capabilities: add: ["NET_ADMIN"] # like --cap-add=NET_ADMIN @@ -52,3 +53,21 @@ spec: port: 8888 initialDelaySeconds: 5 timeoutSeconds: 1 +## Service not needed as pod is directly exposed on host network +#--- +#apiVersion: v1 +#kind: Service +#metadata: +# name: firewall-agent +# labels: +# app: firewall-agent +#spec: +# type: NodePort +# selector: +# app: firewall-agent +# ports: +# - name: mgmt +# protocol: TCP +# port: 8888 +# targetPort: 8888 +# nodePort: 30888 -- GitLab From 011890de6d6852d8308c9774d504a002cbbeca55 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 19:17:18 +0000 Subject: [PATCH 124/371] ZTP component: - Regenerated gRPC code --- .../grpc/context/ContextOuterClass.java | 13 +++++++- src/ztp/target/kubernetes/kubernetes.yml | 32 +++++++++---------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java index 558aa9778..27cde66fb 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java @@ -231,6 +231,10 @@ public final class ContextOuterClass { * DEVICEDRIVER_OPENROADM = 20; */ DEVICEDRIVER_OPENROADM(20), + /** + * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21; + */ + DEVICEDRIVER_RESTCONF_OPENCONFIG(21), UNRECOGNIZED(-1); /** @@ -342,6 +346,11 @@ public final class ContextOuterClass { */ public static final int DEVICEDRIVER_OPENROADM_VALUE = 20; + /** + * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21; + */ + public static final int DEVICEDRIVER_RESTCONF_OPENCONFIG_VALUE = 21; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -407,6 +416,8 @@ public final class ContextOuterClass { return DEVICEDRIVER_GNMI_NOKIA_SRLINUX; case 20: return DEVICEDRIVER_OPENROADM; + case 21: + return DEVICEDRIVER_RESTCONF_OPENCONFIG; default: return null; } @@ -90370,7 +90381,7 @@ public final class ContextOuterClass { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"8\n\rContextIdList\022\'\n\013context_ids\030\001 \003" + "(\0132\022.context.ContextId\"1\n\013ContextList\022\"\n" + "\010contexts\030\001 \003(\0132\020.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002 \001(" + "\t\022%\n\ndevice_ids\030\003 \003(\0132\021.context.DeviceId" + "\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_uuid\030\001 \001(\0132\r.context.Uuid\022\014\n\004name\030" + "\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\030\005 \001(\t\0321\n\017AttributesEntry\022\013\n\003key\030\001 " + "\001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.LinkAttributes\"/\n" + "\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017.context." + "LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(\0132\r.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.Event\022 \n\007link_id\030\002 \001(\0132\017.context." + "LinkId\"X\n\tServiceId\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022#\n\014service_uuid\030\002 \001(" + "\0132\r.context.Uuid\"\333\002\n\007Service\022&\n\nservice_" + "id\030\001 \001(\0132\022.context.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\030\003 \001(\r\022\017\n\007vlan_id\030\004 \001(\r\022\022\n\nmpls_label\030\005" + " \001(\r\022\032\n\022mpls_traffic_class\030\006 \001(\r\"t\n\025Conn" + "ectionSettings_L3\022\026\n\016src_ip_address\030\001 \001(" + "\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022" + "\020\n\010protocol\030\004 \001(\r\022\013\n\003ttl\030\005 \001(\r\"[\n\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022\025\n\rauthenticated\030\002 \001" + "(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\032\023.context.LinkIdList\"" + "\000\0220\n\tListLinks\022\016.context.Empty\032\021.context" + ".LinkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032" + "\r.context.Link\"\000\022+\n\007SetLink\022\r.context.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" }; + java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"8\n\rContextIdList\022\'\n\013context_ids\030\001 \003" + "(\0132\022.context.ContextId\"1\n\013ContextList\022\"\n" + "\010contexts\030\001 \003(\0132\020.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002 \001(" + "\t\022%\n\ndevice_ids\030\003 \003(\0132\021.context.DeviceId" + "\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_uuid\030\001 \001(\0132\r.context.Uuid\022\014\n\004name\030" + "\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\030\005 \001(\t\0321\n\017AttributesEntry\022\013\n\003key\030\001 " + "\001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.LinkAttributes\"/\n" + "\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017.context." + "LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(\0132\r.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.Event\022 \n\007link_id\030\002 \001(\0132\017.context." + "LinkId\"X\n\tServiceId\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022#\n\014service_uuid\030\002 \001(" + "\0132\r.context.Uuid\"\333\002\n\007Service\022&\n\nservice_" + "id\030\001 \001(\0132\022.context.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\030\003 \001(\r\022\017\n\007vlan_id\030\004 \001(\r\022\022\n\nmpls_label\030\005" + " \001(\r\022\032\n\022mpls_traffic_class\030\006 \001(\r\"t\n\025Conn" + "ectionSettings_L3\022\026\n\016src_ip_address\030\001 \001(" + "\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022" + "\020\n\010protocol\030\004 \001(\r\022\013\n\003ttl\030\005 \001(\r\"[\n\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022\025\n\rauthenticated\030\002 \001" + "(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\201\005\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024\022$\n DEVICEDRI" + "VER_RESTCONF_OPENCONFIG\020\025*\217\001\n\033DeviceOper" + "ationalStatusEnum\022%\n!DEVICEOPERATIONALST" + "ATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTA" + "TUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATU" + "S_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE" + "_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKT" + "YPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKT" + "YPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023" + "\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022" + "\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_" + "L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICET" + "YPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVI" + "CETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERV" + "ICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVIC" + "ETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SER" + "VICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023S" + "ERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI" + "_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Servi" + "ceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020" + "\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICES" + "TATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING" + "\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n" + "\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceS" + "tatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023" + "SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INI" + "T\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTAT" + "US_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020" + "\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_UN" + "DEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFI" + "GACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025\n\021" + "ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_INGR" + "ESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Constr" + "aintActionEnum\022\036\n\032CONSTRAINTACTION_UNDEF" + "INED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONS" + "TRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLevel" + "Enum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLA" + "TION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS" + "_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATIO" + "N\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032V" + "IRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_F" + "UNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATIO" + "N\020\0102\274\035\n\016ContextService\022:\n\016ListContextIds" + "\022\016.context.Empty\032\026.context.ContextIdList" + "\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.con" + "text.ContextList\"\000\0224\n\nGetContext\022\022.conte" + "xt.ContextId\032\020.context.Context\"\000\0224\n\nSetC" + "ontext\022\020.context.Context\032\022.context.Conte" + "xtId\"\000\0225\n\rRemoveContext\022\022.context.Contex" + "tId\032\016.context.Empty\"\000\022=\n\020GetContextEvent" + "s\022\016.context.Empty\032\025.context.ContextEvent" + "\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Contex" + "tId\032\027.context.TopologyIdList\"\000\022=\n\016ListTo" + "pologies\022\022.context.ContextId\032\025.context.T" + "opologyList\"\000\0227\n\013GetTopology\022\023.context.T" + "opologyId\032\021.context.Topology\"\000\022E\n\022GetTop" + "ologyDetails\022\023.context.TopologyId\032\030.cont" + "ext.TopologyDetails\"\000\0227\n\013SetTopology\022\021.c" + "ontext.Topology\032\023.context.TopologyId\"\000\0227" + "\n\016RemoveTopology\022\023.context.TopologyId\032\016." + "context.Empty\"\000\022?\n\021GetTopologyEvents\022\016.c" + "ontext.Empty\032\026.context.TopologyEvent\"\0000\001" + "\0228\n\rListDeviceIds\022\016.context.Empty\032\025.cont" + "ext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.cont" + "ext.Empty\032\023.context.DeviceList\"\000\0221\n\tGetD" + "evice\022\021.context.DeviceId\032\017.context.Devic" + "e\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.cont" + "ext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.context" + ".DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevice" + "Events\022\016.context.Empty\032\024.context.DeviceE" + "vent\"\0000\001\022<\n\014SelectDevice\022\025.context.Devic" + "eFilter\032\023.context.DeviceList\"\000\022I\n\021ListEn" + "dPointNames\022\027.context.EndPointIdList\032\031.c" + "ontext.EndPointNameList\"\000\0224\n\013ListLinkIds" + "\022\016.context.Empty\032\023.context.LinkIdList\"\000\022" + "0\n\tListLinks\022\016.context.Empty\032\021.context.L" + "inkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r." + "context.Link\"\000\022+\n\007SetLink\022\r.context.Link" + "\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLinkE" + "vents\022\016.context.Empty\032\022.context.LinkEven" + "t\"\0000\001\022>\n\016ListServiceIds\022\022.context.Contex" + "tId\032\026.context.ServiceIdList\"\000\022:\n\014ListSer" + "vices\022\022.context.ContextId\032\024.context.Serv" + "iceList\"\000\0224\n\nGetService\022\022.context.Servic" + "eId\032\020.context.Service\"\000\0224\n\nSetService\022\020." + "context.Service\032\022.context.ServiceId\"\000\0226\n" + "\014UnsetService\022\020.context.Service\032\022.contex" + "t.ServiceId\"\000\0225\n\rRemoveService\022\022.context" + ".ServiceId\032\016.context.Empty\"\000\022=\n\020GetServi", "ceEvents\022\016.context.Empty\032\025.context.Servi" + "ceEvent\"\0000\001\022?\n\rSelectService\022\026.context.S" + "erviceFilter\032\024.context.ServiceList\"\000\022:\n\014" + "ListSliceIds\022\022.context.ContextId\032\024.conte" + "xt.SliceIdList\"\000\0226\n\nListSlices\022\022.context" + ".ContextId\032\022.context.SliceList\"\000\022.\n\010GetS" + "lice\022\020.context.SliceId\032\016.context.Slice\"\000" + "\022.\n\010SetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice\032\020" + ".context.SliceId\"\000\0221\n\013RemoveSlice\022\020.cont" + "ext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSlic" + "eEvents\022\016.context.Empty\032\023.context.SliceE" + "vent\"\0000\001\0229\n\013SelectSlice\022\024.context.SliceF" + "ilter\032\022.context.SliceList\"\000\022D\n\021ListConne" + "ctionIds\022\022.context.ServiceId\032\031.context.C" + "onnectionIdList\"\000\022@\n\017ListConnections\022\022.c" + "ontext.ServiceId\032\027.context.ConnectionLis" + "t\"\000\022=\n\rGetConnection\022\025.context.Connectio" + "nId\032\023.context.Connection\"\000\022=\n\rSetConnect" + "ion\022\023.context.Connection\032\025.context.Conne" + "ctionId\"\000\022;\n\020RemoveConnection\022\025.context." + "ConnectionId\032\016.context.Empty\"\000\022C\n\023GetCon" + "nectionEvents\022\016.context.Empty\032\030.context." + "ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016.co" + "ntext.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020Ge" + "tOpticalConfig\022\016.context.Empty\032\032.context" + ".OpticalConfigList\"\000\022F\n\020SetOpticalConfig" + "\022\026.context.OpticalConfig\032\030.context.Optic" + "alConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026.co" + "ntext.OpticalConfig\032\030.context.OpticalCon" + "figId\"\000\022I\n\023SelectOpticalConfig\022\030.context" + ".OpticalConfigId\032\026.context.OpticalConfig" + "\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Opti" + "calConfigId\032\016.context.Empty\"\000\022@\n\024DeleteO" + "pticalChannel\022\026.context.OpticalConfig\032\016." + "context.Empty\"\000\0228\n\016SetOpticalLink\022\024.cont" + "ext.OpticalLink\032\016.context.Empty\"\000\0229\n\016Get" + "OpticalLink\022\017.context.LinkId\032\024.context.O" + "pticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOptic" + "alLinkList\022\016.context.Empty\032\030.context.Opt" + "icalLinkList\"\000\022<\n\016GetOpticalBand\022\016.conte" + "xt.Empty\032\030.context.OpticalBandList\"\000\022C\n\021" + "SelectOpticalBand\022\026.context.OpticalBandI" + "d\032\024.context.OpticalBand\"\000\022G\n\027DeleteServi" + "ceConfigRule\022\032.context.ServiceConfigRule" + "\032\016.context.Empty\"\000b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.getDescriptor() }); internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {}); diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml index 23494d5c7..0e964529c 100644 --- a/src/ztp/target/kubernetes/kubernetes.yml +++ b/src/ztp/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000 + app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -17,18 +17,18 @@ metadata: name: ztpservice spec: ports: - - name: https - port: 443 + - name: grpc + port: 5050 protocol: TCP - targetPort: 8443 + targetPort: 5050 - name: http port: 9192 protocol: TCP targetPort: 8080 - - name: grpc - port: 5050 + - name: https + port: 443 protocol: TCP - targetPort: 5050 + targetPort: 8443 selector: app.kubernetes.io/name: ztpservice type: ClusterIP @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000 + app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000 + app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -93,14 +93,14 @@ spec: timeoutSeconds: 10 name: ztpservice ports: - - containerPort: 8443 - name: https + - containerPort: 5050 + name: grpc protocol: TCP - containerPort: 8080 name: http protocol: TCP - - containerPort: 5050 - name: grpc + - containerPort: 8443 + name: https protocol: TCP readinessProbe: failureThreshold: 3 -- GitLab From a12b1122d1b8859d89746c4dc49c60fec4e5dcb6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 11 Nov 2025 19:24:42 +0000 Subject: [PATCH 125/371] Policy component: - Regenerated gRPC code --- .../grpc/context/ContextOuterClass.java | 13 +++++- src/policy/target/kubernetes/kubernetes.yml | 44 +++++++++---------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java index 558aa9778..27cde66fb 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java @@ -231,6 +231,10 @@ public final class ContextOuterClass { * DEVICEDRIVER_OPENROADM = 20; */ DEVICEDRIVER_OPENROADM(20), + /** + * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21; + */ + DEVICEDRIVER_RESTCONF_OPENCONFIG(21), UNRECOGNIZED(-1); /** @@ -342,6 +346,11 @@ public final class ContextOuterClass { */ public static final int DEVICEDRIVER_OPENROADM_VALUE = 20; + /** + * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21; + */ + public static final int DEVICEDRIVER_RESTCONF_OPENCONFIG_VALUE = 21; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -407,6 +416,8 @@ public final class ContextOuterClass { return DEVICEDRIVER_GNMI_NOKIA_SRLINUX; case 20: return DEVICEDRIVER_OPENROADM; + case 21: + return DEVICEDRIVER_RESTCONF_OPENCONFIG; default: return null; } @@ -90370,7 +90381,7 @@ public final class ContextOuterClass { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"8\n\rContextIdList\022\'\n\013context_ids\030\001 \003" + "(\0132\022.context.ContextId\"1\n\013ContextList\022\"\n" + "\010contexts\030\001 \003(\0132\020.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002 \001(" + "\t\022%\n\ndevice_ids\030\003 \003(\0132\021.context.DeviceId" + "\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_uuid\030\001 \001(\0132\r.context.Uuid\022\014\n\004name\030" + "\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\030\005 \001(\t\0321\n\017AttributesEntry\022\013\n\003key\030\001 " + "\001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.LinkAttributes\"/\n" + "\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017.context." + "LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(\0132\r.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.Event\022 \n\007link_id\030\002 \001(\0132\017.context." + "LinkId\"X\n\tServiceId\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022#\n\014service_uuid\030\002 \001(" + "\0132\r.context.Uuid\"\333\002\n\007Service\022&\n\nservice_" + "id\030\001 \001(\0132\022.context.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\030\003 \001(\r\022\017\n\007vlan_id\030\004 \001(\r\022\022\n\nmpls_label\030\005" + " \001(\r\022\032\n\022mpls_traffic_class\030\006 \001(\r\"t\n\025Conn" + "ectionSettings_L3\022\026\n\016src_ip_address\030\001 \001(" + "\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022" + "\020\n\010protocol\030\004 \001(\r\022\013\n\003ttl\030\005 \001(\r\"[\n\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022\025\n\rauthenticated\030\002 \001" + "(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\032\023.context.LinkIdList\"" + "\000\0220\n\tListLinks\022\016.context.Empty\032\021.context" + ".LinkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032" + "\r.context.Link\"\000\022+\n\007SetLink\022\r.context.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" }; + java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"8\n\rContextIdList\022\'\n\013context_ids\030\001 \003" + "(\0132\022.context.ContextId\"1\n\013ContextList\022\"\n" + "\010contexts\030\001 \003(\0132\020.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002 \001(" + "\t\022%\n\ndevice_ids\030\003 \003(\0132\021.context.DeviceId" + "\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_uuid\030\001 \001(\0132\r.context.Uuid\022\014\n\004name\030" + "\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\030\005 \001(\t\0321\n\017AttributesEntry\022\013\n\003key\030\001 " + "\001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.LinkAttributes\"/\n" + "\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017.context." + "LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(\0132\r.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.Event\022 \n\007link_id\030\002 \001(\0132\017.context." + "LinkId\"X\n\tServiceId\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022#\n\014service_uuid\030\002 \001(" + "\0132\r.context.Uuid\"\333\002\n\007Service\022&\n\nservice_" + "id\030\001 \001(\0132\022.context.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\030\003 \001(\r\022\017\n\007vlan_id\030\004 \001(\r\022\022\n\nmpls_label\030\005" + " \001(\r\022\032\n\022mpls_traffic_class\030\006 \001(\r\"t\n\025Conn" + "ectionSettings_L3\022\026\n\016src_ip_address\030\001 \001(" + "\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022" + "\020\n\010protocol\030\004 \001(\r\022\013\n\003ttl\030\005 \001(\r\"[\n\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\022&\n\ncontext_id\030\001 \001(\0132" + "\022.context.ContextId\022\025\n\rauthenticated\030\002 \001" + "(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\201\005\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024\022$\n DEVICEDRI" + "VER_RESTCONF_OPENCONFIG\020\025*\217\001\n\033DeviceOper" + "ationalStatusEnum\022%\n!DEVICEOPERATIONALST" + "ATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTA" + "TUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATU" + "S_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE" + "_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKT" + "YPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKT" + "YPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023" + "\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022" + "\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_" + "L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICET" + "YPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVI" + "CETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERV" + "ICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVIC" + "ETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SER" + "VICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023S" + "ERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI" + "_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Servi" + "ceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020" + "\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICES" + "TATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING" + "\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n" + "\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceS" + "tatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023" + "SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INI" + "T\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTAT" + "US_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020" + "\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_UN" + "DEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFI" + "GACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025\n\021" + "ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_INGR" + "ESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Constr" + "aintActionEnum\022\036\n\032CONSTRAINTACTION_UNDEF" + "INED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONS" + "TRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLevel" + "Enum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLA" + "TION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS" + "_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATIO" + "N\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032V" + "IRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_F" + "UNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATIO" + "N\020\0102\274\035\n\016ContextService\022:\n\016ListContextIds" + "\022\016.context.Empty\032\026.context.ContextIdList" + "\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.con" + "text.ContextList\"\000\0224\n\nGetContext\022\022.conte" + "xt.ContextId\032\020.context.Context\"\000\0224\n\nSetC" + "ontext\022\020.context.Context\032\022.context.Conte" + "xtId\"\000\0225\n\rRemoveContext\022\022.context.Contex" + "tId\032\016.context.Empty\"\000\022=\n\020GetContextEvent" + "s\022\016.context.Empty\032\025.context.ContextEvent" + "\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Contex" + "tId\032\027.context.TopologyIdList\"\000\022=\n\016ListTo" + "pologies\022\022.context.ContextId\032\025.context.T" + "opologyList\"\000\0227\n\013GetTopology\022\023.context.T" + "opologyId\032\021.context.Topology\"\000\022E\n\022GetTop" + "ologyDetails\022\023.context.TopologyId\032\030.cont" + "ext.TopologyDetails\"\000\0227\n\013SetTopology\022\021.c" + "ontext.Topology\032\023.context.TopologyId\"\000\0227" + "\n\016RemoveTopology\022\023.context.TopologyId\032\016." + "context.Empty\"\000\022?\n\021GetTopologyEvents\022\016.c" + "ontext.Empty\032\026.context.TopologyEvent\"\0000\001" + "\0228\n\rListDeviceIds\022\016.context.Empty\032\025.cont" + "ext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.cont" + "ext.Empty\032\023.context.DeviceList\"\000\0221\n\tGetD" + "evice\022\021.context.DeviceId\032\017.context.Devic" + "e\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.cont" + "ext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.context" + ".DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevice" + "Events\022\016.context.Empty\032\024.context.DeviceE" + "vent\"\0000\001\022<\n\014SelectDevice\022\025.context.Devic" + "eFilter\032\023.context.DeviceList\"\000\022I\n\021ListEn" + "dPointNames\022\027.context.EndPointIdList\032\031.c" + "ontext.EndPointNameList\"\000\0224\n\013ListLinkIds" + "\022\016.context.Empty\032\023.context.LinkIdList\"\000\022" + "0\n\tListLinks\022\016.context.Empty\032\021.context.L" + "inkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r." + "context.Link\"\000\022+\n\007SetLink\022\r.context.Link" + "\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLinkE" + "vents\022\016.context.Empty\032\022.context.LinkEven" + "t\"\0000\001\022>\n\016ListServiceIds\022\022.context.Contex" + "tId\032\026.context.ServiceIdList\"\000\022:\n\014ListSer" + "vices\022\022.context.ContextId\032\024.context.Serv" + "iceList\"\000\0224\n\nGetService\022\022.context.Servic" + "eId\032\020.context.Service\"\000\0224\n\nSetService\022\020." + "context.Service\032\022.context.ServiceId\"\000\0226\n" + "\014UnsetService\022\020.context.Service\032\022.contex" + "t.ServiceId\"\000\0225\n\rRemoveService\022\022.context" + ".ServiceId\032\016.context.Empty\"\000\022=\n\020GetServi", "ceEvents\022\016.context.Empty\032\025.context.Servi" + "ceEvent\"\0000\001\022?\n\rSelectService\022\026.context.S" + "erviceFilter\032\024.context.ServiceList\"\000\022:\n\014" + "ListSliceIds\022\022.context.ContextId\032\024.conte" + "xt.SliceIdList\"\000\0226\n\nListSlices\022\022.context" + ".ContextId\032\022.context.SliceList\"\000\022.\n\010GetS" + "lice\022\020.context.SliceId\032\016.context.Slice\"\000" + "\022.\n\010SetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice\032\020" + ".context.SliceId\"\000\0221\n\013RemoveSlice\022\020.cont" + "ext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSlic" + "eEvents\022\016.context.Empty\032\023.context.SliceE" + "vent\"\0000\001\0229\n\013SelectSlice\022\024.context.SliceF" + "ilter\032\022.context.SliceList\"\000\022D\n\021ListConne" + "ctionIds\022\022.context.ServiceId\032\031.context.C" + "onnectionIdList\"\000\022@\n\017ListConnections\022\022.c" + "ontext.ServiceId\032\027.context.ConnectionLis" + "t\"\000\022=\n\rGetConnection\022\025.context.Connectio" + "nId\032\023.context.Connection\"\000\022=\n\rSetConnect" + "ion\022\023.context.Connection\032\025.context.Conne" + "ctionId\"\000\022;\n\020RemoveConnection\022\025.context." + "ConnectionId\032\016.context.Empty\"\000\022C\n\023GetCon" + "nectionEvents\022\016.context.Empty\032\030.context." + "ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016.co" + "ntext.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020Ge" + "tOpticalConfig\022\016.context.Empty\032\032.context" + ".OpticalConfigList\"\000\022F\n\020SetOpticalConfig" + "\022\026.context.OpticalConfig\032\030.context.Optic" + "alConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026.co" + "ntext.OpticalConfig\032\030.context.OpticalCon" + "figId\"\000\022I\n\023SelectOpticalConfig\022\030.context" + ".OpticalConfigId\032\026.context.OpticalConfig" + "\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Opti" + "calConfigId\032\016.context.Empty\"\000\022@\n\024DeleteO" + "pticalChannel\022\026.context.OpticalConfig\032\016." + "context.Empty\"\000\0228\n\016SetOpticalLink\022\024.cont" + "ext.OpticalLink\032\016.context.Empty\"\000\0229\n\016Get" + "OpticalLink\022\017.context.LinkId\032\024.context.O" + "pticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOptic" + "alLinkList\022\016.context.Empty\032\030.context.Opt" + "icalLinkList\"\000\022<\n\016GetOpticalBand\022\016.conte" + "xt.Empty\032\030.context.OpticalBandList\"\000\022C\n\021" + "SelectOpticalBand\022\026.context.OpticalBandI" + "d\032\024.context.OpticalBand\"\000\022G\n\027DeleteServi" + "ceConfigRule\022\032.context.ServiceConfigRule" + "\032\016.context.Empty\"\000b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.getDescriptor() }); internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {}); diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index cab8865e0..820135c62 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000 + app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -17,18 +17,18 @@ metadata: name: policyservice spec: ports: - - name: http - port: 9192 + - name: https + port: 443 protocol: TCP - targetPort: 8080 + targetPort: 8443 - name: grpc port: 6060 protocol: TCP targetPort: 6060 - - name: https - port: 443 + - name: http + port: 9192 protocol: TCP - targetPort: 8443 + targetPort: 8080 selector: app.kubernetes.io/name: policyservice type: ClusterIP @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000 + app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -46,8 +46,8 @@ metadata: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.1.0 app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 name: policyservice spec: replicas: 1 @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa - app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000 + app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55 + app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -66,8 +66,8 @@ spec: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.1.0 app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 spec: containers: - env: @@ -75,14 +75,14 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: MONITORING_SERVICE_HOST + value: monitoringservice - name: CONTEXT_SERVICE_HOST value: contextservice - - name: KAFKA_BROKER_HOST - value: kafka-service.kafka.svc.cluster.local - name: SERVICE_SERVICE_HOST value: serviceservice - - name: MONITORING_SERVICE_HOST - value: monitoringservice + - name: KAFKA_BROKER_HOST + value: kafka-service.kafka.svc.cluster.local image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 imagePullPolicy: Always livenessProbe: @@ -97,14 +97,14 @@ spec: timeoutSeconds: 10 name: policyservice ports: - - containerPort: 8080 - name: http + - containerPort: 8443 + name: https protocol: TCP - containerPort: 6060 name: grpc protocol: TCP - - containerPort: 8443 - name: https + - containerPort: 8080 + name: http protocol: TCP readinessProbe: failureThreshold: 3 -- GitLab From 276b5c06bf9b0adcbe056f03b6dfda58759f4969 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 13 Nov 2025 18:21:45 +0000 Subject: [PATCH 126/371] Add missing headers --- .../traffic_changer/templates/affect_form.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tests/tools/traffic_changer/templates/affect_form.html b/src/tests/tools/traffic_changer/templates/affect_form.html index cfdb0296d..204d6ebb2 100644 --- a/src/tests/tools/traffic_changer/templates/affect_form.html +++ b/src/tests/tools/traffic_changer/templates/affect_form.html @@ -1,4 +1,20 @@ + + -- GitLab From 97894f4047466b488ce249576459b72af6170b84 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 13 Nov 2025 18:28:45 +0000 Subject: [PATCH 127/371] Fix wrong headers --- proto/ip_link.proto | 2 +- proto/tapi_lsp.proto | 2 +- src/automation/service/zsm_handlers/P4INTZSMPlugin.py | 2 +- src/automation/service/zsm_handlers/__init__.py | 2 +- src/automation/tests/test_automation_handlers.py | 2 +- src/context/service/database/OpticalBand.py | 2 +- .../service/database/models/OpticalConfig/OpticalBandModel.py | 2 +- src/device/service/drivers/openroadm/OpenROADMDriver.py | 2 +- src/device/service/drivers/openroadm/RetryDecorator.py | 2 +- src/device/service/drivers/openroadm/Tools.py | 2 +- .../service/drivers/openroadm/templates/Provisioning/common.py | 2 +- .../drivers/openroadm/templates/Provisioning/openroadm.py | 2 +- src/device/tests/dscm/Fixtures.py | 2 +- .../org/etsi/tfs/policy/context/model/ConstraintExclusions.java | 2 +- .../etsi/tfs/policy/context/model/ConstraintTypeExclusions.java | 2 +- .../main/java/org/etsi/tfs/policy/context/model/DeviceId.java | 2 +- .../src/main/java/org/etsi/tfs/policy/context/model/LinkId.java | 2 +- src/service/service/service_handlers/ipowdm/ConfigRules.py | 2 +- .../service/service_handlers/ipowdm/IpowdmServiceHandler.py | 2 +- src/service/service/service_handlers/ipowdm/__init__.py | 2 +- src/service/service/service_handlers/tapi_lsp/ConfigRules.py | 2 +- .../service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py | 2 +- src/service/service/service_handlers/tapi_lsp/__init__.py | 2 +- src/service/tests/qkd/test_functional_bootstrap.py | 2 +- src/telemetry/backend/Config.py | 2 +- src/telemetry/backend/Tools.py | 2 +- src/telemetry/backend/service/ErrorMessages.py | 2 +- src/telemetry/backend/service/collector_api/DriverFactory.py | 2 +- .../backend/service/collector_api/DriverInstanceCache.py | 2 +- src/telemetry/backend/service/collector_api/Exceptions.py | 2 +- src/telemetry/backend/service/collector_api/FilterFields.py | 2 +- src/telemetry/backend/service/collectors/__init__.py | 2 +- src/tests/ofc24/refresh_op.sh | 2 +- src/webui/service/templates/opticalconfig/lightpaths.html | 2 +- src/webui/service/templates/opticalconfig/opticalbands.html | 2 +- src/webui/service/templates/opticalconfig/opticallinks.html | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) diff --git a/proto/ip_link.proto b/proto/ip_link.proto index a4f00b0de..9b4294162 100644 --- a/proto/ip_link.proto +++ b/proto/ip_link.proto @@ -1,4 +1,4 @@ -// Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/proto/tapi_lsp.proto b/proto/tapi_lsp.proto index 8db84cf7c..da9f1a739 100644 --- a/proto/tapi_lsp.proto +++ b/proto/tapi_lsp.proto @@ -1,4 +1,4 @@ -// Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py index a16979530..e71e2e6e3 100644 --- a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py +++ b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py index ae96f895e..6a371461b 100644 --- a/src/automation/service/zsm_handlers/__init__.py +++ b/src/automation/service/zsm_handlers/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/automation/tests/test_automation_handlers.py b/src/automation/tests/test_automation_handlers.py index 16fbcb255..0530e7614 100644 --- a/src/automation/tests/test_automation_handlers.py +++ b/src/automation/tests/test_automation_handlers.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/context/service/database/OpticalBand.py b/src/context/service/database/OpticalBand.py index 08b88d55b..6057adaad 100644 --- a/src/context/service/database/OpticalBand.py +++ b/src/context/service/database/OpticalBand.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/context/service/database/models/OpticalConfig/OpticalBandModel.py b/src/context/service/database/models/OpticalConfig/OpticalBandModel.py index 735869738..ba69d508d 100644 --- a/src/context/service/database/models/OpticalConfig/OpticalBandModel.py +++ b/src/context/service/database/models/OpticalConfig/OpticalBandModel.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/service/drivers/openroadm/OpenROADMDriver.py b/src/device/service/drivers/openroadm/OpenROADMDriver.py index f1a388b84..8468d4723 100644 --- a/src/device/service/drivers/openroadm/OpenROADMDriver.py +++ b/src/device/service/drivers/openroadm/OpenROADMDriver.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/service/drivers/openroadm/RetryDecorator.py b/src/device/service/drivers/openroadm/RetryDecorator.py index df37414c1..be86498fe 100644 --- a/src/device/service/drivers/openroadm/RetryDecorator.py +++ b/src/device/service/drivers/openroadm/RetryDecorator.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/service/drivers/openroadm/Tools.py b/src/device/service/drivers/openroadm/Tools.py index 45407d38d..33c755d71 100644 --- a/src/device/service/drivers/openroadm/Tools.py +++ b/src/device/service/drivers/openroadm/Tools.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/service/drivers/openroadm/templates/Provisioning/common.py b/src/device/service/drivers/openroadm/templates/Provisioning/common.py index 6edaefc2f..55d404f8d 100644 --- a/src/device/service/drivers/openroadm/templates/Provisioning/common.py +++ b/src/device/service/drivers/openroadm/templates/Provisioning/common.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py b/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py index 32c03b026..ef51d3a05 100644 --- a/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py +++ b/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/device/tests/dscm/Fixtures.py b/src/device/tests/dscm/Fixtures.py index 458d0d786..ab9e67a90 100644 --- a/src/device/tests/dscm/Fixtures.py +++ b/src/device/tests/dscm/Fixtures.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java index 383e14fee..efcf40777 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) + * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java index 4436b2b62..b1980c2e2 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) + * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java index fd1352819..facb4c4bf 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) + * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java index fe7fcff2a..c7b0c83ce 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) + * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/ipowdm/ConfigRules.py b/src/service/service/service_handlers/ipowdm/ConfigRules.py index e36dd7bab..7f48c6071 100644 --- a/src/service/service/service_handlers/ipowdm/ConfigRules.py +++ b/src/service/service/service_handlers/ipowdm/ConfigRules.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py b/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py index e22c5d28f..db4a41e43 100644 --- a/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py +++ b/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/ipowdm/__init__.py b/src/service/service/service_handlers/ipowdm/__init__.py index 6242c89c7..7363515f0 100644 --- a/src/service/service/service_handlers/ipowdm/__init__.py +++ b/src/service/service/service_handlers/ipowdm/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py index e78379834..d5b4431f9 100644 --- a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py +++ b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py index f2e1b1de1..31a526fb6 100644 --- a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py +++ b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/service/service_handlers/tapi_lsp/__init__.py b/src/service/service/service_handlers/tapi_lsp/__init__.py index 6242c89c7..7363515f0 100644 --- a/src/service/service/service_handlers/tapi_lsp/__init__.py +++ b/src/service/service/service_handlers/tapi_lsp/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/service/tests/qkd/test_functional_bootstrap.py b/src/service/tests/qkd/test_functional_bootstrap.py index daf35f0de..80db786d7 100644 --- a/src/service/tests/qkd/test_functional_bootstrap.py +++ b/src/service/tests/qkd/test_functional_bootstrap.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/Config.py b/src/telemetry/backend/Config.py index 73c37610d..02f864a10 100644 --- a/src/telemetry/backend/Config.py +++ b/src/telemetry/backend/Config.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/Tools.py b/src/telemetry/backend/Tools.py index 1b047834c..b4f8523e6 100644 --- a/src/telemetry/backend/Tools.py +++ b/src/telemetry/backend/Tools.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/ErrorMessages.py b/src/telemetry/backend/service/ErrorMessages.py index 317de8cf6..2a15a75de 100644 --- a/src/telemetry/backend/service/ErrorMessages.py +++ b/src/telemetry/backend/service/ErrorMessages.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/collector_api/DriverFactory.py b/src/telemetry/backend/service/collector_api/DriverFactory.py index fd11ca125..23d4c86bd 100644 --- a/src/telemetry/backend/service/collector_api/DriverFactory.py +++ b/src/telemetry/backend/service/collector_api/DriverFactory.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/collector_api/DriverInstanceCache.py b/src/telemetry/backend/service/collector_api/DriverInstanceCache.py index 13d43db13..7500bc688 100644 --- a/src/telemetry/backend/service/collector_api/DriverInstanceCache.py +++ b/src/telemetry/backend/service/collector_api/DriverInstanceCache.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/collector_api/Exceptions.py b/src/telemetry/backend/service/collector_api/Exceptions.py index 8bc607d95..1871fc2e0 100644 --- a/src/telemetry/backend/service/collector_api/Exceptions.py +++ b/src/telemetry/backend/service/collector_api/Exceptions.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/collector_api/FilterFields.py b/src/telemetry/backend/service/collector_api/FilterFields.py index b1d2cb314..103a77105 100644 --- a/src/telemetry/backend/service/collector_api/FilterFields.py +++ b/src/telemetry/backend/service/collector_api/FilterFields.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/telemetry/backend/service/collectors/__init__.py b/src/telemetry/backend/service/collectors/__init__.py index b2391d623..614870363 100644 --- a/src/telemetry/backend/service/collectors/__init__.py +++ b/src/telemetry/backend/service/collectors/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/tests/ofc24/refresh_op.sh b/src/tests/ofc24/refresh_op.sh index 3a8fca7f9..e3e68fa5e 100644 --- a/src/tests/ofc24/refresh_op.sh +++ b/src/tests/ofc24/refresh_op.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/webui/service/templates/opticalconfig/lightpaths.html b/src/webui/service/templates/opticalconfig/lightpaths.html index dba83ca43..3b9346137 100644 --- a/src/webui/service/templates/opticalconfig/lightpaths.html +++ b/src/webui/service/templates/opticalconfig/lightpaths.html @@ -1,5 +1,5 @@ Input KPIs {self.input_kpis}") + logger.info(f"|--> Output KPIs {self.output_kpis}") + logger.info(f"|--> Thresholds {self.thresholds}") try: - future = self.client.submit(select_handler(self.thresholds["task_type"]), "batch size", - self.key, - self.batch, self.input_kpis, self.output_kpis, self.thresholds) - future.add_done_callback(lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value)) + handler_fn = select_handler(handler_name) + future = self.client.submit( + handler_fn, + self.key, + self.batch, + self.input_kpis, + self.output_kpis, + self.thresholds + ) + logger.info(f"|--> Handler result {future.result()}") + future.add_done_callback( + lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value) + ) + # result = aggregation_handler(self.key, self.batch, self.input_kpis, self.output_kpis, self.thresholds) + # self.produce_result(result, KafkaTopic.ALARMS.value) except Exception as e: logger.error( f"Failed to submit task to Dask client or unable to process future. See error for detail: {e}") @@ -132,6 +159,10 @@ class DaskStreamer(threading.Thread): logger.warning("Nothing to produce. Skipping.") return for record in result: + # Filter out records not related with the output KPI of interest + if record["kpi_id"] not in self.output_kpis: + continue + logger.info(f"Kafka Alarm - Record: {record}") try: self.producer.produce( destination_topic, diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 5de78ef23..5a8e68215 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -18,13 +18,11 @@ from kafka.admin import KafkaAdminClient, NewTopic from kafka.errors import TopicAlreadyExistsError from common.Settings import get_setting - LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-public.{:s}.svc.cluster.local:{:s}' +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' KAFKA_TOPIC_NUM_PARTITIONS = 1 KAFKA_TOPIC_REPLICATION_FACTOR = 1 -#KAFKA_TOPIC_LIST_TIMEOUT = 5 KAFKA_TOPIC_CREATE_REQUEST_TIMEOUT = 60_000 # ms KAFKA_TOPIC_CREATE_WAIT_ITERATIONS = 10 KAFKA_TOPIC_CREATE_WAIT_TIME = 1 @@ -69,8 +67,6 @@ class KafkaTopic(Enum): LOGGER.debug('Kafka server address: {:s}'.format(str(KafkaConfig.get_kafka_address()))) kafka_admin_client = KafkaConfig.get_admin_client() - #topic_metadata = kafka_admin_client.list_topics(timeout=KAFKA_TOPIC_LIST_TIMEOUT) - #existing_topics = set(topic_metadata.topics.keys()) existing_topics = set(kafka_admin_client.list_topics()) LOGGER.debug('Existing Kafka topics: {:s}'.format(str(existing_topics))) @@ -122,8 +118,6 @@ class KafkaTopic(Enum): desired_topics = {topic.value for topic in KafkaTopic} missing_topics = set() for _ in range(KAFKA_TOPIC_CREATE_WAIT_ITERATIONS): - #topic_metadata = kafka_admin_client.list_topics(timeout=KAFKA_TOPIC_LIST_TIMEOUT) - #existing_topics = set(topic_metadata.topics.keys()) existing_topics = set(kafka_admin_client.list_topics()) LOGGER.debug('existing_topics={:s}'.format(str(existing_topics))) missing_topics = desired_topics.difference(existing_topics) diff --git a/src/telemetry/backend/service/collectors/int_collector/INTCollector.py b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py index 7f945efe9..0f35882f0 100644 --- a/src/telemetry/backend/service/collectors/int_collector/INTCollector.py +++ b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py @@ -159,8 +159,8 @@ class INTCollector(_Collector): return False def on_idle_timeout(self): - LOGGER.info(f"=== INT Collector IDLE() - No INT packets arrived during the last {self.max_idle_time}") - LOGGER.debug(f"last_packet_time {self.last_packet_time} seconds.") + LOGGER.info(f"=== INT Collector IDLE() - No INT packets arrived during the last {self.max_idle_time} seconds") + LOGGER.debug(f"last_packet_time {self.last_packet_time} seconds") # Report a zero value for the P4 switch KPIs values = [0] -- GitLab From 36d0ebc8c380c14f2d098ff404c1940116c2605c Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Tue, 24 Feb 2026 13:53:58 +0000 Subject: [PATCH 329/371] fix: analytics test --- src/analytics/backend/tests/test_backend.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index a44351c03..0ce18d8b4 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -22,7 +22,6 @@ from unittest.mock import MagicMock, patch from .messages_analyzer import get_batch, get_input_kpi_list, get_output_kpi_list, get_thresholds, \ get_windows_size, get_batch_size, get_agg_df, get_duration -from common.tools.kafka.Variables import KafkaTopic from analytics.backend.service.Streamer import DaskStreamer from analytics.backend.service.AnalyzerHandlers import aggregation_handler, threshold_handler from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService @@ -261,7 +260,7 @@ def test_aggregation_handler(): # Test aggregation_handler aggregated_df = aggregation_handler( - "test_batch", "test_key", batch, input_kpi_list, output_kpi_list, thresholds + "test_key", batch, input_kpi_list, output_kpi_list, thresholds ) assert isinstance(aggregated_df, list) assert all(isinstance(item, dict) for item in aggregated_df) @@ -276,7 +275,7 @@ def test_threshold_handler(): result = threshold_handler("test_key", agg_df, thresholds["task_parameter"][0]) assert isinstance(result, pd.DataFrame) - assert result.shape == (1, 7) + assert result.shape == (1, 5) ########################### -- GitLab From d7608701d026da7477144246fb85f0d17da2af3e Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Wed, 25 Feb 2026 07:02:19 +0000 Subject: [PATCH 330/371] fix: analytics tests --- src/analytics/backend/service/Streamer.py | 2 -- src/analytics/backend/tests/test_backend.py | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/analytics/backend/service/Streamer.py b/src/analytics/backend/service/Streamer.py index 1eba74976..91d89504f 100644 --- a/src/analytics/backend/service/Streamer.py +++ b/src/analytics/backend/service/Streamer.py @@ -143,8 +143,6 @@ class DaskStreamer(threading.Thread): future.add_done_callback( lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value) ) - # result = aggregation_handler(self.key, self.batch, self.input_kpis, self.output_kpis, self.thresholds) - # self.produce_result(result, KafkaTopic.ALARMS.value) except Exception as e: logger.error( f"Failed to submit task to Dask client or unable to process future. See error for detail: {e}") diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index 0ce18d8b4..9c3fd42cc 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import time import json import pytest import logging @@ -192,7 +191,8 @@ def test_produce_result(dask_streamer): """Test if produce_result sends records to Kafka.""" result = [{"kpi_id": "kpi1", "value": 100}] with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.delivery_report', return_value=None) as mock_delivery_report, \ - patch.object(dask_streamer.producer, 'produce') as mock_produce: + patch.object(dask_streamer.producer, 'produce') as mock_produce: + dask_streamer.output_kpis = ['kpi1'] dask_streamer.produce_result(result, "test_topic") mock_produce.assert_called_once_with( "test_topic", @@ -220,6 +220,8 @@ def test_run_with_valid_consumer(dask_streamer): with patch.object(dask_streamer.consumer, 'poll') as mock_poll, \ patch.object(dask_streamer, 'task_handler_selector') as mock_task_handler_selector: + dask_streamer.input_kpis = ['kpi1', 'kpi2'] + # Simulate valid messages without errors mock_message_1 = MagicMock() mock_message_1.value.return_value = b'{"kpi_id": "kpi1", "value": 100}' -- GitLab From 1d230e865a4692900257a70332d7855ee4f5461e Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Wed, 25 Feb 2026 23:56:59 +0100 Subject: [PATCH 331/371] base for optical automation --- .gitignore | 2 + manifests/telemetryservice.yaml | 2 +- proto/kpi_sample_types.proto | 1 + .../gnmi_oc/GnmiOpenConfigCollector.py | 6 +- .../collectors/gnmi_oc/SubscriptionNew.py | 8 +- .../backend/tests/gnmi_oc/messages.py | 16 +- .../test_unit_GnmiOpenConfigCollector.py | 2 +- .../automation/descriptors/automation.json | 10 +- src/tests/ofc26_flexscale/Fixtures.py | 63 +++++ src/tests/ofc26_flexscale/__init__.py | 14 + .../ofc26_flexscale/mock_tfs_services.py | 74 ++++++ src/tests/ofc26_flexscale/my_deploy_ofc26.sh | 240 ++++++++++++++++++ src/tests/ofc26_flexscale/run_ofc26_test.sh | 25 ++ .../ofc26_flexscale/telemetry_service.py | 0 .../ofc26_flexscale/test_ofc26_messages.py | 66 +++++ .../test_ofc26_mgon_integration.py | 116 +++++++++ 16 files changed, 623 insertions(+), 22 deletions(-) create mode 100644 src/tests/ofc26_flexscale/Fixtures.py create mode 100644 src/tests/ofc26_flexscale/__init__.py create mode 100644 src/tests/ofc26_flexscale/mock_tfs_services.py create mode 100755 src/tests/ofc26_flexscale/my_deploy_ofc26.sh create mode 100755 src/tests/ofc26_flexscale/run_ofc26_test.sh create mode 100644 src/tests/ofc26_flexscale/telemetry_service.py create mode 100644 src/tests/ofc26_flexscale/test_ofc26_messages.py create mode 100644 src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py diff --git a/.gitignore b/.gitignore index d5af4f7f6..1b9e692a3 100644 --- a/.gitignore +++ b/.gitignore @@ -177,6 +177,8 @@ cython_debug/ # Sqlite *.db +#temp files to test telemetry +src/telemetry/backend/tempFiles/ # TeraFlowSDN-generated files tfs_runtime_env_vars.sh tfs_runtime_env_vars*.sh diff --git a/manifests/telemetryservice.yaml b/manifests/telemetryservice.yaml index 2add96516..935267250 100644 --- a/manifests/telemetryservice.yaml +++ b/manifests/telemetryservice.yaml @@ -95,7 +95,7 @@ metadata: app: telemetryservice spec: type: LoadBalancer - loadBalancerIP: 192.168.5.250 + loadBalancerIP: _LOAD_BALANCER_IP_ externalTrafficPolicy: Local selector: app: telemetryservice diff --git a/proto/kpi_sample_types.proto b/proto/kpi_sample_types.proto index 19cd59f15..a8e25e809 100644 --- a/proto/kpi_sample_types.proto +++ b/proto/kpi_sample_types.proto @@ -32,6 +32,7 @@ enum KpiSampleType { KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501; //. can be used by both optical and L3 without any issue KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS = 602; diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py index 60364c4cd..63556d4e9 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py @@ -33,7 +33,7 @@ class GNMIOpenConfigCollector(_Collector): ========================= Lightweight wrapper around *pygnmi* with subscribe / get / unsubscribe helpers. """ - def __init__(self, address: str = '', port: int = -1, **setting) -> None: + def __init__(self, address: str = "", port: int = -1, **setting) -> None: super().__init__('gNMI_openconfig_collector', address, port, **setting) self._subscriptions : Dict[str, Subscription] = {} @@ -51,13 +51,15 @@ class GNMIOpenConfigCollector(_Collector): self._output_queue = queue.Queue() # Queue for telemetry updates self.logger = logging.getLogger(__name__) - self.logger.debug("GNMICollector instantiated.") + self.logger.info("GNMICollector instantiated.") def Connect(self) -> bool: """ Connect to the gNMI target device. """ + self.logger.info("Connecting to gNMI target %s:%s with username '%s'", + self.address, self.port, self.username) if not self.connected: self.client = gNMIclient( target = (self.address, self.port), diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py index bbbc9fdb2..c48ba505c 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py @@ -229,7 +229,7 @@ class Subscription: LOGGER.debug("Sub %s stop requested, breaking stream loop", self.sub_id) break - LOGGER.debug("Sub %s received stream message: %s", self.sub_id, stream) + LOGGER.info("Sub %s received stream message: %s", self.sub_id, stream) # DEBUG: Check if update has actual update messages if stream.HasField("update"): @@ -269,12 +269,10 @@ class Subscription: LOGGER.debug("Sub %s cancelled (channel closed) - graceful shutdown", self.sub_id) break elif err.code() == grpc.StatusCode.INVALID_ARGUMENT: - LOGGER.warning("Path '%s' rejected (%s) -- trying next", - path, err.details()) + LOGGER.warning("Path '%s' rejected (%s) -- trying next", path, err.details()) continue else: - LOGGER.exception("Subscription %s hit gRPC error: %s", # Change with TFS Exception - self.sub_id, err) + LOGGER.exception("Subscription %s hit gRPC error: %s", self.sub_id, err) # Change with TFS Exception break except Exception as exc: # pylint: disable=broad-except diff --git a/src/telemetry/backend/tests/gnmi_oc/messages.py b/src/telemetry/backend/tests/gnmi_oc/messages.py index 7a6a9baf0..9cad7edef 100644 --- a/src/telemetry/backend/tests/gnmi_oc/messages.py +++ b/src/telemetry/backend/tests/gnmi_oc/messages.py @@ -51,14 +51,14 @@ devices = { 'endpoint': 'Management0', }, 'mgon': { - 'host' : 'localhost', - 'port' : '50061', - 'username': 'admin', - 'password': 'admin', - 'insecure': True, - 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, - 'resource': 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint': '1', + 'host' : '172.17.254.24', + 'port' : '50061', + 'username' : 'admin', + 'password' : 'admin', + 'insecure' : True, + 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, + 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model + 'endpoint' : '1', 'skip_verify': True, }, } diff --git a/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py b/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py index 920c88c91..c08f196d1 100644 --- a/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py +++ b/src/telemetry/backend/tests/gnmi_oc/test_unit_GnmiOpenConfigCollector.py @@ -70,7 +70,7 @@ def subscription_data(sub_parameters): "endpoint" : sub_parameters['endpoint'], "resource" : sub_parameters['resource'], }, - float(20.0), + float(60.0), float(5.0), ), ] diff --git a/src/tests/automation/descriptors/automation.json b/src/tests/automation/descriptors/automation.json index 5876de4ae..d8c36cac0 100644 --- a/src/tests/automation/descriptors/automation.json +++ b/src/tests/automation/descriptors/automation.json @@ -1,19 +1,19 @@ { "target_service_id": { - "service_uuid": {"uuid": "66d498ad-5d94-5d90-8cb4-861e30689c64"}, + "service_uuid": {"uuid": "b2a60c5b-8c46-5707-a64a-9c6539d395f2"}, "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}} }, "telemetry_service_id": { - "service_uuid": {"uuid": "db73d789-4abc-5514-88bb-e21f7e31d36a"}, + "service_uuid": {"uuid": "7397bdf2-eec8-57f4-9406-4f9e9f3dc50e"}, "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}} }, "analyzer":{ "operation_mode": "ANALYZEROPERATIONMODE_STREAMING", "parameters": { - "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [0, 2500]}]}" + "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [-5, -15]}]}" }, "input_kpi_ids": [ - {"kpi_id": { "uuid": "b9f915e2-402d-4788-9e7d-6bd1055b5e8b"}} + {"kpi_id": { "uuid": "6e22f180-ba28-4641-b190-2287bf447777"}} ], "output_kpi_ids": [ {"kpi_id": { "uuid": "c45b09d8-c84a-45d8-b4c2-9fa9902d157d"}} @@ -24,7 +24,7 @@ "policy":{ "serviceId": { "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, - "service_uuid": {"uuid": "66d498ad-5d94-5d90-8cb4-861e30689c64"} + "service_uuid": {"uuid": "b2a60c5b-8c46-5707-a64a-9c6539d395f2"} }, "policyRuleBasic": { "actionList": [ diff --git a/src/tests/ofc26_flexscale/Fixtures.py b/src/tests/ofc26_flexscale/Fixtures.py new file mode 100644 index 000000000..c5b66b858 --- /dev/null +++ b/src/tests/ofc26_flexscale/Fixtures.py @@ -0,0 +1,63 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +import logging + +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from kpi_manager.client.KpiManagerClient import KpiManagerClient + + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient(host="10.152.183.180") + _client.connect() + LOGGER.info('Yielding Connected ContextClient...') + yield _client + LOGGER.info('Closing ContextClient...') + _client.close() + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient(host="10.152.183.212") + _client.connect() + LOGGER.info('Yielding Connected DeviceClient...') + yield _client + LOGGER.info('Closing DeviceClient...') + _client.close() + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient(host="10.152.183.98") + _client.connect() + LOGGER.info('Yielding Connected ServiceClient...') + yield _client + LOGGER.info('Closing ServiceClient...') + _client.close() + +@pytest.fixture(scope='session') +def kpi_manager_client(): + _client = KpiManagerClient(host="10.152.183.121") + _client.connect() + LOGGER.info('Yielding Connected KpiManagerClient...') + yield _client + LOGGER.info('Closed KpiManagerClient...') + _client.close() + diff --git a/src/tests/ofc26_flexscale/__init__.py b/src/tests/ofc26_flexscale/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/tests/ofc26_flexscale/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/src/tests/ofc26_flexscale/mock_tfs_services.py b/src/tests/ofc26_flexscale/mock_tfs_services.py new file mode 100644 index 000000000..6cbacd610 --- /dev/null +++ b/src/tests/ofc26_flexscale/mock_tfs_services.py @@ -0,0 +1,74 @@ + + + +import os, pytest +import logging +from typing import Union + +from common.Constants import ServiceNameEnum +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) +from common.tests.MockServicerImpl_Context import MockServicerImpl_Context +from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server + +from common.tools.service.GenericGrpcService import GenericGrpcService + +from kpi_manager.service.KpiManagerService import KpiManagerService +from kpi_manager.client.KpiManagerClient import KpiManagerClient + + + +LOGGER = logging.getLogger(__name__) + +LOCAL_HOST = '127.0.0.1' + +KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) + + +# NOTE: ---> For local testing, without need of running TFS services. + +class MockContextService(GenericGrpcService): + # Mock Service implementing Context to simplify unitary tests of Monitoring + + def __init__(self, bind_port: Union[str, int]) -> None: + super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') + + # pylint: disable=attribute-defined-outside-init + def install_servicers(self): + self.context_servicer = MockServicerImpl_Context() + add_ContextServiceServicer_to_server(self.context_servicer, self.server) + +# This fixture will be requested by test cases and last during testing session +@pytest.fixture(scope='session') +def kpi_manager_service(): + LOGGER.info('Initializing KpiManagerService...') + _service = KpiManagerService() + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerService...') + yield _service + + LOGGER.info('Terminating KpiManagerService...') + _service.stop() + + LOGGER.info('Terminated KpiManagerService...') + +# This fixture will be requested by test cases and last during testing session. +# The client requires the server, so client fixture has the server as dependency. +# def monitoring_client(monitoring_service : MonitoringService): (Add for better understanding) +@pytest.fixture(scope='session') +def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing KpiManagerClient...') + _client = KpiManagerClient() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerClient...') + yield _client + + LOGGER.info('Closing KpiManagerClient...') + _client.close() + + LOGGER.info('Closed KpiManagerClient...') \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/my_deploy_ofc26.sh b/src/tests/ofc26_flexscale/my_deploy_ofc26.sh new file mode 100755 index 000000000..540a57646 --- /dev/null +++ b/src/tests/ofc26_flexscale/my_deploy_ofc26.sh @@ -0,0 +1,240 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# ----- TeraFlowSDN ------------------------------------------------------------ + +# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. +export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" + +# Set the list of components, separated by spaces, you want to build images for, and deploy. +export TFS_COMPONENTS="context device pathcomp opticalcontroller service nbi webui" + +# Uncomment to activate Monitoring (old) +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate Monitoring Framework (new) +export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation" + +# Uncomment to activate QoS Profiles +#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile" + +# Uncomment to activate BGP-LS Speaker +#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" + +# Uncomment to activate Optical Controller +# To manage optical connections, "service" requires "opticalcontroller" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" +#fi + +# Uncomment to activate ZTP +#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" + +# Uncomment to activate Policy Manager +export TFS_COMPONENTS="${TFS_COMPONENTS} policy" + +# Uncomment to activate Optical CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" + +# Uncomment to activate L3 CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector" + +# Uncomment to activate TE +#export TFS_COMPONENTS="${TFS_COMPONENTS} te" + +# Uncomment to activate Forecaster +#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" + +# Uncomment to activate E2E Orchestrator +#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" + +# Uncomment to activate VNT Manager +#export TFS_COMPONENTS="${TFS_COMPONENTS} vnt_manager" + +# Uncomment to activate OSM Client +#export TFS_COMPONENTS="${TFS_COMPONENTS} osm_client" + +# Uncomment to activate DLT and Interdomain +#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" +#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then +# export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" +# export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" +# export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" +#fi + +# Uncomment to activate QKD App +# To manage QKD Apps, "service" requires "qkd_app" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}" +#fi + +# Uncomment to activate SIMAP Connector +#export TFS_COMPONENTS="${TFS_COMPONENTS} simap_connector" + +# Uncomment to activate Load Generator +#export TFS_COMPONENTS="${TFS_COMPONENTS} load_generator" + +# Uncomment to activate Pluggables Component +#export TFS_COMPONENTS="${TFS_COMPONENTS} pluggables" + + +# Set the tag you want to use for your images. +export TFS_IMAGE_TAG="dev" + +# Set the name of the Kubernetes namespace to deploy TFS to. +export TFS_K8S_NAMESPACE="tfs" + +# Set additional manifest files to be applied after the deployment +export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" + +# Uncomment to monitor performance of components +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" + +# Uncomment when deploying Optical CyberSecurity +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" + +# Set the new Grafana admin password +export TFS_GRAFANA_PASSWORD="admin123+" + +# Disable skip-build flag to rebuild the Docker images. +export TFS_SKIP_BUILD="" + + +# ----- CockroachDB ------------------------------------------------------------ + +# Set the namespace where CockroackDB will be deployed. +export CRDB_NAMESPACE="crdb" + +# Set the external port CockroackDB Postgre SQL interface will be exposed to. +export CRDB_EXT_PORT_SQL="26257" + +# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to. +export CRDB_EXT_PORT_HTTP="8081" + +# Set the database username to be used by Context. +export CRDB_USERNAME="tfs" + +# Set the database user's password to be used by Context. +export CRDB_PASSWORD="tfs123" + +# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/crdb.sh for additional details +export CRDB_DEPLOY_MODE="single" + +# Disable flag for dropping database, if it exists. +export CRDB_DROP_DATABASE_IF_EXISTS="YES" + +# Disable flag for re-deploying CockroachDB from scratch. +export CRDB_REDEPLOY="" + + +# ----- NATS ------------------------------------------------------------------- + +# Set the namespace where NATS will be deployed. +export NATS_NAMESPACE="nats" + +# Set the external port NATS Client interface will be exposed to. +export NATS_EXT_PORT_CLIENT="4222" + +# Set the external port NATS HTTP Mgmt GUI interface will be exposed to. +export NATS_EXT_PORT_HTTP="8222" + +# Set NATS installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/nats.sh for additional details +export NATS_DEPLOY_MODE="single" + +# Disable flag for re-deploying NATS from scratch. +export NATS_REDEPLOY="" + + +# ----- Apache Kafka ----------------------------------------------------------- + +# Set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE="kafka" + +# Set the port Apache Kafka server will be exposed to. +export KFK_EXT_PORT_CLIENT="9092" + +# Set Kafka installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/kafka.sh for additional details +export KFK_DEPLOY_MODE="single" + +# Disable flag for re-deploying Kafka from scratch. +export KFK_REDEPLOY="" + + +# ----- QuestDB ---------------------------------------------------------------- + +# Set the namespace where QuestDB will be deployed. +export QDB_NAMESPACE="qdb" + +# Set the external port QuestDB Postgre SQL interface will be exposed to. +export QDB_EXT_PORT_SQL="8812" + +# Set the external port QuestDB Influx Line Protocol interface will be exposed to. +export QDB_EXT_PORT_ILP="9009" + +# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to. +export QDB_EXT_PORT_HTTP="9000" + +# Set the database username to be used for QuestDB. +export QDB_USERNAME="admin" + +# Set the database user's password to be used for QuestDB. +export QDB_PASSWORD="quest" + +# Set the table name to be used by Monitoring for KPIs. +export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" + +# Set the table name to be used by Slice for plotting groups. +export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" + +# Disable flag for dropping tables if they exist. +export QDB_DROP_TABLES_IF_EXIST="" + +# Disable flag for re-deploying QuestDB from scratch. +export QDB_REDEPLOY="" + + +# ----- Time Series Storage - Prometheus / Grafana Mimir ----------------------- + +# Set Time Series Storage installation mode to 'single' (i.e., Prometheus only). +# This option is convenient for development and testing. See ./deploy/all.sh or +# ./deploy/monitoring.sh for additional details. +export TSDB_DEPLOY_MODE="single" + + +# ----- K8s Observability ------------------------------------------------------ + +# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to. +export PROM_EXT_PORT_HTTP="9090" + +# Set the external port Grafana HTTP Dashboards will be exposed to. +export GRAF_EXT_PORT_HTTP="3000" + + +# ----- Telemetry Config ------------------------------------------------------ + +# Define a Load Balancer IP for Telemetry Collector components +export LOAD_BALANCER_IP="192.168.5.250" # <-- Change this to match your network diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh new file mode 100755 index 000000000..026e56876 --- /dev/null +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Make folder containing the script the root folder for its execution +cd $(dirname $0)/../../../ +echo "Running OFC26 test from folder: $(pwd)" +cd src/ +CRDB_SQL_ADDRESS=$(kubectl get service --namespace ${CRDB_NAMESPACE} cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" + + +python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ + tests/ofc26_flexscale/test_ofc26_mgon_integration.py diff --git a/src/tests/ofc26_flexscale/telemetry_service.py b/src/tests/ofc26_flexscale/telemetry_service.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py new file mode 100644 index 000000000..c142c0646 --- /dev/null +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -0,0 +1,66 @@ + + +import uuid +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType +from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI + + +# ---> KPI Manager messages creation for testing + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER + _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS + _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" + # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) + # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' + return _create_kpi_request + + +# ---> Telemetry messages creation for testing + +devices = { + 'mgon': { + 'host' : '172.17.254.24', + 'port' : '50061', + 'username': 'admin', + 'password': 'admin', + 'insecure': True, + 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, + #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', + 'resource': 'wavelength-router', #TODO: verify resource name form mg-on model + 'endpoint': '10', + }, +} + +def create_basic_sub_request_parameters() -> dict: + + device = devices['mgon'] + if device: + kpi = device['kpi'] + resource = device['resource'] + endpoint = device['endpoint'] + return { + 'host' : device['host'], + 'port' : device['port'], + 'username' : device['username'], + 'password' : device['password'], + 'connect_timeout' : 15, + 'insecure' : device['insecure'], + 'mode' : 'sample', # Subscription internal mode posibly: on_change, poll, sample + 'sample_interval' : 10, # This should be in seconds units + 'duration' : 300.0, # Duration in seconds for how long to receive samples + 'kpi' : kpi, + 'resource' : resource, + 'endpoint' : endpoint, + } + return {} + + +# oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=1]/state/optical-power-total-input/instant +# oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=1]/state/optical-power-total-input/instant diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py new file mode 100644 index 000000000..1f9e6a982 --- /dev/null +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py @@ -0,0 +1,116 @@ + + +import logging + +from common.proto.kpi_manager_pb2 import KpiId +import time + +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + +from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request +from telemetry.backend.service.collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector +from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters + +WITH_TFS = True #True/False +if WITH_TFS: + from .Fixtures import kpi_manager_client +else: + from .mock_tfs_services import kpi_manager_client + +LOGGER = logging.getLogger(__name__) + + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER + _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS + _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" + # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) + # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' + return _create_kpi_request + + +def test_Complete_MGON_Integration(kpi_manager_client): + + # 1. KPI Descriptor Creation + LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") + kpi_descriptor_obj = create_kpi_descriptor_request() + _search_kpi_id = kpi_manager_pb2.KpiId() + _search_kpi_id = kpi_descriptor_obj.kpi_id + response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) + if isinstance(response, kpi_manager_pb2.KpiDescriptor): + LOGGER.info("KPI Descriptor already exists with ID: %s. Attempting to delete it.", _search_kpi_id.kpi_id.uuid) + else: + LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) + response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiId) + + + # 2. Telemetry Collector Creation + sub_parameters = create_basic_sub_request_parameters() + LOGGER.info("Subscription parameters: %s", sub_parameters) + + collector = GNMIOpenConfigCollector( + address = sub_parameters.get('host', ''), + port = sub_parameters.get('port', -1), + username = sub_parameters.get('username', None), + password = sub_parameters.get('password', None), + insecure = sub_parameters.get('insecure', None), + skip_verify = sub_parameters.get('skip_verify', True), + ) + if not collector.Connect(): + LOGGER.error("Failed to connect to the collector") + return + + LOGGER.info("----- Testing State Subscription -----") + + sub_data = [( + "x123", + { + "kpi" : sub_parameters['kpi'], + "endpoint" : sub_parameters['endpoint'], + "resource" : sub_parameters['resource'], + }, + sub_parameters['duration'], + sub_parameters['sample_interval'], + ),] + + response = collector.SubscribeState(sub_data) + if response is None: + LOGGER.error("Subscription failed.") + return + + LOGGER.info("Subscription started: Status: %s, Data: %s", response, sub_data) + + test_get_state_updates(collector, sub_data) + + LOGGER.info("Sleeping...") + time.sleep(600) + LOGGER.info("Done sleeping.") + LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") + + +def test_get_state_updates(collector, subscription_data): + """Test getting state updates.""" + LOGGER.info("----- Testing State Updates -----") + collector.SubscribeState(subscription_data) + + LOGGER.info("Requesting state updates for 300 seconds ...") + updates_received = [] + for samples in collector.GetState(duration=300, blocking=True): + LOGGER.info("Received state update: %s", samples) + updates_received.append(samples) + + assert len(updates_received) > 0 + + +if __name__ == "__main__": + test_Complete_MGON_Integration(kpi_manager_client) + + -- GitLab From 6f83eb0a58ae01f8e1c44aeebe77c88c9f246a10 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Thu, 26 Feb 2026 06:53:18 +0000 Subject: [PATCH 332/371] fix: automation details --- src/automation/client/AutomationClient.py | 2 +- src/automation/client/PolicyClient.py | 2 +- .../service/AutomationServiceServicerImpl.py | 27 +++++++++--------- src/automation/service/__main__.py | 3 -- .../service/database/AutomationDB.py | 1 - .../service/database/AutomationModel.py | 7 ++--- .../service/database/models/_Base.py | 4 +-- .../service/zsm_handler_api/_ZSMHandler.py | 13 ++++----- .../service/zsm_handlers/P4INTZSMPlugin.py | 28 ++++++++++++++----- .../service/zsm_handlers/__init__.py | 2 +- .../tests/test_automation_handlers.py | 8 +++--- .../automation/descriptors/automation.json | 4 +-- 12 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/automation/client/AutomationClient.py b/src/automation/client/AutomationClient.py index 09a39f71e..64a8d425e 100644 --- a/src/automation/client/AutomationClient.py +++ b/src/automation/client/AutomationClient.py @@ -16,7 +16,7 @@ import grpc, logging from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc from common.proto.automation_pb2_grpc import AutomationServiceStub -from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService, ZSMServiceID, ZSMServiceState +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string diff --git a/src/automation/client/PolicyClient.py b/src/automation/client/PolicyClient.py index e364bf17b..f2cc50c15 100644 --- a/src/automation/client/PolicyClient.py +++ b/src/automation/client/PolicyClient.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, logging, uuid +import grpc, logging from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc from common.proto.policy_pb2 import PolicyRuleService, PolicyRuleState diff --git a/src/automation/service/AutomationServiceServicerImpl.py b/src/automation/service/AutomationServiceServicerImpl.py index 7113c268b..5c31b11bd 100644 --- a/src/automation/service/AutomationServiceServicerImpl.py +++ b/src/automation/service/AutomationServiceServicerImpl.py @@ -13,7 +13,6 @@ # limitations under the License. import grpc, logging -from uuid import uuid4 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.automation_pb2_grpc import AutomationServiceServicer from common.method_wrappers.ServiceExceptions import NotFoundException @@ -23,7 +22,7 @@ from automation.service.database.AutomationDB import AutomationDB from automation.service.database.AutomationModel import AutomationModel from automation.service.zsm_handlers import ZSM_SERVICE_HANDLERS from automation.service.zsm_handler_api.ZSMFilterFields import ( - ZSMFilterFieldEnum, #TELEMETRY_SERVICE_TYPE_VALUES, TARGET_SERVICE_TYPE_VALUES, + ZSMFilterFieldEnum, ZSM_FILTER_FIELD_ALLOWED_VALUES ) from context.client.ContextClient import ContextClient @@ -48,17 +47,19 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): targetService.service_type, telemetryService.service_type, ZSM_SERVICE_HANDLERS ) + response = None if handler_cls: handler_obj = handler_cls() # instantiate it - handler_obj.zsmCreate(request, context) + response = handler_obj.zsmCreate(request, context) else: - LOGGER.info("No matching handler found.") + LOGGER.info("No matching handler found") - response = ZSMService() - automation_id = str(uuid4()) - zsm_to_insert = AutomationModel.convert_Automation_to_row(automation_id , "Test Description") - if self.automation_db_obj.add_row_to_db(zsm_to_insert): - response.zsmServiceId.uuid.uuid = automation_id + zsm_to_insert = AutomationModel.convert_Automation_to_row( + response.zsmServiceId.uuid.uuid, "ZSM service" + ) + if not self.automation_db_obj.add_row_to_db(zsm_to_insert): + LOGGER.error("Failed to insert new ZSM service") + return response return response @@ -76,7 +77,7 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): zsmServiceState = ZSMServiceState() zsmServiceState.zsmServiceState = 5 - zsmServiceState.zsmServiceStateMessage = "Removed id: {:}".format(request) + zsmServiceState.zsmServiceStateMessage = "Removed ZSM ID: {:}".format(request) return zsmServiceState @@ -86,14 +87,14 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): zsm_id_to_search = request.uuid.uuid row = self.automation_db_obj.search_db_row_by_id(AutomationModel, 'zsm_id', zsm_id_to_search) if row is None: - LOGGER.info('No matching row found zsm id: {:}'.format(zsm_id_to_search)) - raise NotFoundException('ZsmID', zsm_id_to_search) + LOGGER.info('No matching row found for ZSM ID: {:}'.format(zsm_id_to_search)) + raise NotFoundException('ZSM ID', zsm_id_to_search) response = AutomationModel.convert_row_to_Automation(row) return response @safe_and_metered_rpc_method(METRICS_POOL,LOGGER) def ZSMGetByService(self, request : ServiceId, context : grpc.ServicerContext) -> ZSMService: - LOGGER.info('NOT IMPLEMENTED ZSMGetByService') + LOGGER.info('ZSMGetByService is not implemented') return ZSMService() def get_service_handler_based_on_service_types( diff --git a/src/automation/service/__main__.py b/src/automation/service/__main__.py index 9d7a2acee..a43b64d0e 100644 --- a/src/automation/service/__main__.py +++ b/src/automation/service/__main__.py @@ -14,7 +14,6 @@ import logging, signal, sys, threading from prometheus_client import start_http_server -# from automation.service.EventEngine import EventEngine from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, @@ -22,8 +21,6 @@ from common.Settings import ( wait_for_environment_variables ) from .AutomationService import AutomationService -# from common.tools.database.GenericDatabase import Database -# from automation.service.database.AutomationModel import AutomationModel from .database.Engine import Engine from .database.models._Base import rebuild_database diff --git a/src/automation/service/database/AutomationDB.py b/src/automation/service/database/AutomationDB.py index 9b13ebd03..08670989e 100644 --- a/src/automation/service/database/AutomationDB.py +++ b/src/automation/service/database/AutomationDB.py @@ -15,7 +15,6 @@ import logging from common.method_wrappers.Decorator import MetricsPool from common.tools.database.GenericDatabase import Database -from common.method_wrappers.ServiceExceptions import OperationFailedException LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Automation', 'Database') diff --git a/src/automation/service/database/AutomationModel.py b/src/automation/service/database/AutomationModel.py index bbf4d5f1f..89e940673 100644 --- a/src/automation/service/database/AutomationModel.py +++ b/src/automation/service/database/AutomationModel.py @@ -14,8 +14,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy import Column, Integer, String, Text -from sqlalchemy.orm import registry +from sqlalchemy import Column, Text from .models._Base import _Base from common.proto.automation_pb2 import ZSMService @@ -25,14 +24,14 @@ class AutomationModel(_Base): __tablename__ = 'automation' zsm_id = Column(UUID(as_uuid=False), primary_key=True) - zsm_description = Column(Text , nullable=False) + zsm_description = Column(Text, nullable=False) # helps in logging the information def __repr__(self): return (f"") @classmethod - def convert_Automation_to_row(cls, uuid , zsm_description): + def convert_Automation_to_row(cls, uuid, zsm_description): """ Create an instance of Automation from a request object. Args: request: The request object containing the data. diff --git a/src/automation/service/database/models/_Base.py b/src/automation/service/database/models/_Base.py index 06c5f6b02..7c019cdd7 100644 --- a/src/automation/service/database/models/_Base.py +++ b/src/automation/service/database/models/_Base.py @@ -14,9 +14,7 @@ import sqlalchemy from typing import Any, List -from sqlalchemy.orm import Session, sessionmaker, declarative_base -from sqlalchemy.sql import text -from sqlalchemy_cockroachdb import run_transaction +from sqlalchemy.orm import declarative_base _Base = declarative_base() diff --git a/src/automation/service/zsm_handler_api/_ZSMHandler.py b/src/automation/service/zsm_handler_api/_ZSMHandler.py index aaf5f9cc5..7dbcb467b 100644 --- a/src/automation/service/zsm_handler_api/_ZSMHandler.py +++ b/src/automation/service/zsm_handler_api/_ZSMHandler.py @@ -13,10 +13,7 @@ # limitations under the License. import grpc , logging -from common.proto.automation_pb2 import ( - ZSMCreateRequest, #ZSMService, - ZSMServiceID, #ZSMServiceState, -) +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMServiceID from common.proto.context_pb2 import ServiceId LOGGER = logging.getLogger(__name__) @@ -25,14 +22,14 @@ class _ZSMHandler: def __init__(self): LOGGER.info('ZSM init') - def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): + def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmCreate method') - def zsmDelete(self, request : ZSMServiceID, context : grpc.ServicerContext): + def zsmDelete(self, request : ZSMServiceID, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmDelete method') - def zsmGetById(self, request : ZSMServiceID, context : grpc.ServicerContext): + def zsmGetById(self, request : ZSMServiceID, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmGetById method') - def zsmGetByService(self, request : ServiceId, context : grpc.ServicerContext): + def zsmGetByService(self, request : ServiceId, context : grpc.ServicerContext): # type: ignore LOGGER.info('zsmGetByService method') diff --git a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py index 05d866ce8..74694a376 100644 --- a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py +++ b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc , logging +import grpc, logging +from uuid import uuid4 from common.proto.analytics_frontend_pb2 import AnalyzerId from common.proto.policy_pb2 import PolicyRuleState from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService @@ -22,6 +23,7 @@ from automation.client.PolicyClient import PolicyClient from context.client.ContextClient import ContextClient from automation.service.zsm_handler_api._ZSMHandler import _ZSMHandler + LOGGER = logging.getLogger(__name__) class P4INTZSMPlugin(_ZSMHandler): @@ -40,7 +42,7 @@ class P4INTZSMPlugin(_ZSMHandler): LOGGER.exception(f'Unable to get target service:\n{str(target_service_id)}') if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member context_client.close() - return None + return self._zsm_create_response_empty() # Verify the input telemetry service ID try: @@ -49,7 +51,7 @@ class P4INTZSMPlugin(_ZSMHandler): LOGGER.exception(f'Unable to get telemetry service:\n{str(telemetry_service_id)}') if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member context_client.close() - return None + return self._zsm_create_response_empty() # Start an analyzer try: @@ -60,7 +62,7 @@ class P4INTZSMPlugin(_ZSMHandler): if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member context_client.close() analytics_frontend_client.close() - return None + return self._zsm_create_response_empty() # Create a policy try: @@ -69,15 +71,17 @@ class P4INTZSMPlugin(_ZSMHandler): LOGGER.info(f'Policy rule state:\n{policy_rule_state}') except Exception as ex: LOGGER.exception(f'Unable to create policy:\n{str(request.policy)}') - if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + LOGGER.exception(ex.code()) + # ToDo: Investigate why PolicyAddService throws exception + # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member context_client.close() policy_client.close() - return None + return self._zsm_create_response_empty() context_client.close() analytics_frontend_client.close() policy_client.close() - return ZSMService() + return self._zsm_create_response(request) def zsmDelete(self): LOGGER.info('zsmDelete method') @@ -87,3 +91,13 @@ class P4INTZSMPlugin(_ZSMHandler): def zsmGetByService(self): LOGGER.info('zsmGetByService method') + + def _zsm_create_response(self, request): + response = ZSMService() + automation_id = str(uuid4()) + response.zsmServiceId.uuid.uuid = automation_id + response.serviceId.service_uuid.uuid = request.target_service_id.service_uuid.uuid + return response + + def _zsm_create_response_empty(self): + return ZSMService() \ No newline at end of file diff --git a/src/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py index 6a371461b..dcb533e61 100644 --- a/src/automation/service/zsm_handlers/__init__.py +++ b/src/automation/service/zsm_handlers/__init__.py @@ -19,7 +19,7 @@ from automation.service.zsm_handlers.P4INTZSMPlugin import P4INTZSMPlugin ZSM_SERVICE_HANDLERS = [ (P4INTZSMPlugin, [ { - ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_INT, } ]) diff --git a/src/automation/tests/test_automation_handlers.py b/src/automation/tests/test_automation_handlers.py index 0530e7614..516a6b5e0 100644 --- a/src/automation/tests/test_automation_handlers.py +++ b/src/automation/tests/test_automation_handlers.py @@ -38,7 +38,7 @@ ZSM_SERVICE_HANDLERS = [ def test_get_service_handler_based_on_service_types(): automation = AutomationServiceServicerImpl() - handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM , ZSM_SERVICE_HANDLERS) + handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM, ZSM_SERVICE_HANDLERS) if handler_cls: assert True else: @@ -48,7 +48,7 @@ def test_get_service_handler_based_on_service_types(): def test_get_service_handler_based_on_service_types_error(): automation = AutomationServiceServicerImpl() - handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT , ServiceTypeEnum.SERVICETYPE_L2NM , ZSM_SERVICE_HANDLERS) + handler_cls = automation.get_service_handler_based_on_service_types(ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM, ZSM_SERVICE_HANDLERS) if handler_cls: assert True else: @@ -61,7 +61,7 @@ def test_check_if_requested_services_pass_filter_criteria(): } automation = AutomationServiceServicerImpl() - flag = automation.check_if_requested_services_pass_filter_criteria(filter , ServiceTypeEnum.SERVICETYPE_L2NM , ServiceTypeEnum.SERVICETYPE_INT) + flag = automation.check_if_requested_services_pass_filter_criteria(filter, ServiceTypeEnum.SERVICETYPE_L2NM, ServiceTypeEnum.SERVICETYPE_INT) if flag: assert True @@ -75,7 +75,7 @@ def test_check_if_requested_services_pass_filter_criteria_error(): } automation = AutomationServiceServicerImpl() - flag = automation.check_if_requested_services_pass_filter_criteria(filter , ServiceTypeEnum.SERVICETYPE_INT , ServiceTypeEnum.SERVICETYPE_L2NM) + flag = automation.check_if_requested_services_pass_filter_criteria(filter, ServiceTypeEnum.SERVICETYPE_INT, ServiceTypeEnum.SERVICETYPE_L2NM) if flag: assert False diff --git a/src/tests/automation/descriptors/automation.json b/src/tests/automation/descriptors/automation.json index 5876de4ae..711dad5c7 100644 --- a/src/tests/automation/descriptors/automation.json +++ b/src/tests/automation/descriptors/automation.json @@ -13,7 +13,7 @@ "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [0, 2500]}]}" }, "input_kpi_ids": [ - {"kpi_id": { "uuid": "b9f915e2-402d-4788-9e7d-6bd1055b5e8b"}} + {"kpi_id": { "uuid": "58ed7d00-eca9-4d02-95d1-52ca9ad2532a"}} ], "output_kpi_ids": [ {"kpi_id": { "uuid": "c45b09d8-c84a-45d8-b4c2-9fa9902d157d"}} @@ -21,7 +21,7 @@ "batch_min_duration_s": 10, "batch_min_size": 5 }, - "policy":{ + "policy": { "serviceId": { "context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, "service_uuid": {"uuid": "66d498ad-5d94-5d90-8cb4-861e30689c64"} -- GitLab From 5a393a5a82d1cd3038c87b59763bfbc426ae0ab6 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Tue, 20 Jan 2026 00:53:47 +0200 Subject: [PATCH 333/371] feat: P4 UPF service handler based on SD-Fabric --- proto/context.proto | 1 + src/common/DeviceTypes.py | 3 + .../database/models/enums/ServiceType.py | 1 + .../service_handler_api/FilterFields.py | 46 +- .../service/service_handlers/__init__.py | 7 + .../p4_fabric_tna_commons.py | 218 ++-- .../p4_fabric_tna_l2_simple_config.py | 4 - .../p4_fabric_tna_upf/__init__.py | 13 + .../p4_fabric_tna_upf_config.py | 476 +++++++++ .../p4_fabric_tna_upf_service_handler.py | 928 ++++++++++++++++++ .../service/static/topology_icons/oran-cn.png | Bin 0 -> 23796 bytes .../service/static/topology_icons/oran-cu.png | Bin 0 -> 26326 bytes .../service/static/topology_icons/oran-du.png | Bin 0 -> 26185 bytes 13 files changed, 1593 insertions(+), 104 deletions(-) create mode 100644 src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py create mode 100644 src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py create mode 100644 src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py create mode 100644 src/webui/service/static/topology_icons/oran-cn.png create mode 100644 src/webui/service/static/topology_icons/oran-cu.png create mode 100644 src/webui/service/static/topology_icons/oran-du.png diff --git a/proto/context.proto b/proto/context.proto index 62b21b449..3eebb54d4 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -359,6 +359,7 @@ enum ServiceTypeEnum { SERVICETYPE_IP_LINK = 11; SERVICETYPE_TAPI_LSP = 12; SERVICETYPE_IPOWDM = 13; + SERVICETYPE_UPF = 14; } enum ServiceStatusEnum { diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index 948de0e98..8e1cf6758 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -38,6 +38,9 @@ class DeviceTypeEnum(Enum): EMULATED_PACKET_ROUTER = 'emu-packet-router' EMULATED_PACKET_SWITCH = 'emu-packet-switch' EMULATED_XR_CONSTELLATION = 'emu-xr-constellation' + EMULATED_ORAN_DU = 'oran-du' + EMULATED_ORAN_CU = 'oran-cu' + EMULATED_ORAN_CN = 'oran-cn' # Real device types CLIENT = 'client' diff --git a/src/context/service/database/models/enums/ServiceType.py b/src/context/service/database/models/enums/ServiceType.py index c672d160f..cf24a000f 100644 --- a/src/context/service/database/models/enums/ServiceType.py +++ b/src/context/service/database/models/enums/ServiceType.py @@ -36,6 +36,7 @@ class ORM_ServiceTypeEnum(enum.Enum): IP_LINK = ServiceTypeEnum.SERVICETYPE_IP_LINK IPOWDM = ServiceTypeEnum.SERVICETYPE_IPOWDM TAPI_LSP = ServiceTypeEnum.SERVICETYPE_TAPI_LSP + UPF = ServiceTypeEnum.SERVICETYPE_UPF grpc_to_enum__service_type = functools.partial( grpc_to_enum, ServiceTypeEnum, ORM_ServiceTypeEnum) diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index b0a5666a6..2ce77608a 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -20,8 +20,50 @@ class FilterFieldEnum(Enum): SERVICE_TYPE = 'service_type' DEVICE_DRIVER = 'device_driver' -# Map allowed filter fields to allowed values per Filter field. -# If no restriction (free text) None is specified +SERVICE_TYPE_VALUES = { + ServiceTypeEnum.SERVICETYPE_UNKNOWN, + ServiceTypeEnum.SERVICETYPE_L3NM, + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_L1NM, + ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE, + ServiceTypeEnum.SERVICETYPE_TE, + ServiceTypeEnum.SERVICETYPE_E2E, + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, + ServiceTypeEnum.SERVICETYPE_QKD, + ServiceTypeEnum.SERVICETYPE_INT, + ServiceTypeEnum.SERVICETYPE_ACL, + ServiceTypeEnum.SERVICETYPE_IP_LINK, + ServiceTypeEnum.SERVICETYPE_IPOWDM, + ServiceTypeEnum.SERVICETYPE_TAPI_LSP, + ServiceTypeEnum.SERVICETYPE_UPF, +} + +DEVICE_DRIVER_VALUES = { + DeviceDriverEnum.DEVICEDRIVER_UNDEFINED, + DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG, + DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API, + DeviceDriverEnum.DEVICEDRIVER_P4, + DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY, + DeviceDriverEnum.DEVICEDRIVER_ONF_TR_532, + DeviceDriverEnum.DEVICEDRIVER_XR, + DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN, + DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG, + DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS, + DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN, + DeviceDriverEnum.DEVICEDRIVER_OC, + DeviceDriverEnum.DEVICEDRIVER_QKD, + DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN, + DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE, + DeviceDriverEnum.DEVICEDRIVER_NCE, + DeviceDriverEnum.DEVICEDRIVER_SMARTNIC, + DeviceDriverEnum.DEVICEDRIVER_MORPHEUS, + DeviceDriverEnum.DEVICEDRIVER_RYU, + DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX, + DeviceDriverEnum.DEVICEDRIVER_OPENROADM, + DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG, +} + +# Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified FILTER_FIELD_ALLOWED_VALUES = { FilterFieldEnum.SERVICE_TYPE.value : set(ServiceTypeEnum.values()), FilterFieldEnum.DEVICE_DRIVER.value : set(DeviceDriverEnum.values()), diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index c30d5c308..7a607acdd 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -32,6 +32,7 @@ from .p4_fabric_tna_int.p4_fabric_tna_int_service_handler import P4FabricINTServ from .p4_fabric_tna_l2_simple.p4_fabric_tna_l2_simple_service_handler import P4FabricL2SimpleServiceHandler from .p4_fabric_tna_l3.p4_fabric_tna_l3_service_handler import P4FabricL3ServiceHandler from .p4_fabric_tna_acl.p4_fabric_tna_acl_service_handler import P4FabricACLServiceHandler +from .p4_fabric_tna_upf.p4_fabric_tna_upf_service_handler import P4FabricUPFServiceHandler from .tapi_lsp.Tapi_LSPServiceHandler import Tapi_LSPServiceHandler from .tapi_tapi.TapiServiceHandler import TapiServiceHandler from .tapi_xr.TapiXrServiceHandler import TapiXrServiceHandler @@ -153,6 +154,12 @@ SERVICE_HANDLERS = [ FilterFieldEnum.DEVICE_DRIVER: DeviceDriverEnum.DEVICEDRIVER_P4, } ]), + (P4FabricUPFServiceHandler, [ + { + FilterFieldEnum.SERVICE_TYPE: ServiceTypeEnum.SERVICETYPE_UPF, + FilterFieldEnum.DEVICE_DRIVER: DeviceDriverEnum.DEVICEDRIVER_P4, + } + ]), (L2NM_IETFL2VPN_ServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, diff --git a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py index b003ceef8..08f0536c2 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py +++ b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py @@ -48,7 +48,11 @@ VLAN_ID = "vlan_id" RECIRCULATION_PORT_LIST = "recirculation_port_list" PORT_LIST = "port_list" PORT_PREFIX = "port-" +FORWARDING_LIST = "fwd_list" ROUTING_LIST = "routing_list" +HOST_LIST = "host_list" +HOST_MAC = "host_mac" +HOST_LABEL = "host_label" MAC_SRC = "mac_src" MAC_DST = "mac_dst" IPV4_SRC = "ipv4_src" @@ -72,6 +76,7 @@ TABLE_EGRESS_VLAN = "FabricEgress.egress_next.egress_vlan" TABLE_FWD_CLASSIFIER = "FabricIngress.filtering.fwd_classifier" TABLE_BRIDGING = "FabricIngress.forwarding.bridging" TABLE_ROUTING_V4 = "FabricIngress.forwarding.routing_v4" +TABLE_PRE_NEXT_VLAN = "FabricIngress.pre_next.next_vlan" TABLE_NEXT_SIMPLE = "FabricIngress.next.simple" TABLE_NEXT_HASHED = "FabricIngress.next.hashed" TABLE_ACL = "FabricIngress.acl.acl" @@ -136,9 +141,6 @@ DEF_VLAN = 4094 ETHER_TYPE_IPV4 = "0x0800" ETHER_TYPE_IPV6 = "0x86DD" -# Member ID -NEXT_MEMBER_ID = 1 - # Time interval in seconds for consecutive rule management (insert/delete) operations RULE_CONF_INTERVAL_SEC = 0.1 @@ -421,60 +423,59 @@ def rules_set_up_fwd_bridging( return rules_fwd_bridging -def rules_set_up_next_output_simple( - egress_port : int, - action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next output simple" +def rules_set_up_pre_next_vlan( + next_id : int, + vlan_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert next_id >= 0, "Invalid next ID to configure pre-next VLAN" + assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure pre-next VLAN" - rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) + rule_no = cache_rule(TABLE_PRE_NEXT_VLAN, action) - rules_next_output_simple = [] - rules_next_output_simple.append( + rules_pre_next_vlan = [] + rules_pre_next_vlan.append( json_config_rule( action, - '/tables/table/'+TABLE_NEXT_SIMPLE+'['+str(rule_no)+']', + '/tables/table/'+TABLE_PRE_NEXT_VLAN+'['+str(rule_no)+']', { - 'table-name': TABLE_NEXT_SIMPLE, + 'table-name': TABLE_PRE_NEXT_VLAN, 'match-fields': [ { 'match-field': 'next_id', - 'match-value': str(egress_port) + 'match-value': str(next_id) } ], - 'action-name': 'FabricIngress.next.output_simple', + 'action-name': 'FabricIngress.pre_next.set_vlan', 'action-params': [ { - 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-param': 'vlan_id', + 'action-value': str(vlan_id) } - ] + ], + 'priority': 0 } ) ) - return rules_next_output_simple + return rules_pre_next_vlan -def rules_set_up_next_output_hashed( +def rules_set_up_next_profile_hashed_output( egress_port : int, - action : ConfigActionEnum, # type: ignore - next_id = None) -> List [Tuple]: - assert egress_port >= 0, "Invalid outport to configure next output hashed" - - if next_id is None: - next_id = egress_port - - global NEXT_MEMBER_ID + next_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert egress_port >= 0, "Invalid outport to configure next profile for hashed output" + assert next_id >=0, "Invalid next ID to configure next profile for hashed output" rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) - rules_next_output_hashed = [] - rules_next_output_hashed.append( + rules_next_profile_hashed_out = [] + rules_next_profile_hashed_out.append( json_config_rule( action, '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', { 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, + 'member-id': next_id, 'action-name': 'FabricIngress.next.output_hashed', 'action-params': [ { @@ -486,15 +487,58 @@ def rules_set_up_next_output_hashed( ) ) + return rules_next_profile_hashed_out + +def rules_set_up_next_output_simple( + egress_port : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert egress_port >= 0, "Invalid outport to configure next output simple" + + rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) + + rules_next_output_simple = [] + rules_next_output_simple.append( + json_config_rule( + action, + '/tables/table/'+TABLE_NEXT_SIMPLE+'['+str(rule_no)+']', + { + 'table-name': TABLE_NEXT_SIMPLE, + 'match-fields': [ + { + 'match-field': 'next_id', + 'match-value': str(egress_port) + } + ], + 'action-name': 'FabricIngress.next.output_simple', + 'action-params': [ + { + 'action-param': 'port_num', + 'action-value': str(egress_port) + } + ] + } + ) + ) + + return rules_next_output_simple + +def rules_set_up_next_hashed( + egress_port : int, + next_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert egress_port >= 0, "Invalid outport to configure next routing hashed" + assert next_id >=0, "Invalid next ID to configure next routing hashed" + rule_no = cache_rule(TABLE_NEXT_HASHED, action) - rules_next_output_hashed.append( + rules_next_hashed = [] + rules_next_hashed.append( json_config_rule( action, '/tables/table/'+TABLE_NEXT_HASHED+'['+str(rule_no)+']', { 'table-name': TABLE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, + 'member-id': next_id, 'match-fields': [ { 'match-field': 'next_id', @@ -505,9 +549,7 @@ def rules_set_up_next_output_hashed( ) ) - NEXT_MEMBER_ID += 1 - - return rules_next_output_hashed + return rules_next_hashed ################################### ### B. End of L2 setup @@ -518,13 +560,55 @@ def rules_set_up_next_output_hashed( ### C. L3 setup ################################### +def rules_set_up_next_profile_hashed_routing( + egress_port : int, + next_id : int, + eth_src : str, + eth_dst : str, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert egress_port >= 0, "Invalid outport to configure next profile for hashed routing" + assert next_id >=0, "Invalid next ID to configure next profile for hashed routing" + assert chk_address_mac(eth_src), "Invalid source Ethernet address to configure next profile for hashed routing" + assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure next profile for hashed routing" + + rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) + + rules_next_profile_hashed_rt = [] + rules_next_profile_hashed_rt.append( + json_config_rule( + action, + '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', + { + 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, + 'member-id': next_id, + 'action-name': 'FabricIngress.next.routing_hashed', + 'action-params': [ + { + 'action-param': 'port_num', + 'action-value': str(egress_port) + }, + { + 'action-param': 'smac', + 'action-value': eth_src + }, + { + 'action-param': 'dmac', + 'action-value': eth_dst + } + ] + } + ) + ) + + return rules_next_profile_hashed_rt + def rules_set_up_routing( ipv4_dst : str, ipv4_prefix_len : int, egress_port : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure routing" - assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 prefix length" + assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 prefix length to configure routing" assert egress_port >= 0, "Invalid outport to configure routing" rule_no = cache_rule(TABLE_ROUTING_V4, action) @@ -600,68 +684,6 @@ def rules_set_up_next_routing_simple( return rules_next_routing_simple -def rules_set_up_next_routing_hashed( - egress_port : int, - action : ConfigActionEnum, # type: ignore - next_id = None) -> List [Tuple]: - assert egress_port >= 0, "Invalid outport to configure next routing hashed" - random_mac_src = generate_random_mac() - random_mac_dst = generate_random_mac() - if next_id is None: - next_id = egress_port - - global NEXT_MEMBER_ID - - rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) - - rules_next_routing_hashed = [] - rules_next_routing_hashed.append( - json_config_rule( - action, - '/action_profiles/action_profile/'+ACTION_PROFILE_NEXT_HASHED+'['+str(rule_no)+']', - { - 'action-profile-name': ACTION_PROFILE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, - 'action-name': 'FabricIngress.next.routing_hashed', - 'action-params': [ - { - 'action-param': 'port_num', - 'action-value': str(egress_port) - }, - { - 'action-param': 'smac', - 'action-value': random_mac_src - }, - { - 'action-param': 'dmac', - 'action-value': random_mac_dst - } - ] - } - ) - ) - - rule_no = cache_rule(TABLE_NEXT_HASHED, action) - - rules_next_routing_hashed.append( - json_config_rule( - action, - '/tables/table/'+TABLE_NEXT_HASHED+'['+str(rule_no)+']', - { - 'table-name': TABLE_NEXT_HASHED, - 'member-id': NEXT_MEMBER_ID, - 'match-fields': [ - { - 'match-field': 'next_id', - 'match-value': str(next_id) - } - ] - } - ) - ) - - return rules_next_routing_hashed - ################################### ### C. End of L3 setup ################################### diff --git a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py index 0fd1b7101..d2a13ef03 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py +++ b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py @@ -25,10 +25,6 @@ from common.proto.context_pb2 import ConfigActionEnum from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * -# L2 simple service handler settings -FORWARDING_LIST = "fwd_list" -HOST_MAC = "host_mac" - def rules_set_up_port_host( port : int, vlan_id : int, diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py b/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py new file mode 100644 index 000000000..023830645 --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py new file mode 100644 index 000000000..feda2e79c --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py @@ -0,0 +1,476 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Common objects and methods for 5G User Plane Function (UPF) offloading in P4 +based on the SD-Fabric dataplane model. +This dataplane covers both software based and hardware-based Stratum-enabled P4 switches, +such as the BMv2 software switch and Intel's Tofino/Tofino-2 switches. + +SD-Fabric repo: https://github.com/stratum/fabric-tna +SD-Fabric docs: https://docs.sd-fabric.org/master/index.html +""" + +from typing import List, Tuple +from common.proto.context_pb2 import ConfigActionEnum +from common.tools.object_factory.ConfigRule import json_config_rule +from common.type_checkers.Checkers import chk_address_ipv4, chk_prefix_len_ipv4, chk_transport_port + +from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * + +# UPF service handler settings +UPF = "upf" +UPLINK_PORT = "uplink_port" +DOWNLINK_PORT = "downlink_port" +UPLINK_IP = "uplink_ip" +DOWNLINK_IP = "downlink_ip" +UPLINK_MAC = "uplink_mac" +DOWNLINK_MAC = "downlink_mac" +TEID = "teid" +SLICE_ID = "slice_id" +APP_ID = "app_id" +APP_METER_ID = "app_meter_id" +CTR_ID = "ctr_id" +TC_ID = "tc_id" +TUNNEL_PEER_ID = "tunnel_peer_id" +GNB = "gnb" +DATA_NETWORK = "data_network" +UE_LIST = "ue_list" +UE_ID = "ue_id" +UE_IP = "ue_ip" +PDU_LIST = "pdu_sessions" +QOS_FLOWS = "qos_flows" +PDU_SESSION_ID = "pdu_session_id" +DNN = "dnn" +PDU_SESSION_TYPE = "pdu_session_type" +GTPU_TUNNEL = "gtpu_tunnel" +UPLINK = "uplink" +DOWNLINK = "downlink" +SRC = "src" +DST = "dst" +QFI = "qfi" +FIVEQI = "5qi" +QOS_TYPE = "qos_type" +QOS_DESC = "qos_desc" + +# Tables +TABLE_UPF_INTERFACES = "FabricIngress.upf.interfaces" +TABLE_UPF_UL_SESSIONS = "FabricIngress.upf.uplink_sessions" +TABLE_UPF_UL_TERM = "FabricIngress.upf.uplink_terminations" +TABLE_UPF_UL_RECIRC_RULES = "FabricIngress.upf.uplink_recirc_rules" # No need for recirculation +TABLE_UPF_DL_SESSIONS = "FabricIngress.upf.downlink_sessions" +TABLE_UPF_DL_TERM = "FabricIngress.upf.downlink_terminations" +TABLE_UPF_DL_IG_TUN_PEERS = "FabricIngress.upf.ig_tunnel_peers" +TABLE_UPF_DL_EG_TUN_PEERS = "FabricEgress.upf.eg_tunnel_peers" +TABLE_UPF_DL_GTPU_ENCAP = "FabricEgress.upf.gtpu_encap" # This table has no key, thus auto-applies actions + +TABLE_QOS_SLICE_TC = "FabricIngress.qos.set_slice_tc" # This table is accessed automatically (no rule applied) +TABLE_QOS_DEF_TC = "FabricIngress.qos.default_tc" # Miss. No QoS applied so far +TABLE_QOS_QUEUES = "FabricIngress.qos.queues" # Miss. No QoS applied so far + +# UPF settings +GTP_PORT = 2152 + +GTPU_VALID = 1 +GTPU_INVALID = 0 + +## Default values +DEF_APP_ID = 0 +DEF_APP_METER_ID = 0 +DEF_CTR_ID = 401 +DEF_SLICE_ID = 0 +DEF_TC_ID = 3 +DEF_TEID = 1 +DEF_TUN_PEER_ID = 1 +DEF_SESSION_METER_ID = 0 +DEF_QFI = 0 + +# 5QI +FIVEQI_NON_GBR = 9 +FIVEQI_GBR = 1 +FIVEQI_DELAY_CRITICAL_GBR = 82 + +# QoS +QOS_TYPE_NON_GBR = "Non-GBR" +QOS_TYPE_GBR = "GBR" +QOS_TYPE_DELAY_CRITICAL_GBR = "Delay-Critical GBR" +QOS_TYPES_STR_VALID = [QOS_TYPE_NON_GBR, QOS_TYPE_GBR, QOS_TYPE_DELAY_CRITICAL_GBR] + +QOS_TYPE_TO_5QI_MAP = { + QOS_TYPE_NON_GBR: FIVEQI_NON_GBR, + QOS_TYPE_GBR: FIVEQI_GBR, + QOS_TYPE_DELAY_CRITICAL_GBR: FIVEQI_DELAY_CRITICAL_GBR +} + +QOS_TYPE_TO_DESC_MAP = { + QOS_TYPE_NON_GBR: "Best effort", + QOS_TYPE_GBR: "Low latency", + QOS_TYPE_DELAY_CRITICAL_GBR: "Ultra-low latency" +} + + +def rules_set_up_upf_interfaces( + ipv4_dst : str, + ipv4_prefix_len : int, + gtpu_value : int, + slice_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure UPF interface" + assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid destination IPv4 address prefix length to configure UPF interface" + assert gtpu_value >= 0, "Invalid slice identifier to configure UPF interface" + assert slice_id >= 0, "Invalid slice identifier to configure UPF interface" + + action_name = None + + if gtpu_value == GTPU_VALID: # Packet carries a GTP header (UL packet) + action_name = "FabricIngress.upf.iface_access" + else: # Packet does not carry a GTP header (DL packet) + action_name = "FabricIngress.upf.iface_core" + + rule_no = cache_rule(TABLE_UPF_INTERFACES, action) + + rules_upf_interfaces = [] + rules_upf_interfaces.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_INTERFACES+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_INTERFACES, + 'match-fields': [ + { + 'match-field': 'ipv4_dst_addr', + 'match-value': ipv4_dst + "/" + str(ipv4_prefix_len) + }, + { + 'match-field': 'gtpu_is_valid', + 'match-value': str(gtpu_value) + } + ], + 'action-name': action_name, + 'action-params': [ + { + 'action-param': 'slice_id', + 'action-value': str(slice_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_interfaces + +################################### +### A. Uplink (UL) setup +################################### + +def rules_set_up_upf_uplink_sessions( + tun_ip_address : str, + teid : int, + session_meter_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(tun_ip_address), "Invalid tunnel IPv4 address to configure UPF uplink session" + assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF uplink session" + assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF uplink session" + + rule_no = cache_rule(TABLE_UPF_UL_SESSIONS, action) + + rules_upf_ul_session = [] + rules_upf_ul_session.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_UL_SESSIONS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_UL_SESSIONS, + 'match-fields': [ + { + 'match-field': 'tunnel_ipv4_dst', + 'match-value': tun_ip_address + }, + { + 'match-field': 'teid', + 'match-value': str(teid) + } + ], + 'action-name': "FabricIngress.upf.set_uplink_session", + 'action-params': [ + { + 'action-param': 'session_meter_idx', + 'action-value': str(session_meter_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_ul_session + +def rules_set_up_upf_uplink_terminations( + ue_session_id : str, + app_id : int, + ctr_id : int, + app_meter_id : int, + tc_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ue_session_id), "Invalid UE IPv4 address (UE session ID) to configure UPF uplink termination" + assert app_id >= 0, "Invalid application identifier to configure UPF uplink termination" + assert ctr_id >= 0, "Invalid ctr identifier to configure UPF uplink termination" + assert app_meter_id >= 0, "Invalid app meter identifier to configure UPF uplink termination" + assert tc_id >= 0, "Invalid tc identifier to configure UPF uplink termination" + + rule_no = cache_rule(TABLE_UPF_UL_TERM, action) + + rules_upf_ul_termination = [] + rules_upf_ul_termination.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_UL_TERM+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_UL_TERM, + 'match-fields': [ + { + 'match-field': 'ue_session_id', + 'match-value': ue_session_id + }, + { + 'match-field': 'app_id', + 'match-value': str(app_id) + } + ], + 'action-name': "FabricIngress.upf.app_fwd", + 'action-params': [ + { + 'action-param': 'ctr_id', + 'action-value': str(ctr_id) + }, + { + 'action-param': 'app_meter_idx', + 'action-value': str(app_meter_id) + }, + { + 'action-param': 'tc', + 'action-value': str(tc_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_ul_termination + +################################### +### A. End of Uplink (UL) setup +################################### + +################################### +### B. Downlink (DL) setup +################################### + +def rules_set_up_upf_downlink_sessions( + ipv4_dst : str, + session_meter_id : int, + tun_peer_id : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure UPF downlink session" + assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF downlink session" + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink session" + + rule_no = cache_rule(TABLE_UPF_DL_SESSIONS, action) + + rules_upf_dl_session = [] + rules_upf_dl_session.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_SESSIONS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_SESSIONS, + 'match-fields': [ + { + 'match-field': 'ue_addr', + 'match-value': ipv4_dst + } + ], + 'action-name': "FabricIngress.upf.set_downlink_session", + 'action-params': [ + { + 'action-param': 'session_meter_idx', + 'action-value': str(session_meter_id) + }, + { + 'action-param': 'tun_peer_id', + 'action-value': str(tun_peer_id) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_session + +def rules_set_up_upf_downlink_terminations( + ue_session_id : str, + app_id : int, + ctr_id : int, + app_meter_id : int, + tc_id : int, + teid : int, + qfi : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert chk_address_ipv4(ue_session_id), "Invalid UE IPv4 address (UE session ID) to configure UPF downlink termination" + assert app_id >= 0, "Invalid application identifier to configure downlink termination" + assert ctr_id >= 0, "Invalid ctr identifier to configure UPF downlink termination" + assert app_meter_id >= 0, "Invalid app meter identifier to configure UPF downlink termination" + assert tc_id >= 0, "Invalid tc identifier to configure UPF downlink termination" + assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF downlink termination" + assert qfi >= 0, "Invalid QoS flow identifier (QFI) to configure UPF downlink termination" + + rule_no = cache_rule(TABLE_UPF_DL_TERM, action) + + rules_upf_dl_termination = [] + rules_upf_dl_termination.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_TERM+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_TERM, + 'match-fields': [ + { + 'match-field': 'ue_session_id', + 'match-value': ue_session_id + }, + { + 'match-field': 'app_id', + 'match-value': str(app_id) + } + ], + 'action-name': "FabricIngress.upf.downlink_fwd_encap", + 'action-params': [ + { + 'action-param': 'ctr_id', + 'action-value': str(ctr_id) + }, + { + 'action-param': 'app_meter_idx', + 'action-value': str(app_meter_id) + }, + { + 'action-param': 'tc', + 'action-value': str(tc_id) + }, + { + 'action-param': 'teid', + 'action-value': str(teid) + }, + { + 'action-param': 'qfi', + 'action-value': str(qfi) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_termination + +def rules_set_up_upf_downlink_ig_tunnel_peers( + tun_peer_id : int, + tun_dst_addr : str, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink ingress tunnel peers" + assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink ingress tunnel peers" + + rule_no = cache_rule(TABLE_UPF_DL_IG_TUN_PEERS, action) + + rules_upf_dl_ig_tun_peers = [] + rules_upf_dl_ig_tun_peers.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_IG_TUN_PEERS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_IG_TUN_PEERS, + 'match-fields': [ + { + 'match-field': 'tun_peer_id', + 'match-value': str(tun_peer_id) + } + ], + 'action-name': "FabricIngress.upf.set_routing_ipv4_dst", + 'action-params': [ + { + 'action-param': 'tun_dst_addr', + 'action-value': tun_dst_addr + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_ig_tun_peers + +def rules_set_up_upf_downlink_eg_tunnel_peers( + tun_peer_id : int, + tun_src_addr : str, + tun_dst_addr : str, + tun_src_port : int, + action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink egress tunnel peers" + assert chk_address_ipv4(tun_src_addr), "Invalid tunnel source IPv4 address to configure UPF downlink egress tunnel peers" + assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink egress tunnel peers" + assert chk_transport_port(tun_src_port), "Invalid tunnel source transport port to configure UPF downlink egress tunnel peers" + + rule_no = cache_rule(TABLE_UPF_DL_EG_TUN_PEERS, action) + + rules_upf_dl_eg_tun_peers = [] + rules_upf_dl_eg_tun_peers.append( + json_config_rule( + action, + '/tables/table/'+TABLE_UPF_DL_EG_TUN_PEERS+'['+str(rule_no)+']', + { + 'table-name': TABLE_UPF_DL_EG_TUN_PEERS, + 'match-fields': [ + { + 'match-field': 'tun_peer_id', + 'match-value': str(tun_peer_id) + } + ], + 'action-name': "FabricEgress.upf.load_tunnel_params", + 'action-params': [ + { + 'action-param': 'tunnel_src_addr', + 'action-value': tun_src_addr + }, + { + 'action-param': 'tunnel_dst_addr', + 'action-value': tun_dst_addr + }, + { + 'action-param': 'tunnel_src_port', + 'action-value': str(tun_src_port) + } + ], + 'priority': 0 + } + ) + ) + + return rules_upf_dl_eg_tun_peers + +################################### +### B. End of Downlink (DL) setup +################################### diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py new file mode 100644 index 000000000..bb4afec97 --- /dev/null +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py @@ -0,0 +1,928 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Service handler for P4-based UPF offloading using the SD-Fabric P4 dataplane +for BMv2 and Intel Tofino switches. +""" + +import logging +from typing import Any, List, Dict, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.proto.context_pb2 import ConfigActionEnum, DeviceId, Service, Device +from common.tools.object_factory.Device import json_device_id +from common.type_checkers.Checkers import chk_type, chk_address_mac, chk_address_ipv4, chk_prefix_len_ipv4 +from service.service.service_handler_api._ServiceHandler import _ServiceHandler +from service.service.service_handler_api.SettingsHandler import SettingsHandler +from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * +from service.service.task_scheduler.TaskExecutor import TaskExecutor + +from .p4_fabric_tna_upf_config import * + +LOGGER = logging.getLogger(__name__) + +METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'p4_fabric_tna_upf'}) + +class P4FabricUPFServiceHandler(_ServiceHandler): + def __init__( # pylint: disable=super-init-not-called + self, service : Service, task_executor : TaskExecutor, **settings # type: ignore + ) -> None: + """ Initialize Driver. + Parameters: + service + The service instance (gRPC message) to be managed. + task_executor + An instance of Task Executor providing access to the + service handlers factory, the context and device clients, + and an internal cache of already-loaded gRPC entities. + **settings + Extra settings required by the service handler. + + """ + self.__service_label = "P4 UPF offloading service" + self.__service = service + self.__task_executor = task_executor + self.__settings_handler = SettingsHandler(self.__service.service_config, **settings) + + self._init_settings() + self._parse_settings() + self._print_settings() + + @metered_subclass_method(METRICS_POOL) + def SetEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + """ Create/Update service endpoints from a list. + Parameters: + endpoints: List[Tuple[str, str, Optional[str]]] + List of tuples, each containing a device_uuid, + endpoint_uuid and, optionally, the topology_uuid + of the endpoint to be added. + connection_uuid : Optional[str] + If specified, is the UUID of the connection this endpoint is associated to. + Returns: + results: List[Union[bool, Exception]] + List of results for endpoint changes requested. + Return values must be in the same order as the requested + endpoints. If an endpoint is properly added, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + + LOGGER.info(f"{self.__service_label} - Provision service configuration") + + visited = set() + results = [] + for endpoint in endpoints: + device_uuid, endpoint_uuid = endpoint[0:2] + device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_name = device.name + + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") + + port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) + LOGGER.info(f"\t | Service port ID: {port_id}") + + dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) + + # Skip already visited device ports + if dev_port_key in visited: + continue + + # Skip non-dataplane ports + if port_id not in [self.__upf[UPLINK_PORT], self.__upf[DOWNLINK_PORT]]: + LOGGER.info(f"\t | Port ID {port_id} is not an UL or DP port; skipping...") + continue + + rules = [] + actual_rules = -1 + applied_rules, failed_rules = 0, -1 + + # Create and apply rules + try: + # Uplink (UL) rules + if port_id == self.__upf[UPLINK_PORT]: + rules = self._create_rules_uplink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[DOWNLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_SET) + # Downlink (DL) rules + elif port_id == self.__upf[DOWNLINK_PORT]: + rules = self._create_rules_downlink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[UPLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_SET) + + actual_rules = len(rules) + LOGGER.info(f"\t # of rules {actual_rules}") + applied_rules, failed_rules = apply_rules( + task_executor=self.__task_executor, + device_obj=device, + json_config_rules=rules + ) + except Exception as ex: + LOGGER.error(f"Failed to insert UPF rules on device {device.name} due to {ex}") + results.append(ex) + finally: + rules.clear() + + # Ensure correct status + if (failed_rules == 0) and (applied_rules == actual_rules): + LOGGER.info(f"Installed {applied_rules}/{actual_rules} UPF rules on device {device_name} and port {port_id}") + results.append(True) + + # You should no longer visit this device port again + visited.add(dev_port_key) + + return results + + @metered_subclass_method(METRICS_POOL) + def DeleteEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + """ Delete service endpoints from a list. + Parameters: + endpoints: List[Tuple[str, str, Optional[str]]] + List of tuples, each containing a device_uuid, + endpoint_uuid, and the topology_uuid of the endpoint + to be removed. + connection_uuid : Optional[str] + If specified, is the UUID of the connection this endpoint is associated to. + Returns: + results: List[Union[bool, Exception]] + List of results for endpoint deletions requested. + Return values must be in the same order as the requested + endpoints. If an endpoint is properly deleted, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('endpoints', endpoints, list) + if len(endpoints) == 0: return [] + + LOGGER.info(f"{self.__service_label} - Deprovision service configuration") + + visited = set() + results = [] + for endpoint in endpoints: + device_uuid, endpoint_uuid = endpoint[0:2] + device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_name = device.name + + LOGGER.info(f"Device {device_name}") + LOGGER.info(f"\t | Service endpoint UUID: {endpoint_uuid}") + + port_id = find_port_id_in_endpoint_list(device.device_endpoints, endpoint_uuid) + LOGGER.info(f"\t | Service port ID: {port_id}") + + dev_port_key = device_name + "-" + PORT_PREFIX + str(port_id) + + # Skip already visited device ports + if dev_port_key in visited: + continue + + # Skip non-dataplane ports + if port_id not in [self.__upf[UPLINK_PORT], self.__upf[DOWNLINK_PORT]]: + LOGGER.info(f"\t | Port ID {port_id} is not an UL or DP port; skipping...") + continue + + rules = [] + actual_rules = -1 + applied_rules, failed_rules = 0, -1 + + # Create and apply rules + try: + # Uplink (UL) rules + if port_id == self.__upf[UPLINK_PORT]: + rules = self._create_rules_uplink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[DOWNLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_DELETE) + # Downlink (DL) rules + elif port_id == self.__upf[DOWNLINK_PORT]: + rules = self._create_rules_downlink( + device_obj=device, + port_id=port_id, + next_id=self.__upf[UPLINK_PORT], + action=ConfigActionEnum.CONFIGACTION_DELETE) + + actual_rules = len(rules) + LOGGER.info(f"\t # of rules {actual_rules}") + applied_rules, failed_rules = apply_rules( + task_executor=self.__task_executor, + device_obj=device, + json_config_rules=rules + ) + except Exception as ex: + LOGGER.error(f"Failed to delete UPF rules from device {device.name} due to {ex}") + results.append(ex) + finally: + rules.clear() + + # Ensure correct status + if (failed_rules == 0) and (applied_rules == actual_rules): + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} UPF rules from device {device_name} and port {port_id}") + results.append(True) + + # You should no longer visit this device port again + visited.add(dev_port_key) + + return results + + @metered_subclass_method(METRICS_POOL) + def SetConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type and the + new constraint_value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint changes requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[SetConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type pointing + to the constraint to be deleted, and a constraint_value + containing possible additionally required values to locate + the constraint to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint deletions requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('constraints', constraints, list) + if len(constraints) == 0: return [] + + msg = '[DeleteConstraint] Method not implemented. Constraints({:s}) are being ignored.' + LOGGER.warning(msg.format(str(constraints))) + return [True for _ in range(len(constraints))] + + @metered_subclass_method(METRICS_POOL) + def SetConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value + containing the new value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key changes requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + msg = '[SetConfig] Method not implemented. Resources({:s}) are being ignored.' + LOGGER.warning(msg.format(str(resources))) + return [True for _ in range(len(resources))] + + @metered_subclass_method(METRICS_POOL) + def DeleteConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value containing + possible additionally required values to locate the value + to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key deletions requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + chk_type('resources', resources, list) + if len(resources) == 0: return [] + + msg = '[DeleteConfig] Method not implemented. Resources({:s}) are being ignored.' + LOGGER.warning(msg.format(str(resources))) + return [True for _ in range(len(resources))] + + def _init_settings(self): + self.__switch_info = {} + self.__port_map = {} + self.__upf = {} + self.__gnb = {} + self.__ue_map = {} + + try: + self.__settings = self.__settings_handler.get('/settings') + LOGGER.info(f"{self.__service_label} with settings: {self.__settings}") + except Exception as ex: + LOGGER.error(f"Failed to retrieve service settings: {ex}") + raise Exception(ex) + + def _parse_settings(self): + try: + switch_info = self.__settings.value[SWITCH_INFO] + except Exception as ex: + LOGGER.error(f"Failed to parse service settings: {ex}") + raise Exception(ex) + assert isinstance(switch_info, list), "Switch info object must be a list" + + for switch in switch_info: + for switch_name, sw_info in switch.items(): + assert switch_name, "Invalid P4 switch name" + assert isinstance(sw_info, dict), \ + "Switch {} info must be a map with arch, dpid, port_list, fwd_list, routing_list, upf, gnb, and ue_list items)" + assert sw_info[ARCH] in SUPPORTED_TARGET_ARCH_LIST, \ + f"Switch {switch_name} - Supported P4 architectures are: {','.join(SUPPORTED_TARGET_ARCH_LIST)}" + switch_dpid = sw_info[DPID] + assert switch_dpid > 0, f"Switch {switch_name} - P4 switch dataplane ID {sw_info[DPID]} must be a positive integer" + + # Port list + port_list = sw_info[PORT_LIST] + assert isinstance(port_list, list),\ + f"Switch {switch_name} port list must be a list with port_id, port_type, and vlan_id items" + for port in port_list: + port_id = port[PORT_ID] + assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" + port_type = port[PORT_TYPE] + assert port_type in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" + vlan_id = port[VLAN_ID] + assert chk_vlan_id(vlan_id), f"Switch {switch_name} - Invalid VLAN ID for port {port_id}" + + if switch_name not in self.__port_map: + self.__port_map[switch_name] = {} + port_key = PORT_PREFIX + str(port_id) + if port_key not in self.__port_map[switch_name]: + self.__port_map[switch_name][port_key] = {} + self.__port_map[switch_name][port_key][PORT_ID] = port_id + self.__port_map[switch_name][port_key][PORT_TYPE] = port_type + self.__port_map[switch_name][port_key][VLAN_ID] = vlan_id + self.__port_map[switch_name][port_key][FORWARDING_LIST] = [] + self.__port_map[switch_name][port_key][ROUTING_LIST] = [] + + # Forwarding list + fwd_list = sw_info[FORWARDING_LIST] + assert isinstance(fwd_list, list), f"Switch {switch_name} forwarding list must be a list" + for fwd_entry in fwd_list: + port_id = fwd_entry[PORT_ID] + assert port_id >= 0, f"Invalid port ID: {port_id}" + host_mac = fwd_entry[HOST_MAC] + assert chk_address_mac(host_mac), f"Invalid host MAC address {host_mac}" + host_label = "" + if HOST_LABEL in fwd_entry: + host_label = fwd_entry[HOST_LABEL] + + # Retrieve entry from the port map + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + + host_facing_port = self._is_host_facing_port(switch_name, port_id) + LOGGER.info(f"Switch {switch_name} - Port {port_id}: Is host facing: {"True" if host_facing_port else "False"}") + switch_port_entry[FORWARDING_LIST].append( + { + HOST_MAC: host_mac, + HOST_LABEL: host_label + } + ) + + # Routing list + routing_list = sw_info[ROUTING_LIST] + assert isinstance(routing_list, list), f"Switch {switch_name} routing list must be a list" + for rt_entry in routing_list: + port_id = rt_entry[PORT_ID] + assert port_id >= 0, f"Invalid port ID: {port_id}" + ipv4_dst = rt_entry[IPV4_DST] + assert chk_address_ipv4(ipv4_dst), f"Invalid destination IPv4 address {ipv4_dst}" + ipv4_prefix_len = rt_entry[IPV4_PREFIX_LEN] + assert chk_prefix_len_ipv4(ipv4_prefix_len), f"Invalid IPv4 address prefix length {ipv4_prefix_len}" + mac_src = rt_entry[MAC_SRC] + assert chk_address_mac(mac_src), f"Invalid source MAC address {mac_src}" + mac_dst = rt_entry[MAC_DST] + assert chk_address_mac(mac_dst), f"Invalid destination MAC address {mac_dst}" + + # Retrieve entry from the port map + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + + # Add routing entry + switch_port_entry[ROUTING_LIST].append( + { + PORT_ID: port_id, + IPV4_DST: ipv4_dst, + IPV4_PREFIX_LEN: ipv4_prefix_len, + MAC_SRC: mac_src, + MAC_DST: mac_dst + } + ) + + # UPF + upf = sw_info[UPF] + + self.__upf[UPLINK_PORT] = upf[UPLINK_PORT] + assert self.__upf[UPLINK_PORT] >= 0, f"Invalid uplink UPF port: {self.__upf[UPLINK_PORT]}" + + self.__upf[UPLINK_IP] = upf[UPLINK_IP] + assert chk_address_ipv4(self.__upf[UPLINK_IP]), f"Invalid uplink UPF IPv4 address {self.__upf[UPLINK_IP]}" + + self.__upf[UPLINK_MAC] = upf[UPLINK_MAC] + assert chk_address_mac(self.__upf[UPLINK_MAC]), f"Invalid uplink UPF MAC address {self.__upf[UPLINK_MAC]}" + + self.__upf[DOWNLINK_PORT] = upf[DOWNLINK_PORT] + assert self.__upf[DOWNLINK_PORT] >= 0, f"Invalid downlink UPF port: {self.__upf[DOWNLINK_PORT]}" + + self.__upf[DOWNLINK_IP] = upf[DOWNLINK_IP] + assert chk_address_ipv4(self.__upf[DOWNLINK_IP]), f"Invalid downlink UPF IPv4 address {self.__upf[DOWNLINK_IP]}" + + self.__upf[DOWNLINK_MAC] = upf[DOWNLINK_MAC] + assert chk_address_mac(self.__upf[DOWNLINK_MAC]), f"Invalid downlink UPF MAC address {self.__upf[DOWNLINK_MAC]}" + + slice_id = upf[SLICE_ID] + assert slice_id >= 0, "Slice ID must be a non-negative integer" + self.__upf[SLICE_ID] = slice_id + + teid = upf[TEID] + assert teid >= 0, "TEID must be a non-negative integer" + self.__upf[TEID] = teid + + app_id = upf[APP_ID] + assert app_id >= 0, "App ID must be a non-negative integer" + self.__upf[APP_ID] = app_id + + app_meter_id = upf[APP_METER_ID] + assert app_meter_id >= 0, "App meter ID must be a non-negative integer" + self.__upf[APP_METER_ID] = app_meter_id + + ctr_id = upf[CTR_ID] + assert ctr_id >= 0, "Ctr ID must be a non-negative integer" + self.__upf[CTR_ID] = ctr_id + + tc_id = upf[TC_ID] + assert tc_id >= 0, "TC ID must be a non-negative integer" + self.__upf[TC_ID] = tc_id + + tunnel_peer_id = upf[TUNNEL_PEER_ID] + assert tunnel_peer_id >= 0, "Tunnel peer ID must be a non-negative integer" + self.__upf[TUNNEL_PEER_ID] = tunnel_peer_id + + # gNB configuration + gnb = sw_info[GNB] + self.__gnb[IP] = gnb[IP] + assert chk_address_ipv4(self.__gnb[IP]), f"Invalid 5G gNB IPv4 address {self.__gnb[IP]}" + + self.__gnb[MAC] = gnb[MAC] + assert chk_address_mac(self.__gnb[MAC]), f"Invalid 5G gNB MAC address {self.__gnb[MAC]}" + + # UE list + ue_list = sw_info[UE_LIST] + assert isinstance(ue_list, list), f"Switch {switch_name} UE list must be a list" + for ue in ue_list: + ue_id = ue[UE_ID] + assert ue_id, f"Empty UE ID: {UE_ID}" + ue_ip = ue[UE_IP] + assert chk_address_ipv4(ue_ip), "Invalid UE IPv4 address" + self.__ue_map[ue_ip] = {} + self.__ue_map[ue_ip][UE_ID] = ue_id + self.__ue_map[ue_ip][UE_IP] = ue_ip + + # PDU list per UE + self.__ue_map[ue_ip][PDU_LIST] = [] + pdu_session_list = ue[PDU_LIST] + assert isinstance(pdu_session_list, list), f"UE {ue_id} PDU session list must be a list" + for pdu in pdu_session_list: + pdu_id = pdu[PDU_SESSION_ID] + assert pdu_id >= 0, "PDU ID must be a non-negative integer" + assert pdu_id == DEF_SESSION_METER_ID, "Better use PDU session ID = 0, as only this is supported for now" + dnn = pdu[DNN] + assert dnn, "Data network name is invalid" + session_type_str = pdu[PDU_SESSION_TYPE] + assert session_type_str == ETHER_TYPE_IPV4, f"Only supported PDU session type for now is {ETHER_TYPE_IPV4}" + gtpu_tunnel = pdu[GTPU_TUNNEL] + assert isinstance(gtpu_tunnel, dict), "GTP-U tunnel info must be a map with uplink and downlink items)" + + gtpu_ul = gtpu_tunnel[UPLINK] + assert isinstance(gtpu_ul, dict), "GTP-U tunnel UL info must be a map with src and dst IP items)" + assert chk_address_ipv4(gtpu_ul[SRC]), f"Invalid GTP-U UL src IPv4 address {gtpu_ul[SRC]}" + assert chk_address_ipv4(gtpu_ul[DST]), f"Invalid GTP-U UL dst IPv4 address {gtpu_ul[DST]}" + + gtpu_dl = gtpu_tunnel[DOWNLINK] + assert isinstance(gtpu_dl, dict), "GTP-U tunnel DL info must be a map with src and dst IP items)" + assert chk_address_ipv4(gtpu_dl[SRC]), f"Invalid GTP-U DL src IPv4 address {gtpu_dl[SRC]}" + assert chk_address_ipv4(gtpu_dl[DST]), f"Invalid GTP-U DL dst IPv4 address {gtpu_dl[DST]}" + + self.__ue_map[ue_ip][PDU_LIST].append(pdu) + + # QoS flows per UE + self.__ue_map[ue_ip][QOS_FLOWS] = [] + qos_flows_list = ue[QOS_FLOWS] + assert isinstance(qos_flows_list, list), f"UE {ue_id} QoS flows' list must be a list" + for flow in qos_flows_list: + qfi = flow[QFI] + assert qfi >= 0, "QFI must be a non-negative integer" + fiveqi = flow[FIVEQI] + assert fiveqi >= 0, "5QI must be a non-negative integer" + qos_type = flow[QOS_TYPE] + assert qos_type.casefold() in (s.casefold() for s in QOS_TYPES_STR_VALID), \ + f"UE {ue_id} - Valid QoS types are: {','.join(QOS_TYPES_STR_VALID)}" + self.__ue_map[ue_ip][QOS_FLOWS].append(flow) + + self.__switch_info[switch_name] = sw_info + + def _print_settings(self): + LOGGER.info(f"--------------- {self.__service.name} settings ---------------") + LOGGER.info("--- Topology info") + for switch_name, switch_info in self.__switch_info.items(): + LOGGER.info(f"\t Device {switch_name}") + LOGGER.info(f"\t\t| Target P4 architecture: {switch_info[ARCH]}") + LOGGER.info(f"\t\t| Data plane ID: {switch_info[DPID]}") + LOGGER.info("\t\t| 5G UPF Configuration:") + LOGGER.info(f"\t\t\t| Uplink Port: {self.__upf[UPLINK_PORT]}") + LOGGER.info(f"\t\t\t| Uplink IP: {self.__upf[UPLINK_IP]}") + LOGGER.info(f"\t\t\t| Uplink MAC: {self.__upf[UPLINK_MAC]}") + LOGGER.info(f"\t\t\t| Downlink Port: {self.__upf[DOWNLINK_PORT]}") + LOGGER.info(f"\t\t\t| Downlink IP: {self.__upf[DOWNLINK_IP]}") + LOGGER.info(f"\t\t\t| Downlink MAC: {self.__upf[DOWNLINK_MAC]}") + LOGGER.info(f"\t\t\t| Slice ID: {self.__upf[SLICE_ID]}") + LOGGER.info(f"\t\t\t| Tunnel Endpoint ID: {self.__upf[TEID]}") + LOGGER.info(f"\t\t\t| App ID: {self.__upf[APP_ID]}") + LOGGER.info(f"\t\t\t| App Meter ID: {self.__upf[APP_METER_ID]}") + LOGGER.info(f"\t\t\t| Ctr ID: {self.__upf[CTR_ID]}") + LOGGER.info(f"\t\t\t| TC ID: {self.__upf[TC_ID]}") + LOGGER.info(f"\t\t\t| Tunnel Peer ID: {self.__upf[TUNNEL_PEER_ID]}\n") + # LOGGER.info("\n") + LOGGER.info("\t\t| 5G gNB Configuration:") + LOGGER.info(f"\t\t\t| 5G gNB IP: {self.__gnb[IP]}") + LOGGER.info(f"\t\t\t| 5G gNB MAC: {self.__gnb[MAC]}\n") + LOGGER.info("\t\t| Port Map:") + for _, port_map in self.__port_map[switch_name].items(): + LOGGER.info(f"\t\t\t| Port ID: {port_map[PORT_ID]}") + LOGGER.info(f"\t\t\t| Port type: {port_map[PORT_TYPE]}") + LOGGER.info(f"\t\t\t| Port VLAN ID: {port_map[VLAN_ID]}") + LOGGER.info(f"\t\t\t| FWD list: {port_map[FORWARDING_LIST]}") + LOGGER.info(f"\t\t\t| Routing list: {port_map[ROUTING_LIST]}\n") + LOGGER.info("\t\t| UE List:") + for ue_key, ue_info in self.__ue_map.items(): + assert ue_key == ue_info[UE_IP], "UE key is not the UE IPv4 address" + ue_ip = ue_info[UE_IP] + LOGGER.info(f"\t\t\t| UE ID: {ue_info[UE_ID]}") + LOGGER.info(f"\t\t\t| UE IP: {ue_info[UE_IP]}") + for pdu in self.__ue_map[ue_ip][PDU_LIST]: + LOGGER.info(f"\t\t\t\t| PDU session ID: {pdu[PDU_SESSION_ID]}") + LOGGER.info(f"\t\t\t\t| DNN: {pdu[DNN]}") + LOGGER.info(f"\t\t\t\t| PDU session type: {pdu[PDU_SESSION_TYPE]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel UL Src. IP: {pdu[GTPU_TUNNEL][UPLINK][SRC]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel UL Dst. IP: {pdu[GTPU_TUNNEL][UPLINK][DST]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel DL Src. IP: {pdu[GTPU_TUNNEL][DOWNLINK][SRC]}") + LOGGER.info(f"\t\t\t\t| GTP-U tunnel DL Dst. IP: {pdu[GTPU_TUNNEL][DOWNLINK][DST]}\n") + for flow in self.__ue_map[ue_ip][QOS_FLOWS]: + LOGGER.info(f"\t\t\t\t| QoS QFI: {flow[QFI]}") + LOGGER.info(f"\t\t\t\t| QoS 5QI: {flow[FIVEQI]}") + LOGGER.info(f"\t\t\t\t| QoS Type: {flow[QOS_TYPE]}\n") + LOGGER.info("-------------------------------------------------------") + + def _get_switch_port_in_port_map(self, switch_name : str, port_id : int) -> Dict: + assert switch_name, "A valid switch name must be used as a key to the port map" + assert port_id > 0, "A valid switch port ID must be used as a key to a switch's port map" + switch_entry = self.__port_map[switch_name] + assert switch_entry, f"Switch {switch_name} does not exist in the port map" + port_key = PORT_PREFIX + str(port_id) + assert switch_entry[port_key], f"Port with ID {port_id} does not exist in the switch map" + + return switch_entry[port_key] + + def _get_port_type_of_switch_port(self, switch_name : str, port_id : int) -> str: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[PORT_TYPE] + + def _get_vlan_id_of_switch_port(self, switch_name : str, port_id : int) -> int: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[VLAN_ID] + + def _get_fwd_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[FORWARDING_LIST] + + def _get_routing_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[ROUTING_LIST] + + def _is_host_facing_port(self, switch_name : str, port_id : int) -> bool: + return self._get_port_type_of_switch_port(switch_name, port_id) == PORT_TYPE_HOST + + def _create_rules_uplink( + self, + device_obj : Device, # type: ignore + port_id : int, + next_id : int, + action : ConfigActionEnum): # type: ignore + dev_name = device_obj.name + vlan_id = self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id) + + rules = [] + + # Port setup rules + try: + rules += rules_set_up_port( + port=port_id, + port_type=PORT_TYPE_HOST, + fwd_type=FORWARDING_TYPE_BRIDGING, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + + ### UPF rules + try: + rules += rules_set_up_upf_interfaces( + ipv4_dst=self.__upf[UPLINK_IP], # UPF's N3 interface + ipv4_prefix_len=32, + gtpu_value=GTPU_VALID, + slice_id=self.__upf[SLICE_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF interface rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_uplink_sessions( + tun_ip_address=self.__upf[UPLINK_IP], # UPF's N3 interface + teid=self.__upf[TEID], + session_meter_id=DEF_SESSION_METER_ID, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF UL session rule") + raise Exception(ex) + + # UE-specific rules + for _, ue_info in self.__ue_map.items(): + try: + rules += rules_set_up_upf_uplink_terminations( + ue_session_id=ue_info[UE_IP], # UE's IPv4 address + app_id=self.__upf[APP_ID], + ctr_id=self.__upf[CTR_ID], + app_meter_id=self.__upf[APP_METER_ID], + tc_id=self.__upf[TC_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF termination rule") + raise Exception(ex) + + # L2 Forwarding rules + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for host_map in fwd_list: + mac_dst = host_map[HOST_MAC] + label = host_map[HOST_LABEL] + LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + try: + ### Bridging rules + rules += rules_set_up_fwd_bridging( + vlan_id=vlan_id, + eth_dst=mac_dst, + egress_port=port_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating bridging rule") + raise Exception(ex) + + try: + ### Pre-next VLAN rule + rules += rules_set_up_pre_next_vlan( + next_id=next_id, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating pre-next VLAN rule") + raise Exception(ex) + + ### Static routing rules + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for rt_entry in routing_list: + LOGGER.info(f"Creating routing rule for dst IP {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]} with src MAC {rt_entry[MAC_SRC]}, dst MAC {rt_entry[MAC_DST]}") + + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + egress_port=port_id, + next_id=next_id, + eth_src=rt_entry[MAC_SRC], # UPF's N6 interface (self.__upf[DOWNLINK_MAC]) + eth_dst=rt_entry[MAC_DST], # Data network's N6 interface + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating next profile for hashed routing") + raise Exception(ex) + + try: + ### Next hashed for routing + rules += rules_set_up_next_hashed( + egress_port=port_id, + next_id=next_id, + action=action + ) + ### Route towards destination + rules += rules_set_up_routing( + ipv4_dst=rt_entry[IPV4_DST], + ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], + egress_port=port_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating static L3 routing rules") + raise Exception(ex) + + return rules + + def _create_rules_downlink( + self, + device_obj : Device, # type: ignore + port_id : int, + next_id : int, + action : ConfigActionEnum): # type: ignore + dev_name = device_obj.name + vlan_id = self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id) + + rules = [] + + # Port setup + try: + rules += rules_set_up_port( + port=port_id, + port_type=PORT_TYPE_HOST, + fwd_type=FORWARDING_TYPE_BRIDGING, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + + ### UPF + for _, ue_info in self.__ue_map.items(): + try: + rules += rules_set_up_upf_interfaces( + ipv4_dst=ue_info[UE_IP], + ipv4_prefix_len=32, + gtpu_value=GTPU_INVALID, + slice_id=self.__upf[SLICE_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF interface rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_sessions( + ipv4_dst=ue_info[UE_IP], + session_meter_id=ue_info[PDU_LIST][0][PDU_SESSION_ID], # Should match DEF_SESSION_METER_ID + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL session rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_terminations( + ue_session_id=ue_info[UE_IP], # UE's IPv4 address + app_id=self.__upf[APP_ID], + ctr_id=self.__upf[CTR_ID], + app_meter_id=self.__upf[APP_METER_ID], + tc_id=self.__upf[TC_ID], + teid=self.__upf[TEID], + qfi=ue_info[QOS_FLOWS][0][QFI], + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL termination rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_ig_tunnel_peers( + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + tun_dst_addr=self.__upf[UPLINK_IP], # UPF's N3 interface + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL ingress tunnel peers rule") + raise Exception(ex) + + try: + rules += rules_set_up_upf_downlink_eg_tunnel_peers( + tun_peer_id=self.__upf[TUNNEL_PEER_ID], + tun_src_addr=self.__upf[UPLINK_IP], # UPF's N3 interface + tun_dst_addr=self.__gnb[IP], # gNB's N3 interface + tun_src_port=GTP_PORT, # GTP-U port + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating UPF DL egress tunnel peers rule") + raise Exception(ex) + + # L2 Forwarding + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for host_map in fwd_list: + mac_dst = host_map[HOST_MAC] + label = host_map[HOST_LABEL] + LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + try: + ### Bridging + rules += rules_set_up_fwd_bridging( + vlan_id=vlan_id, + eth_dst=mac_dst, + egress_port=port_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating bridging rule") + raise Exception(ex) + + try: + ### Pre-next VLAN + rules += rules_set_up_pre_next_vlan( + next_id=next_id, + vlan_id=vlan_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating pre-next VLAN rule") + raise Exception(ex) + + ### Static routing + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for rt_entry in routing_list: + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + egress_port=port_id, + next_id=next_id, + eth_src=rt_entry[MAC_SRC], # UPF's N3 interface (self.__upf[UPLINK_MAC]) + eth_dst=rt_entry[MAC_DST], # gNB's N3 interface (self.__gnb[MAC]) + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating next profile for hashed routing") + raise Exception(ex) + + try: + ### Next hashed for routing + rules += rules_set_up_next_hashed( + egress_port=port_id, + next_id=next_id, + action=action + ) + ### Route towards destination + rules += rules_set_up_routing( + ipv4_dst=rt_entry[IPV4_DST], + ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], + egress_port=port_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating static L3 routing rules") + raise Exception(ex) + + return rules + diff --git a/src/webui/service/static/topology_icons/oran-cn.png b/src/webui/service/static/topology_icons/oran-cn.png new file mode 100644 index 0000000000000000000000000000000000000000..f1555434f9db8e4268b6544933069601bb79eeab GIT binary patch literal 23796 zcmeAS@N?(olHy`uVBq!ia0y~yV9aG;VC>~!V_;yo<*KlNfq{XsILO_JVcj{ImkbOH zEa{HEjtmSN`?>!lvNA9*a29w(7Besy9ROiQjg+X{3=A=yo-U3d6>)FpvR8;)y>+~w zH6);M%iR{aOE2~=>D(LpTJ%cxPmPo3*aQRvmb9ns-IndRu`yw>s`X?BC5|Q&(KoR# zWnb=n_uKaU%)1lj$eQim{5Gei{`}|qDUg~y{h%|`YYBCx2u&~ z)Mpp%{ye>{{LpvaYODR37H4+u`geMH_|^HHjF_`12$83S(B69{>0#s$52M)z|mJ^4Bxi51bS3cNSoAoN?f1`L9&?W?k~KL;1A5k2rwjA8d|=A1JOKa6=Fd>3hmpVjdB_^}6n z_8D62&ty4wmG{8U)LM(pi{$1+hKc*t&*NAw9{KRfAr=c$dp^H&y^WJqw?1rHEGDDB zOJ>f|=}Z}>j90oDpT)4aFQ2nswr=*{*C$l2eZ1f@O<`KE!jeN_S6W0ZZf&w#`ZjX@ zqi<{aZ*_gu-P$F;+DPP#|AXhNEvz>DdGzf}+@wAMK_=I z7O_{dRsXgn@14z+RjtMGs}B||vOO@fjKTdD!b4~7*Q=Lpn0NH+(e<9~Mk}Sv)7MzL{_VJFy7%6vZvG86Uu~}~H<|fg;3SXE zyDCMQ+}js+u8+0OyL66^LH#!Kn_TVihiGA5;YL$jlFA@2icG?yIYil&Sr1WMQ?GO{Vg> zkj0;CM+<)Rc0ag~ef7bE)8ZEXdsoi>{?PnJy86A8vk#fY)Tiw~b?N-XBl05Eg~~5m zpT4pGUi499mCUJES-%dy`!R?257P~2?uM_0v!{Fi_+R^+@%4Uz8_M2|H@C3wAIGC}zpz7dR!!XDv%eC4TRdNAcAc?=$>OS9LjCQ{w{Ei~l)v7* zZ12(3Td$27{&`*Y{e4|c)VI1f@7D70EA5x(UvCYbuX?c4U-;n*9_}}CnT>aqbv}GA z;QnKKg=u%2%7Jyqg%X}GV7Xy=fy;H*8 zjLo>$^-KEoz1VZRj+-;N-aY)w%EJJPG)Yb__sd)7F%JVME-x}Yh15qaKDjz zYV>{~=ZEi)IXAq%$a2H<2Gi~fdv+E^mp*t%d^AIN|Qgh9oOiw-*GE&T6m4>Yy0m?a(6>m zMM`!0&%K#-`SBg?>66``Nj!BG?%Flkyt!iD`JJub8)Bo?(^Of@a;0AXpP4?BH?Ca%n8McB8nwJMozdp|_-FNo(bo1-J(ziF?UG_IxxZvLuo^$i14uAZ~ zn|Qz5bHn@nog3cYbh+`}N9j$imf$zL#$&nHwg@Ly*D2+^pUZK(TJ6v__O%9y|i?^|}h|FX|4 z{lS7p&u*v7_pWj!xN|q;>N1#_Uv}?ZQ|x-nqUgzawSqlc7~j+@3Vz!^h2?j=M^o+j zoj$)`UYPN1+i%?sU+uVa_8#ZD{chudYxlO6Tc>Yqd$iL{wX5n!PIaQF;Jkic=4-bT zh5gO70=nc9x{@d7xv)Kd-oHWf(P((kwmwgIbDu<)+1>oh*Gi3)d~43tu9bi6{G+CG zL*VZVTcVlYWN~iTd#AuYNABhnzT;Qg3KEiREerz9-!coDy$6Ox^ zE+qul8{aI`?{L2}`^cNa=l)(6nz=|X;qNo)DI0|}Z_PBAUH0&2eSYR|A(<@hf)_Hf zeQsLDxiXfQg5I~>xyjQv)uicg@TSs2Tix=A#Lu~5H>$Fga`v3u^}OHD zu;|OLUp#Y`Z~u=b=Rxv|K5Dp99(_N>fr|Ywq7lJH|g1K zW!oE)m-arqu>0$dMEN-({Cs;9=V#{cQx)8HcMgYi{)Tsd9v_=g^~iMM^!kp>#TRx2 zcKvd?x$|_#*^4tZUrnFN$8W5B?@rLCU0aORnRBHCm#)}-#JOc^(EO~!ot1^I=|xVrKay0q43`p>)b;nBhTr*%7?{r3B3+8JVyd%a+P?b?Sw{-jv^ ziTk_4=&i4LMB;N^&kY}69VxAU67l$Gwu=0JgUfD-#+|;l=RRFYKe}2lGR9t^EY~f- zTEX?B;eFM0f~J%HX0YDf^07UOZ^NHO(Mm=yy}~Y+>E~P3c%55)I;`BPwkqDbftjuC zO?N@k*?-##Y8;JZ=0(|S`Bp#P+WFyospp1=T&LIHHrB0qs9AZum_6f`gkX|-w?*(p z`G?;NlUVNENNcb9xw@`K>73EWEEkzMKQpd>W7*0aBodc?^rLcc+G+ELY9h;egRXpi zwD3?<&$72>Z=R>8`Ok=%Rhsm_kB_1KR>iE1=d+mA#mpO(-(PP(e0kCJE#@(EU)-rK z70NlWv1a#5Z=cw@wM$IiG5E~h&Yx{PbCF-_w@K4yu6+_J{7Zgw_U4(fu}4IXm!FAy zlhUulXqHguYI~-Ab>*~!Yre?0H~R$s*N&Umk#t?GWeLbx{=2PwY-)~hPR(4L`ONy+ zhP=!Ag8Y&}DkiykPQtR0t-^LEEdQR)pZkz!o9FD_P2ab&KA(T~;fwaK4^OaP%)KSO z-mir>cI~;^aJ55iYg$5ITSw3C68Gn0GRT$NxbptTzRhvPkAHHd{nN@{*eYsq>F1=` z-y(1NXudj^(|7O8x^FtddNoT{^ncEfx$eRlX0p!x_Bz9FlT3s)UL^$|KKw^?-OEIM zNqsrHM=hte1pY0YE9Kt4;o8=gWoP3q?-Kd5UgPzZ<=UGboH$puum8B&rGsS!HF3!n zzXGosyzPx$yTR`GBb&NVr8V#87;s2%*Uyex%93=;VwdAzEuGUzkIroPBP4B}KfCJ8 z{>+2V1xWy8wk8H?WW-s+!Z{_?Q=|D-Z^^NkXMs#BJoz0V_i`bSd8 zLnpV(b$eB^KY!j_oN&C2@0oJWm3`X^UcD}{_*MA##Efqa+;3zOTIc>1PCV|c_jsG? zp>KN*_*6Uhv2J@7k?8!q<-Ylr?(FvKKI_sZIrv8Zo~7R}<@YJHRkJVrOIizqe8HTO z#TM7P+Bx*!@p*jJ4!_({KiS)7=AKtk9$wYUoFtWeHGHL)uIKt`7Jt!5=0w`9{Ap#9 z-*-(beY3an=7##}gurdZ>Dd;)0&Oj<7CXN1kv2WXw3}Nv;rk1gAJr~QZ=~`bdT)8R zLG{45{}Bn*=G-~^Pcz+qx2nFvHU8~#g-$>f|N6>9f*RS>&wKoF0{+)gE%5A^3g6P$g zIj;hPkM*84Fe??@oM|&-LQ}wOvwso1ahzwuW~s_qshmi;_5RHHH)fS}W|>yp{ca+`7EfzhQ2<>Va>sA0-yQ zjks|{E6e!Ro`@SYbvilw4ygXA_bL8=ckSuqMDO1$Hzv(wh~6Ze;BBs*vu|_J<$D)y zGTpX{OpLwVl7DSm&*`Jt8t%rPBD2kst{*dWwavS={RH}cvs)7y)2VHOweGD++Al!h5R z=T1&6{>l)tcFxRr5$@{Gz!R?&;VG zKV8DFpWV<+lQ#RYE#Vg5{@HF9?&Q3>DXMl>g4u6s_?D?U@o$3` z`b<>PS$6hmO7parlk=Q9d6xBxtUc5E-R^9Y=hDaxsm|2}kCgluDgIu>yl&f@{?`XL z-hAfs`$V>9K~Yj{&zADHKl2|wub#Jk&lb~lVY_+PoLkkq=G>{ZSCbOMzgpZ-nw4+R z!q)e!H?VRVt66GP!sXtu8x?mgeWlH|Z9cSX+BD2)UKy&Fbu5$i`S@(A#EmN_7tQ`= zdTiO=eRD;>ZS!p@)z!&oOl}PI2eZ-FTWs7*9-oD)0f;K^x1~F;ZtfqT|QQ@W<}%qWwlS%Ru#NiTeac;)?M}T6{;V9JL{|7eXTdYx@?)C zw0_UejNq*^;te0&)04_GIGU80%+8&&=Tz#go%5FMUAa~Cnwhu75BI1hIaSvwE6j6c z?fR%xz3$Eye*bms$JMX5H|JlwySqN= zQeW+Qm3xuqX0Qm+3~we|V*T?e@iOPH`5QE`ev?IxTU(U99~?oKq?B)((s5zP0o2 zhDW*U_#JS$wB>&E1;es$pY%RFT;!8?YqI^xCR6(zZNEC(-gFyWa=Uzt?}V4n?-SKu zA3m@y?N3}%TQO;CPVprNxA>fOV!uBxd$n=7Q`(*9#}6%2`?x{z@{KLqw{JPLYfH;g zX{i^&c}nav%Z~W$KK@3}=VIA!+hezC@4Eh26L|dp%vJt-cRo#@X8$|O@b(5F&dYkU zGnVj)cMBU#Gb$ru_OH_!y)`aJw!|KK*uU+OV$wt=rJ!YR zBc_$!e6v(Ge%4-{)lHf6ZzONaTq0{>zWs???VXDs<}9nt$f{NM$!B0+ZknMsO>;)h zI=SCR&%G*~w@jL6Vc~X<2ghRXZMkl~{lL0qVG*;FW@=4S-xDHw`5KeSTaGvC9gFS% znC8~*oi4g2`{7RcG@0_eV_OP~`WNYnZRXZa^Nqgf_t`X)X{O?7@rzuaPPI=odV6!V z)z#U%t+>i(0FB;Xh+B43Y zujY_WTbx+)<8ykodG3*Q@61bmzifM}fAr0vw#duJ&fTmzzI;u7rt|e3#l@GVvmN*v z!hjzxkQGJvL2gqs~L+Q@*>mE1%rrxbVx$2m8Bk zwoQ3wyvlfY)tUUu&jPpYno&BxaOI4p>|Ph`f}b4^x4lxAT$$B1BQ=8K#Fo&%$9b-& zJ@=Jm0~KW%ldd0KG*d}v+2500dYZSo&YgRd8tasGOTDY)u$|Ffx%*F5FM$%$w~yVA zn9bhxiXT0=tNZbT^WBdhT$d{R5H8G}lc7Ds%=Ol@gBp=K)9oMePu>-H#w;Zvdds5R zuNv+8hf<>pg?jYA%*aVCo1CvuWqh*8@bm_Oj?CwlcF!vxY+Ai-62H&)!UrFJmTDKi zRg^lgY3oFTx0Ugw9`Rp-%|u!+Z1G>g`{2WyUFm(bS2j$n_~Q|H;>OR}tB>y~Gh%qG z*S$%CV>uA6g(W&ARZ?YMLJzXhYjG|8sKTQ>5#&ha9r9&Fy% zp?`C=Y|^$#2WELHCEj|~rKdUn?*!I`9a{?3o@nOq%?$niq%pEI_-L~GtoahF_w9^& zb9%Xt)c0fENnbU73-xSz{BXI{#}9u~KYoaQ%yQ#GkontEO|csjb6QKk3Tfpp=iv;@ zxV2-wN?vi=u?eTV<8@xX3HcDvJURZ;m5((s8zQEiI@10)b7|e%!W91;{ z*BJUNq~=(dT)q@zvrZ=`>8sw&Al+}Rm+Pd;TQz=9viPyn&E`*pvE06ug8chUJPu6# zcgm-_I@u)mG}Ff$4;8(9tn;gQ?%!k$Uvl`OT$)_dr%Tpz_%_#kRs9&C=zKBDfc5%+ zGY$XLOXV>$_0nEWjl2BVcWrjlCG++hT4|C+O%PnXELo>m)saH6`4?bS;IW{`=)u{YX$ba+<)WQYsxMbd0umO z-P1Yx*7LL?uim_{r99tkr_Sq%Wd&*JuYHd%Q;pM?3pTqG{B*mq_gUYoN%3DyAKfbm zlv%Uag74oB6~4N{ncvE%A3OZ&^rOV5OT~UHT*qo=Vx4^}`*q~A-Fz?qudj4qNx1cH zZt#b#ch}XOQ9jtPW%;UGWTw5Hn0)8WexZJK?YzhLPCnAV8?yG= z|8JqIpC(><+Ulz;k(zw@ME(uNmtC9o@70mpx6g(#EN&h{wvg_J^i}r+cTRP`#ksnE zU2d+1ob?x$gj*UW%qF2GhZdYjz3@wW@BiHW_ntmUeLA1^a0gwvAL}grcXAy2?;|?SUK&2qC&SIFYL16LWRsSdqw(r- zRa)I09m?sum$c1pvBf_V zQ|}40mshns-F;Szr{&a^&s(CIv!X7yx5*_|9{t`CS?y|ed0xb%+`P*|DLmJ#zQroO_I&hks`sIjC>?_@R6Fl)b+`vHaK+#-y`8xAA;-WJ2j8RFo^XQ|~dHaJ~HuBE)_rG^SWUY9A)nU*7J3rQN%#}2Ll>7eG?i%6b z%}>N{&RCRZepPX$d84fGW**6fM!84U@jdL$oOx2d_4=V@bWZY!~fnA=RNCx7vf_N{i_ z%kty0)a$(Ke9EDBwtT!QX1z${xc-^AqRkcG5*PYs%9=eWKEEkc>kii&?mI%ST@AhW zAFN|C{>xNTv!iUv*P@n^i`$HxGH-F{@uZpEx>kRH?}zESc(coO#eQOceoXE(-MaY3 zmgOdTZ%nk`TK-VjDX?$-Rk>{;{U19vZOmj*zuXb{O)GrL-YtEscB_*cr-pI=nVHl0 zwO4n;%6Y8+wj8P2|MJ(gsF{102nTQRStjyRL3i>~(bA-CH=j;t6;Nu?%DVNVA#qBV z^Ba-lNom@zqCW09+;Wf6^2inE?)w{8?%#OtXnDuYU%iX!Qdf1lT+f`gzAasFWx#AR zv)+e4XH>o}kZ1pY`}Rf0Gq(h8`uu*oGt$8GbX&9apB$ymqRaE<{?hTuHj+y-lZ#q7 z^GNiRv(^gPss}dR5{nQ@Zakl)vq9q?*ZqXuWy#z*50}Y4f3;ALf6npaj<>yc86N#8 z6+cZ_-XT6EeE+k{6Lb4Ib@o5;OS{a|v$|`hnO#U#`+ZKi*jrZ;Q>C{%N!;Fe_l9@S z&BJMna%5)jmGHg2bzgBq>h<=3cP6P}8H;}GEf9#hd~N;0*y_mm(|3*(24pNVE1f!H zr=roUZ>Nu17Cey8xbF)wkRL zw>ROT)!Cd|u{CdsH8|I1&S!0}c{Ta)pXqV?Ci`ga4Loy=S~{Iy{b$l2D=r?WJ}GSVVwtU&osS&5yn26Y?o~bg?oD?O|G6_cb6+9<=hdkXeU-gm zMI;3Fu!OWT0e^?=vo~|Y5%Q?|7n?ip5p%?iJA<+ZKa;!J<7vu(?lJwNbn?c1Me zd*#@2mmI#c#oYS)wmq>n%iipn9y7z(`s+-i%kyqlsQd|B>=`-b?L436;A{I=3#7i5 zoiIQ7vd0=xyWXvb=0tGocyBqhEQLGgiR?r}ZfzN!aP7kx-fMg|U&^18E7~WxcG=qg z*?%Y9+$tY&{?VPT=PH~(kLKQ3AQ}<(|M=|WR`FB(ge0qLO zcr&k7qG9g!+3foc7CkmAw9&hIQsnseq<5kdE^YDN^zi6S%MIVw^Zh&9XLEQ~oa1K6Q-G!}ip+L+XWL z8l77YiR)dCi`QrTx9Qll5Q_yyi>IxW`(NxS|9SVqLxxOdxz~-RNk~=+_kTHSC(|VI zl_yxHIC5Ur$_hQ9#(dA8eR*oL-R?O5ZQ8MT;_gnD*@?S+G>#g!evQbf`;nO1a&*h- z#Ncq2FKVZiOZAnrQ%rMnlxBWN z<-2jaQ1ZQvQL(UeC;$DR@Nf$^hh=9^mp1h?9xrtWRqWe|2$2#J5u|(tfmL$eXl{vH2|19^*?-z8*I#+@tU8 zy2IBx{;vbSjgQP_-97xjMXrl)e%5k#%l>zl@>cdQ`}^ig%#YXS`Q|;V(UZ+&KWCd; zC)%%R{C=reT=bNGGCsLR*A8#l-*>Y0e%6uCny=sSc^IB5D|e_9N^i6*6bpE~W`oK} zuGwEDCr1DG@i`&hfAZkf7fg}XjQfu-&Ux!UZ9SK^7F)ut8xxy-MQqa|w4Y@<%x696 zQ#j?r+JkRy$<-b&Xtwz)I{)d4+QaUdCtCJC@w&Ww`3J+hs^51PS(R6>l-y7p7HD7S z`}})+h5S>0{=2LC5>4N3;=9G~GjmmR#J!r*i4XfDclcJn3zxm6_fJ#UtH$8%f6=E0 zcJLQHJa2FHi*E@)fU!sau5;B>OjQ z)V=+vYtz~Qsr=SQ7TP*~TMlhI78Vh2pV(Pp!xz8OXLslQGk0DT7)Ru7vOD#)()ISy zoL8TdzA?_;c5`Xu)JL2(qL%ZfceZcY^I_pbV>$1r?)FX&i|UKZz8T)-X?*_ZJPTj_ z!HnBEHv@how-mEEIY#*2W-U{D)D+NYGWmtHp1HtgzWtf&vm)0&IbF82c>lXclQZqD zmD%sjp3QpO{MQA|$_=^}<=gMQzH?Kj<89f(r*p3y%08cZYqL~;^L+iSQf@b&w*Nfa zzxlu&3+^e$A{T0$py03`Ri*+Mfe5Fa{B6L_HFukyZc+@O|F(3W^z7?Ww~As%X-;TXN%9OjZsd# z#j))wd(th9I^S;Xcl$*1F3)4UtAAnNtAf`}?`_N-4UFDCPk(yg#`off*W;}jWU?M- zUXjaUUS4h%uPqnurl!X4S7E;M!_NN8^Q@L<{tqy|XnIDUai7?tH=krDNTgPHD}9*?|h#7O&qvSpM^! z;lhdk-@bXebp64N9qU&LWH1aWdBCVC-1u}E>HZW7rbT1CY!^#w>q}j7$45q zy|H-aH{;9231_az{P;P&kHKBb@EvpR!JVtWs(qYc^vUnkj%YitYN>nPlGT2fH5Ccc1@CfpvNpV2pDWb7%+~nteuJak znd0Vh%-MSDx#Q#I>d$FZ_i3Nf>)U>aXL{y)uV=Zp8t)b?n|Nf4;Oxhp4RN>c7V$f7 z5pS<=)L6P@_seAyGlb?xYMQXJG<(c4OA3#_`rK_sjr7IS?{r>&(AVJHpSfE5*0L!& z?+b3t_xOF1zc}H|78!}Zae6g>W7Qjy*^c!t+dF&qx0#o%je3^ndmp;}vOo4)nAgJ> zrep&6sZ`Um2(|@MkdVK$Uqu}J?#5-4HBL2p@H$2Wg5P5G)Vg1Sd(adl1 zIMcUnzo9D^u6EBu@6Y#W&E&bkLB~RqZV5j)9rg9cteX<4`fCMJli8PudOceEpkw=? zHx=47BKfVNUxgBbC$|KBobk}v=<+eMirrT8c%$T49zTHJt`8_B<(X3QgUSD7CxcJWJN?$^QBN}hD-rPF>P}Z#zZ$jt3s{Iwa z?EbRYA8~p-)#~EM{LVJ6-}jQGV9}hy#hLHjF6XgsSbMbY`M0#WM;^OL6_h^MJJagh zImwsj5AW7Y);4_`y7l$pQ@1`oUAAU-+fUBGZ)YmBYhD<=J?pFE`e@_f_LOD4ckJI5 z?c1KHFxN?AUtN3Il$+k~t{8v2rYOy^uBLECoWXS239%V2UBCPS+W((SxW!S{#~;`D zJYBEgKz6hBLG8YYXV$Id*`2xHZg2G6a@p;N&n%7oW0u>qO}<)N+|BP?@@g-2SLA^+E5kq>-YUDFYl%$cRKu~Z;8FZ>|J-S+zwY*78`M6@2~Fn z|9;CI_xi7#Yw~vC`zME#*FQh-IREK^MWMS2r<>>AxX3hT_Uw5A{nDOy0>3Re*1C83 z^8F0?%X>a*yiBxm6!r=dvUk^~$9tU+%Cz_0Qno zt2y&S#Gk1|+Kco{$1O3*wUv6eU18e(I(C`8({?PLXIS-3v16NPZid6$@QYftoHyko z<+o0)@bpofocVa2bJ<(YeQiBA(}awlKMGs0?C#p=xHHYR)iQIp?pdsP*=@7jk19Tq zJ#)C3<4(73?>1ieWOE+_`z*$se6|fsEe~v4_VA|cVRp5Ro>$|1sAZiD4lwI%Xv1wnoGSe&nlnM z4!E4QW<%BGs>Pqx_SE%fUOuKa>EHUNO@HfmemGzp-thKlj7H=Q!Eb-=aV3Pa9cb$@ zKDRY9zr&qR{axC`>%qtGS#CTzV{QIYzXtQ*W4}Z)#ZBiicqhL){AfnY=E<3-wx%Yt ztGL~iSC2@Xrpmc2dadz-;4@E?BoB2zS#~$uDo^D@)Pu*{W34wOheQ}`@2-$2o}ycB z)yEqn_JiMh3zz%L2WkA@ChdA8`boOdNBZJx^Z2)iez`8qe0`_lbHt2)uId%DHgJj9U!9jSu{EKlPYFXUlCVNrrV^zv8_Tr-uh| z?Vmm8pUIwiM%P}h&U|d~_I&cI!;5CLY~nj%`E*fEj?_U7>Dg`}*|9TZ=D+yY$faY& z$+6P+_SXw%)*TPGGWl!}9?)5>+|gO}&9P(K#T9Q}9e=j{W6<0`yMHtbY1;monccSd zro8NRtw{%Oyp7Yld~IianbPTEAFfk>80$rNF6Uiav!Uwr6T$U1MvHbAzdGboksime z>~E6ZmpVo9fA9B)ABYuR*I<1-p3!(~*||xUxeR8@7%X%b8Z{Lklz%Y&RiAgQX6l*g zla1%KUJp8Eao%W^9|C)~j}4^5ne6?ayD_ z?qyB6bv~An-)1uRcblo)=AzFIZB<_1U|Ae}(0KCgy@l?H+jh^@(TOQO-kj-gBKz^A zw&vppSFacv7?$$wJ;qw-K_!QGBI>(@(7y!^UL@n(6t?X;;X(^L}jvM)B?z4p$pEPC@h z-gmn`&a%77U;nM7`{IYJQx+9RTQc=~@;T=peev6V+I*kjjm($0f`!+7$lLQZaHGXU zMK2#|$KuP2-yT>}?)C4C$Z^p}ihmB-X-~Z=` z)4F<6E|&95*poQ+J296hpILVI{KO+~j&h$dZ~eLQ!OU%bZigpU%gJ8vb-yLNbK(PuqK~FyNW)TlUoW>qQRVd{;7CmFHP3Se22I*r&Kaa_+B+AIoq2Ek0Ym?sU$r69-;S zH<xw0Riwezb?2UIUtNnXIW=B;8Uy1Cr$9s}e z!cRzD6}9Sp!S&WHj`JmddS3n&^WrH-@BKVgv9#DvR#p46QFPk1qqfGI_1?^!d9ZCs2v{83=&6K}!d%hl-Qt|r#PQArDGgMZ%Ow8OJc*R*R z^<(&t3!1Ow(t_JNZ~k^soO50zch}Dq+`XQ6m9IWKV)ph|!#D3Io0TuxboXvQ`q4B6~mi#Wd%QVZ%(*g$Y3+ujBlQ|Ecf~4eTJF0k{wsiXXj29)^@r1PEh#< zV`tmj4QdCcRGjWUf8^LHf!LiLMwj2&e^*K?@8PhyrT2QuA7`5u|0mghXZYSu+tnKz zFTPaVUOw_gWX$}VTedULI@6Lb*Jb8$=2rTmgIlIbZjIRYc=v)k&G$sOF1y`Y!hd_p zG!s6y-u=vRGg_njQri!2QGEPR$D>Yz`_=ceOxccNN3>=ZMAoTYd2yF@)%RCS&%eIm zdGp_jxq89myc_>tR$SY%duzMY_Vj}vmN}odnQg^4&r_QD{IXuo16z(Ccw}YRcKFYo zK(nl{znnvNA?m? zyoR?sns@(Wxs=}!eO&XF`U_Z=_J=^5;LsZn86s$(-FaNe&tr{mR#$QWxZR@Nqj54y-ZnQ@4JW>)}Q<;UL}Vw zu?>w6juyMTZ$-4)m7TApG|p(We0-Ul;1rd3V41CLrAf`CiqzJte~z3qIXX?H!v5N& ze74Dj?ejEDbN@U%UH;~S#^n8%W@~OUiq1^`$nadnf9}cKd1v1#^)LH!;0=pmw5Egc zrp$6y6K2u&kXu&*p{~-HylSIO>2~+XrlkS1%r2?b{#dom*WGC|+v10D)%g-Xzikcp z5y#gv<;a%R_a}2Y&+2V4%uG)3sZ#9m*5_%;>~EIrZ9ka4u`u=UpHux32Q{kGoRn$= zrhhoS<;IPIcMBe|2WH>0s)_d$=C7=L`Sz0aku~QzOq@Gq*|KIq0tAZy=I&+3i*e&+kRCmoHvWtFGJr?G9SLoofuM;IKih{rshrsi_V6!2G(^aP22*_wq^Qv zZ*@tV967(E=<+sE@sCgS&${i^s9m~CH|bhiiT;{%BBg~6b4$%ijb9r^#$DFa$UOMw zmR<0(m(%t=y>&V1+Ek(5WpkIu9e?v`W5YW~<<`SnBwxqvE&a7Y|CXtCi<#u%g{hMR z3x5CI`(UH_?n4u{Z~mcG|IpxV*4|wVudg!d?S0NwVN=RuGs{q_ZJ8+B%`L|dAMb5H zsHAvGZ@+P`@;xT`tDWbC)=!FY*_o;Q$B}dvFmwMg+;Q-mwYoOId6Gh=S$qpIkz4^TU~j zxCGCpn;XMCZ*OpAGR)m)bf?Dfct=BY7pqa;HQPVyjYM*1W=~YN4{ZwkRyggvc<7}2 zTfXw0T(@j?wGujykG&SqyX+QaE)%f3^p}Bq`!nGM zzQ+vI-EObF?DpZr?%?0Y6;>Z!T=3NN@56iQ|5^WkPZIxezIf(^zc=+hykBnoaNEbo zg5tz)k(cG>@kSorwBYdty$jDip1bg8qu+&;0`?Ox>P=(5ueYgKa8;mU!&iY5`Gzub zUivNVm$?%ij%7$lFkPNE$B5A`!(>MOEp5Kfzf}|k(~cj@pD8IWzQ^{nlV8KKwHXs@ z1MWQdVEM+!WH;CB^~-Xvhs}J|a)e#LSNg0$)Qjj_6L<|Q({8WHOkO^3|FY%%47W~x z+R~U*mUujD&rDI4567O1x!p87&ULNUt-^iI(j{N^ukbzgAyYQm=A?3-N#43Gf*0&^ zRZ6m~n2M}zxxz~&Il{{&Ij)ygvaH*^NIqu%ec^TTMb#Ft#=lYl*uH$Ro@hb(vi?T9x82WAK4|##r`?vBr&<09+}hHqwr=@lQ^)6)hNry(ue|>wSHFHgua4m6 zE{>YZe7W0S=bqXBS!42RcDZoTo+HtbzrVGbMlIv3-R=B&`GVZbfp_-YPUC6klT==i ze2nA8Br~B+m)solZfWe$%2kP(Y{;}O+nguw%^!(7b4(fXPF6|ey|s~emtoBFF3*hX z-()+fcmCQf?3cL~rr*kVG1rdkld)UlBttGPBe&KwTkiYRa^1_f5fD4Bc6gFiVQS#F zKNZ?KJ{~QTB)pfe6!Z4|_-8Sb>)Us`JbCgK6npgNnHet)5!~FZVU{~rTj<;S#*62l z_sp2fzT?1@MQgugpB23OfPb^x(cU9(mbhOu`ZG`QSof`vW$ymr_c|;>Y(B@*jnjNp z3p;l{>U5XAvF5?~=0)!h$v&8MMUi2#@SI2Ie6Jqw=yjj;O7Pn4<4dDNzZTl5oLg>I z^3SG80_7 ze%2w-dg6D^Q~n*Ro^-SO^AVlHoz{Eo*M}avu;p5&^ZeI0{%F3qlB45x%g_08o|RBu zmX%Omrj<}$zLn6sGZLKt&q=VBoAa*E+&|4qF3z`>?OuKaLwEA!gvhs68&r-l#UFck zDB#-U`A1Y@!nOWRu#?}o`ua!q&6nCQr`{+l?S1{#S1rc7XVux6vC+??q>ub&K73x% zT`uE&$IQ9Hca}yM`aEC%bPw;{)6OTazdKg=WOK^yuzk(9_kNxEylVmPxsPk+IcyqK3?@eFsi(BRv%`8*gGv%Mip2;>6UPAdzM>qODJRMb<;G3iL z?tev*qt7AZ`Ntyvsm_bOl3e_!+g$L$YXdu;r?+>0Y&*1qvD`fHihg9Ha_s*}Ift*u zJk>1Nl4|zWecwa9ZF^tObxuDk%GTF+auzZ)=wX0EDAm3SUw|U9uBPDq^`ZCuXuywU>s6PB`$F%)_ANU!HzH<$= zmy16hW4kDS=Cag|_~{JO3$x$O2>N7MouT+4;rNRG9PdSK=Z% zxwHE+ZYU=I*r50Fu>I~$KPMNYZZ;H}QKo1!-;8nI*$Td8W?K$Ex^eBC=~khK+i!i` zuw~oRC(lbCEw2?ze!FjhpX_%h`)B!Hk%3p(BOE>D(=OX-S6iGq<6GN(^Gf@Sy(hkE zNgZ&O42pSr=oz1@_5AI{6qVLf2YDtbI1E!=m_t{11|r-$ll>}=HUYgzvy zBWi}d-2$`Y>wOAs!u0Ar*H4wd(Vd@GcJ^G(s~S1MM>`*xZnZQsnw>1OS=9E(;vzqX z?`{8L_moA{o0TTs+}mM4p=;N?exJZA^_%6EhW*uMl+|~ca<@GC;rHDn;%Zkdjj8XHgfAZ=PMsqQ~Q~-!1?pXMDyI3SzlLv zQGdW`@|tb0qwk)ZKSOk;F-^EemUm@5S|HYuDHWRHUrv zefIPAR`B?M`iyG-gx6^`|E-}n){kdb#=_=Sx7vO*6RoD#C>+*{ZXb; zk^2ri9`!jpTEwjoSm&zmo}O0B^FZzGK5^|k+JP>9j~8Z!FXOL&HLK^L|D6jtJa=v- zG2OXXV{_+TPRR+M>X=&*61Ts2N?iUDIV0>pk6;KOm$tf5HZV+~@MSPgOf!Jbv}%;raVFN}jAXPw$yi5q<1~^4;0J?bWk<8-CB~ zZ~r~3&oKAa;Y-I4U0CLS;KMTi122~OA3Abn;exBb`OmDZ=KoU^sT@%rxYg4B`ij4g z%%>mQyZhIrij}vfax^I{YPxOQ*0)Q!_Qw@#V>jP-(+s`#s@Fbw#y-2RG4AX!=eW%u z7nn%%*Usu~uRD9}u=Ckt&i~Vd6C5^k8mzdVH#J&7qUE$mEYcV;w5&v#D1WGvyv{bI!%(Jet{1wOV z+Ly}qH44d7e$~HR+*Q4_U+bK|d}xlheC!qd+=!PGrX2KcU(OR_sFZqP)A3;W`Tr|! zeXw-C$1J4sl2s8cgHqxypR( z(DoZ#j-UvEe$L_+O)Rd&MW$3pru$@}>@0Hio*Nb)^oU7Kh=9ujZJCXk?sy}ZP=Nu5<(R$IOZnHacm)YIYUU}jF zDxy1#dEZ%{G+$eq&!96ia>v2mmals?zZ;~sRZmy-7kTUX_txtCuKF&Wb+1>gFrK++ z?epl8hkd3ynuWaXw|`RkFSs?ES-ZxaP2?;8K3A!{gKcro^|r4#zVAqS>C_*kJ2hfz z6#tiQ&#wPCH$dbq%j?)X;eTeBJXm+Tf88Zt1E~|&=OzCAsrNE?(TOegPpH=cbh@Xr#H8(WiW_}xu**Suw4mce_Zzd)q4sjhzY`tJHJ zg?F$2PTcp>=--bA(~@^wUo`DxtF*cHt=~B(uK#HMEPXooziygP;0NFK_lYaNKCPa* z>$L8vb!nUJmiiuDf4bFo_dLy8fy*-H8&wx7fBTSh=fo%WkI9!DmdREvG0!z|JRbe4 z?`@X&zLkb-7h7 z78`rl+W0@kE{>OMm^{LIHuq~-;?$6o6HGlH8EnDa298gNAO;hczU*%92D0Tm- z&3={eKfx}Av&$M&o_?C$G^slBzW;><;!~C`ocMV4vRK=ohnqJ+L$*}0Kk9B{n{}>+ zTg6fSSMrlq2=f%qF5Az#aZP!k+UD%vHy>wzkh&lAu-Isp**^iTSB&?j%?*FDbZ_{c zXOH$PbIdX;bGX%=|IB{QUfJoDFaBjt-wfK@w_i)#?Cd$Y-%|0~=lMQAzPNo`-|THY zxh)WXhFv+lr$!=m_r}bABUkGqIeq#w9=!;7_}S=zS#J5{4&Ukt`*m+z)t^xtw|LX} zlNq7^sVN5-?GK>nn7yY#}(o?3ukYeTRrd8o2bs^S6bIN zNNd%F%AGo9z54XbyBB+JUa?!3X!Fx2Q2wE;wZ)(FJ1#30O~`DQo9TP|*^Ps<-9E`U z&s?PS%Xam*hrYFCU$y^nty%Fu)mANDr_OYd#LR8E*J{ta`!U=0n`qe`+coumvikEg z#UDqX2}~=NN%}S^|Yddt^C;1N8wKy>n|4G zdDL+9K)%qQqvhEbxE?I)73__bRjM;x1ae2D@9yJ|x_{c>qEf->~!~cqkW26 zud326zZ2Ro7ii;iJ2j2<*5N&xL4`WWdu2UqoGvf6IOwc&`CVYl?D9`ZKeeR~_XxKa zESh}w;_RC;*SqTbBvNH39u2%Dc+y&I%lw&(^3uz4%{H%&a?Skl>jS4ed-pS4VNhJV zU1qcB7tQE@nY;Q{`n>Nt*LC)ZFy|K)i0s;@>AvK7;;oL;J2sw`Se(22msaqW@)%~u zCx*E$g)$EuHJE3+ za(R7xW_ffdHdsqsm8g{A9Li6+}zT*=6BDlNAoRX zx%E@Z-df&!lNH?k)unTm`Mdv%}^%lQ>5nPvs~2WWp1J6%fc>J!d3gsi z`ltWT{U|KRd_SVFaP_9h32YBeP0hIROG$eITub^Z8yA}Rd%2k!3uZ>*m0 z+wh~{LD8g|lh+_U-Yd`4P|eH7skKTWzr9USj zeXkHK8(^+c=*TXJ=24&4~Ksb4vCpnDj&RM;;-YXMma~;=@tDvdad|J zo3})a=hmhb6^cjePxDPR|I(2v_Fvb!?Ww8PWZq^Ysd?QtU*=3bb^PpOjfq_O_LrvK zcBx!q%?>>X2yz?{b;yo-6$hn>9!pkCbZ6>xQJVN?xX65RrZ9`6N6)Ad`iIM$$x=Or+{rqvhS#PUma!(U5l&uX znY>0YS!bSMS?3ScCWWRhaJ;B@8=CbPnzb5!V@=MPebBa0Z*6+d+0-7}^Ae}aC2br9 z4m#G{+hO0$X)|%fr7MX&UlV&Wdp0t&eU)EfW_0XcTF>3X61!t;Dq41)U9e~B%DFQ< zMGE#FtgN`~pTyQ8(($$BlgEQjm#I(mj@{sC{>8Vn&+yp1hRH~Ho?uydb1SM)C^N@g)(oP7a+%JGqIz}P4dcWpQy7EyTf!!Bsh+2ncgwelV@hx zRfjd|Q{0*SRThcKO!_|6aqg*A_a1S!%y96LHjOwF5OiY8YPKZXg*HMJN`h1G9Fe%4 z9WZ}W_Ld4IMU{ZdZc967dT}5d!nfPe)@^c}pudI-%i%5J9ca>Bb!?>)JhF*BYg2o4 z(|be>k9ozkwF(#1rT5G=`{AcBOJQCF2S;1xVmUG6X*@=6S2afXYxJ|s^KjukXq2-& zo9Fx8b=T|T)sLDa_Sl|~n0->hI&s4K{ZdMD3MW`jZwcf*dPcR$XLpvuHQ`grjp{;y z2luj-K3`wpk)VITGzgpfR^#Ih(<(rgD z?3njPD>k3{qMdw3D^1Mpn#7cqM!w?4oJhW(Cg$ljApnE!0QY8 zv@Tm13U?Y9rx-@aPI_pNE276P;E8ObsD-548s+?7-e(+~%A}^;p50`ss1dX5@AirZ z2F^%6Sa~BY!2Mp!=`E+u8M8h8wk+YTRPwPc>y11ZZ5 zQcSZ_$?lpt<3LZQ@=~^!`#Ac=IgzdBeJ^pP-~8dO>lY6dHh-!Xey1g`k>)Ecc)9lC zwW9m{>L|v}snfgGZ~oW)j6;&0xyF8T(Jsju3IdnSKF3~>e)@?+99c0_OuEY&>3l1l zn<1}G9hmy(Nb!ed2|8y|j#Zp)&VBvpey!lP?sj1#MAq;)D9cv**mv?#9+l(wKS%4Q zB{VtsN`nqOXbLQ=M=B;-L~ODH%;cx2Z{wRrQ#f7OL` zF1sB$|8tT35g$}#e(N0fRs`=jqi~CJS>|`cA8Yih{LW~wOvnu9JyPXVsq(=^>CqR1 z72^4`G}9a;gnTZ$oq1<7Un@-{1u5JG3)!Tubes2z7%T8_Zp%zIp7x_MUL3LavC>EqhWLfVT;~(?%xvr+2Mv96K z3wg;a-R5^yK+e&+ye{{HZG4L}yE7w-=WCj)KB~#&I)(VH@R9zw-ShO?z$7$GZ4}Px=cJwa~1vaEMc%7k|PDwi`F3@8Eg=dOZ697u`GvfdxN+0zt`8$pZ2 z{q9FVMX8L@+Y17Em-Esl^y^1yrKJcVB_^o)&mYu`axDd+wQ$GgTMOd$tZbganCP*@SNbAP-^1=rM|$=YEI#;s zZ>LYRA3O!uWCiHoD_J^&F|mVZS#QVj53V=PKh)l#+4iG0U+MBRVOV`^ahdnk(b;*T z#tJ+Wk8b&Y{(;55j7>8xTJE^{VD~+jWxDFHO1Ci1e1&-aF8?zP1}Uqe9EuZeVx8ia-D9!$xC8>2K;cn;gFRr{tdQKJYKKLBf&p)g! znaaHswcOnCwfwnJ{&Mjs88Z=Yrs1FB!ib?Jh!{*1o z7I7xI>HV2|#2MjVMb>!9E4}8i>S+!Y3ac}f<0WKni(eHqPU^Xv`oR*}9}}4B%fHI0 zq$yZV-+k?>!1=?onOxH@_nBI3)4!#cc0}TJ8k+j1-Mp`k%`Ui;Z}Kod{brgWv+#+W zTPHZ0AOBvY=w!E}vFV2-iup}dY^A|7vpQ#b@bEiBan=i&%%(e9Hsr=`-FzQ^WdrP<{;BczQwKo|lY<%$$|i7Tme_W#^1W z&qXJ$&N6)nCoH^r2{AIJv_Q@N5UR)4!P;BP5IncIg zOUa)60RMYiS`Ewg&FECoG0|9W{_tA%!9($v?Ud657z<__ZbZ{iV!C4aDU+BpE=*C< zQ#KntG};PQt(zvGIL}xk+Q1blwWyxvd9}*u=Vr+q3k@TU$II`@#wxH&q5R${UoH1Lm z{*+1h85O1y6OHNmUgE}F0` zAMt5w*uSjS=Zpi>HOVQ)0mxC$oA*fj+D!dfXC!ueoY6U=VtDMC#FV8*iJMv09Td#@ zWBPV+5}Q!LWJgP8WJ|ux$W(Ludq(24s4=(T_8r%%#7;lx{?#>;m9yUWcgKuIl|6X@ z*Bp=v4@KLw*`9Z}o*7sv7qBg^@QH6#_Hk<6zpU2djDu2v&c2Aa&B$dE*BP_PJHED` zj`_&0AaNz7=WBXTZF+%De5palQ^P~?mydlq(Y1fJM};uL<1SYkE?+(R%UJp9*7XZq zZ5qV&3U#wg4t%Z6`7iqUYxu%@&o9Mao>qJH$adaSIc`V=OrWcOvlWla4bG0oyTy%< zE!!owrt0R_ZQBo;}yKIT9Kc;X0Cb0=^y1d}dzb>Rw_SJ`San zd|0zz>dMNVsFM=jg8m9eeq`U;eUwLq^|$zkwGKM_*CU5e6<TP_>8WOeaQIZCf?V z?9qF%Di%%7;Y!Zg z?0A=5D@Jtv6hpHP!)tCf8(97b`$&H*&y_-?{my!xj5Ry>PMTcL=-bcxj$QfTy-o{8 zcHUo=*Qfl_K5~Y$iG$s%pK#G#)EOlMpT9k5jap&!$9})F=KLxJ?c)p# O3=E#GelF{r5}E*D1k-K+ literal 0 HcmV?d00001 diff --git a/src/webui/service/static/topology_icons/oran-cu.png b/src/webui/service/static/topology_icons/oran-cu.png new file mode 100644 index 0000000000000000000000000000000000000000..aff6986e3800b4184d942f9a8edb24a406db1ccc GIT binary patch literal 26326 zcmeAS@N?(olHy`uVBq!ia0y~yVBE{Vz}U;d#=yYP8nXT+0|NtNage(c!@6@aAP!5q zqpu?a!^VE@KZ&di3=EtF9+AZi3`Pe)m{B7o>NW#ITDGT)V@O5Z+qvu&B2TX!kLQjE z@H+KQ&7^Tci_%^-#y#KeZEWH?d5%p)Fy~7{g8uxt^{v_L(i|txsWg~uROqOByZ6Fw zCMAX1^WW#pj8#xSoKl{4`pmOG^Pc~|qkVGU=Y8qs&-dqxHzi86LD38Y4xP-Bpaoud)R>I@QrB)Ub(5WhCTUq&6-GXoy)0bj$2QOZ2d4YJe53d?;W zCou_N{wm3AM9xH*A+ZaBdqz^eu)pd8{9@ z%?_N8WU$}H@ME1N%f39eMt#5L1J8XGH>@#~iMhqWS9eE%uVw-x`@PQx{;}%aus7%Z zcGj=4R`hG)`WXIiQ?BvK=-9G4tYlW0&tmYJ<;U}@kN5w1u3C6@ow&>M{qsc6X5N)J z7REC(Hk@ZwhHBR-EAEr`T`Q*gIRzD6t@jVBNnM`#mS@{`k32OmFUY5aZJ9ET!wgg}8 zhN(LlP8T!O<*uB0kN>RVhqr>uzDEk5{W8s@skyt~WN*n0dwt$-XFVHhH@`Y;w^Z(p zrnTs|Gb@;@m(Atbecwj#-^?iM4fU@+GUUr~f7sR_d%lx@yREw4?Y}~^<&%|v`L0y1 zF^=kT6g}&@vA$)(pVO`WjD{IvEB?O@t`nP7-=Z;P^N|G0?tOPAewkZ0C+k^8L0sj! z4<{K7Gt9P`D%5$@odSmH?;UhrHhtyHdrtgs)_Sz>EwXx}>Dy>)EOp>r z=GVmUvr8Y&zwX~!AGex$cbpw(*}e*)H*;#3-c&3T`}6n9#|_VSCNtg>+3>h>nTK0c@`cN57#>~Q z8FlE$5y_yBI&bf{@8frxw7pAdXZwe#=1W{H+Zv5$buHTTIiz`atzbr4xl8rO{rR)` zAN3to*mFvI(UK<-Q7yR>)UFG~{a@-7v@iVr{)5GR75BBa{6A(UHZ@oD@IBv!`sp$} zvtkpRt-}+lcfVtZW&Bpo_G9(q#N4+GAJTsxUbfvVqe{DovFXa=u7zlqmd%odrYTgZ_d%X31WryV#-}!Ld!~9QSzqHx?w@qgc$8N}+A#HZ|VVke> zoehN>*v)OoA8yWQFxa;j}-<*p*-*v9uU+mj|v&?C;#pi0Y zow0ND_@q+!JV{aCc@c(_-{u36x2Sw$sa^%exH({S^CKu-LTjxjmrKFtZC-QnKmAfVW=&h|zO3he)Zoh@D27Iaar+xdm>gHR;wDJ>QZe=gq{<5TjH@7dTDw5&;;}2=Z95t0vGJm#k z%EVlf_!eT)vUajj!s)+~8%mSda%MibW^#_VzK?g-eGl>s;Ii9y zHgNXl2e9Q#F-oXSRLhZ=!1?-D`k`BmFB|_(?r)U+Z>hGS_|i$qM)B6qlRQd2PH{X8 z=41J#-mq{2IYQ`~FG7hCpQt=#MQv_WFq5lii< z`MSQL)oZrs9^>k`E&k|#*o8+qjZ03v65qP&>$O134yXTRQ7n%Qn5>J9nd-OJhsYjV z;#R(7TM5Gt<&3J=7r!)dM}$3L_)~V|gPLB_&ux-#s`qQ=R2vCzvz^6wTkd2-E`R!g zYwX4eum4JJNL}Q4`E%-lwnaQQ0%kBu=bdc$YF?S}w>K}MyjgnNy-Kb(70+haM#~F* z&5)M$URcvVVaopg8PY}TF0kZ>_Es;xWwxBZ*6Y;#Yxk!o_^<3|7OPEIzs2KU{8h6S z&9f2DE++|h`OlNy_mI{8@T5JH#SU9^{Efa9Uy=~r{`bT7zLS9qUp~C>Y}q!3*Ug7# zuPzYuUa@>S>xXQyH_6r^{8nZPF%ZkyHJb7YVm5IdiEkv-H(!?XQ3DsdxS1=Vmlb)^#)zym4=%z08_r z<>@I^*?k6kLoGLy2O8h_SL1x+pO0G3|MIj$KKXC2%0(3KO#gpu_UpVj>la6kZMoaG z@Pxf950~$%%l7+HChqa(n5|xITVUw5qqySX%Z6PG4z1&vT{daL6KkFCIa?Kf@n?MG zWUj87$bUVnxVkKE&fyT%4Quy`e=BR-P*tH(`czFX$x=2Uxu8OLyY_<*&tA#gF#c|G z<6n;Qjej}LH~!6MnSC!*E~0!V`?Z*7ZC|IS9oW@vT$K4+wozrj@Wl(=%AzuQpZu)n zn%&86{(=KAGZdeH4q7(MfUuH+Q+np18@JQ72-|DQrz8=Qs_+KhNI@cR4&AI-M zXTb^EpttFli}{YPiNE`??#4yI1o!2uo|T!%8tpBc_41+IUfEY-_5 zzNk$;e{tQi_S@QLzI1$9GHc$R$cm}|z8DrB4X;}`;Ys|Fgwp)Plu0ROw(1k?cJx1g zKHqBZmiOoT7;i{6K3up>Zlint-lcf)Sd;T`PDqHVd z1Fv}Mp;yJW)nRicmofHsu3f3Qto=}Jj$P{PwcAY}%!!^Dvx3j{(l2-CS6t!$eP4YO z*}ZU9oJw*0Rgd3`K38t|a^y_!&nKr_{C}G6SZHUo@#W3=iszqiong5B`If8uOF0kN zTP+Kl8*=&Z)Y)$tw$0@g>tC+jXTWS0H-S<6{I@qzh0Bgx z9t)rB!@sod@wDsRhn%GwgeUX#v(3AucyjjYE7r4uzIWgJaAWm~*>Zf@+U%}@H)VdU z*bx|0r#U-rl2L8d>syD_zgJbh{J+c9Y)RzFFHN^a|7G!4-^*sSUT)GRt8d;WdvKxe z?%DTVeYV~3a*t0$>9X|OU3T+68|o!&U*fegb6NW#MU(ZP=H|9rZQWbCQ8=$?`{TB+ z8MEcMl3z|O=g5zgtBr|Cxa@7`biBB?YVCuI{C01*)&JkdA+|2y;ju6Ktq)u55Z=V7z_Pi9h99`CKyft7i^fy)T=1-#v1}>)vBo`u=ZUTAu%s@HA4g z(f<6YmQdDrU$wdKh_BwbY4yiQLt7cUPp3o=t+vtL^Ynjb#H3GKK4?yERoTD(RQRq) z+xh~HtG^E>dd{_)F}1Af^z=nL_UQ6@9y-9Pb}{Ni;M@9+0>8Z7eKT8E9{9BF!}%@8HgH#0YP8R~w`#Ld zLaMy~gY(8l39kFH&z`b5A8Jyw?O@l-#QuZP*W&L4U5l8j{OR1uj);n*Tyet9T6%jO zemsd@oF=${dR>ZvDx=PhEv+4#gY#bS(yLIW{L`Vt?}Vs zDizPVqCMjHXKszzaYY~BtdVo|pZe_Wyxl7NWjSwB>LP@7H%S{e(A?erq#>BHC7i-H%wnpH0{I5)BLw}$@h+Ryt2AV;O`X#IxJ*WRcHE~A zht|wXp09oW{?}V`YHn;gcj%F*%(Xw8ncvL2X0dHq`=RVMub2 z-1o7Em6ZPfR-Jy`(xi{`xZpDJM;xC&YlU-q{#OU_- z%dqNc?W!{p@_eG+pB8W1*&na|C4y#=KD8h!^cG>H!2*haxCI6|1!Rm z7`xmgV)j(F?Aa_=b$G9B@onFFH+I9i1H7+4#cWuYZnZ|&qrEhvBBSPdRl-}*tF!N& zs(JHrC-d#9v;$pw>rxeR${e;X_UV5x^>~z>hV=TyA5S&6cq9}ZJYCQ}^TpGZhc_3s zPWW@#N3M8jZv2EPOi@c)1oSUo-e&k`x}BZchL@`B`sd&7{QI>0^Mn6h+z<3u7gyGA z39qi)ogQJb_qfr6_3p+A--Tyx`1+CO#xD=HoLwhHZDeq#MhtDIRHT~ExG-DBQ5eHD-Rr7voS zo|}uazg4)UVB?umV#oO$ERoby*I@9I@Oy}M_x{<)LQ=Fh*kyv?Xe ztFDZ;KGdkcHEy2h<=?+g`rPQ9wcV<)@brfM4R&eI zzcD@P<9GD<$M}V_aAAGsstHrnmG}Fx>z_Y5Z=O+v^lPh?*mUed-OC**rpM`mGQ-b;r6KKVJfzLfn_ z7yf2b7tj0tuja_-Z_Dbh=5BPl62Hf7$)5eceq3puoxS{^RaV@^Nm&h= z8QaJ)UW|JFKU>?Ne}%uG|&EGv{Ko?(y)t#c2`~&%Hg#Sa{t?;OM4Z^Gy~Wx&38} zKJWMAU&1QQY@attUtGTD`rhAHDs8_lerX#%kKNil`o+_SOw&x4AAWa9Ephg}`;M1y z|Ey8|@qDMxjc@OJbZ`ID|GYW3zhd5^udZRTw-=Q7zP*yVI(zw>TM^cx*Mcs0O)Ibv zIlI1>J8bUT#?bV|FH=Jd_lnNFyJ4R*n@;}gUq8P;<9$>3dDmiJ{VTUu@9>dcc6nv8 zh1Zmq54oIHz9|a+cs#C4h2Jtn>|OB@-hXLr7FR26D?JY7&+Om+a^XY%=$_p7;+xMK z%$`>qxn;%qkEhc2CcOGH@58GYlf5-RswaD1K79SpMaFNs8GO4>A2Qz?t8dbDSKs6q zcgp`?ukTCV&#Bk?ye{Cc)AGYFHf{?0n;w4M?{8J<+bPV_Ntty@tYOc0C0yNav&+`j zWbf3swi_0$&3>=1dwKcADm51O*>M6sQL74HUNMwWJ@w^-#1^H>=p*U5tF%p1Z6pqe z>v;ZtBd#qzL+Viof7-eO3-_JYx~hNg$lWhZyZ$oYS+V}>jK#dO=Q%SLo{8qR-dd3z zc;0#0_e*bVZX_Q3!ZiE#;dzq2tIYR?ORX+{`L@z^Z`6zTZ_lUZ-S}2=OtyVhT0+^B zsas#2j|*OX@YdC>!QYSPoDhC4FnihIRW{q#yz;0@<81WRFI@IK z^w*463m^RsRk2t8HF2|XVMmbfx`}*+ZDLzaY!A`Wzo&BQOWT>_iRX4-+3XK;nsH@n z;O}3?V&(1T_b>bKhv(J(D-FM~{pgd8$%>Z`FZ5NuT)o!tO_lH4mu~~x&DG6$YB%>* zO#VJ`|NdQJU7L25Wij|_sqNjD9GqC{Cbj0xv$m&%s%f75z5 zyi`5*r67Oa_BVRL8{M0=zVR<{?V7#3x+T2M>u!T@eDK^Wn=SqZA8n94o4K)2IdEBf z_soJBm(}C_SEopt*`^zPemrm8Ce@$qKK$Qb{N1|FJJh(_fjxYFUQX3|^S0Pvsl)Fy zeG{H*&-7ngFY-wIxiZe2G0X`J_K;qplbzkEvJ^R`Q-M_b)VG{I!#Hb=K9{ zKiuC=nepXEnEZUM)l$n=@7=5HoA0_#y6$|@+kbl_U!_FN-|?vAvh=x*n{_uxZw!O${1zDl?=M z*F_laP5S!bb5JRF)6Mh7T>C>jyuN(P+4Rz~|7G{Csy}%{r+2B+ zT6>M9-O}T)qBP&T?!LZ#RhgE~`nhcT)0Z9Y%A4oBY`e{MUhU{ziIv9J<+tb+9(}n? zUGr$xqD7_L;R~Pss(o~WE&k`#Wv_dVuk&15n>lf+#Kyn!_`S< z|E{v;>TmNV@GWfB3)`}*OlyseqG;XfxorDWmmKbT*Ir$vc=`9^m8brTwq9Oj)h;I%=DYsH z|1D8{OJcIKUb}g$`uN-Z!mF80zUL!DYHlsvxoJuDf}Fzs8ME%qo9WAN&zASw6t!a? zG*ZYy6} zp2USEYi}KvmVU&#PTXUwgivXZ!mN+poXd z@N#X&ySAsjcYeS8{J2fo=lzN5FIQBI+YX?9rf0>} z%2hWn?Fv!<%BA}AS5~{3^Ml?OaX)8w_*Xlw{2cXf?xFCq7e^NF5b(Wx*rIZ(w9on6 zMFkc&we90p_Dwvr?75DX-Md@W|H2Io_VT_>+<%9KFT|uZ_I<^!3(s${n(Vu}HHb@D z_7%_Br?Rh}&Yi<{|C(pJ{_7=&ufNobxVUfA%fI(-eC4k#yHn8ea^=?=pC6~Db9lzB zj$%SAF^~m`QK;5 zmLFffEy}Fo`1WA$Kiy@IdJmoNSn@_--=~FHl?jWkpI-J{=E>6ByPKz#)s>!mZd>Y` ze}4WmU;g(O4$r%1Uo^SqSB!O&^W5Lc26k4{mw)^8YRO^o9$7Fv3wZg{!S zcaP_x=rSwan-dn@>}`@hr!0OfD(IB!#WQYOZp;wOy*yd%y3nLM;XLt4WiyNy#Gcds zpSZ*P5{H@XbA#`f^>Wj7U+>!gXY#vH-}iTIZtS`BWUG_4mE(i{Z}o2~wUs}*7q~L$ z<=rfHsuFF!e0h~{P~y+d%nz?UGe0~&nfXEX+Xp|-_WyHd@tyW7J(#{SFXE=#-8t`a zE(h~#h1rQr`qMXIO6Ikv-?``Saq#%G{go1n&z>19AM4NZTz;utQ9sYd>&~7RE>e9n z3=5vQ9@4JQ&njfyXTRgo=J#K2ZHaLHz}@m>eytL!It53RoA-rXyC(ahE*`eAkZ z%EdRGg2K0G<*$0`dh2%bRu7w-k1j8|%#_2TJ5 zPyYWB{l~L>xz~y1c5L3g@^xFlEl%C_S*@-!-kcTSzU+LZ*l+6o)qB)pGTXMs#pU7dMvv)8_zt6ODqs=VAz zo;03)mpMDzd__{(!nnAM*-YO))vZ{}n_JhqcTaHahBfQBr(G#O-2V0M28*-2+Re+p zS0|T02=~9Gm2kOx?iRUw+KW8;{$G=@`N$eRdsbx4;(K)q=16~A<;xW}{qfiT^Ism7 z*{;1!q&TD-1Tl_0eTnWhc$cTyiAG3CYL3MRb)wzXMmk-arTt0KB<=unJ z%$MF>T)HgHx9Mo6_<>zfUlV-aPSM)C=fZ_&{_4wRUp=iAeDkz6=saup>)j8V+43Uh z$l0{ceb%jCKE2xca4}n6 z#FYcQ@=JCZ%>ti%y zgX+_2#i@4wvt`Zm=G}9w_}lH1D|=vG;zIfGjms`3DKptyr_JlXbZ*fdwXP?eTW+in z&b}NhzEwl@R+mq(?R|$2##?pYtkr{rWp!bhoKM)N#M{5lG1R}Far@#FmSx|oK64su zeagJy70dU93;niE7mwLkxh3x2@vpHT5}D2SOn=nYnwb|d>*YnUO$%P`y!`#uta(=Q zD)W{1d~#7d`MLG_fBUa3|2}N-@u>JzbCY*bz`mgJ$~vQ&a(oYEqd1h;3r_kUYIvbu zGq)&4^OHYk-h{qA)7x`*7G}jpr5xdzS=%(>$#oyS+x%wXk&HmGwx+9KC!Q1~dD{rutVWUKI*-37Z|Ci=64t7my%`p)SYsa5ldCom=~WaZq> zL*f70REasa+||ndUf|`eKfK?qW<34cK`CTXY+*Pmh$Uv zouY(7KqCb{PO{#i_`v#*Bp z`rln9@aE~miOKQvr0y(R@a@x`EdBhzE@`nPJ09K*;XhMe$u~Q$ExUf|yts>Na=x+% zZFUZJ=lcI*!*%!eQ!<%V2c0KwUARp4(DIsPbFVGhqr{c^U2rXT{zk_&2M#ZEuI5|4 zWueu|YK8q`t?%8QZ(}Z9ylvCgSH*{dGQK|gzU9UWA^*#hr$pX5cu8$PN5 zk2Tt}=M{4t|DqQD_r=Q5VPkeD;Cp!nA|zIwSEm-Kd-iyUthmzug{&%H;C=l_Ac4Pr<^Z0{5f*vLE4uu&e~>I0=eHQEE_(7~`t07lDX#>VeJ}gW zX|VRF%8!kHVmkH<8}sz@BW<_u@>Sf@z*=2tvBgsREbsfUS1*^Yzizm9{+X{reM&YC zkED>7?L?0K4O8d3b=$Fk0{{A#c@sY;UYgCi z;nR1$iC@2ME4$+{KQn#Vc0J3dPsJXeUiotG)UO6Ln#mO z7k~S7&$rasbr$=x9j2EL*H-PX4BEeXlRtm|lTAh}#Y?sred|1!@^g3S<;hd*ugbl= z_$2t+isg|WMtsg$CogAJfB0I#V9b}E^-O55T;P@it@1xq5BuozhlaF0?{(WBd+T@L z*UE<;znR2#|NK!gTP{eWe#O3fZ_z7Cq( zS@<&d<%UMP%jbN~>3LRL|8|^lDalFoa`o<`%pVGWwSI7(+x9A#Yay%7)T+v_cR&0S z+`H#yW}b%s=L0#@+23CdUN82`^72;$j>0GGHam`c$1V7Ga7F!;w0{Q8%T~%ot%(VJ z`o~RsS^Hj#_5a^^J$<=wot(~oXOB}{rIWX*d;_^ZB1*gBnovu~*+B@xgxZ&QHXWut(kGA28 zzmm;uKWC1RP0<-I#8XnsE0yLq)<{r0@7iSfE7D;7=t@N56YXVZOD z?t5unKlk>_$;~g5g^u+a8((>=ly-hk$mH0Tc5inkzTjDLJ6EW^ztMB)$o(%SZ2K;| z&Q;!4WUqW|b3xSA{fTC_&jbFY{%(6ZzeI2T-^l(AKJO>KWc~1JjZMU6o1R3!J;C|e z?Q0NPa$~)K0dueO8m_cpNJ??$~#Hy=hS4qiU-NsjtkbK+zW%1h+k9*tZehJ!KxZN+; z^5u$U-y`>K`;a?VDzo6t1Ef$d`LX?Fqi8Vli1qn;nUtRstR2`yino~b4SS4 z*w#rNmz_U!=<0v7S@Z1&-&^%)FL}Z8nomNP_u7c?O;0@3J@v(BrNE4jZAu-#Ycr2-Nw{1r_SAd#_Lv{JDa*?LOS1+TEoGQidy_X| zd*jF4w+xNGZ?_%Z)$?L~K)2EQZF8=CIQxdZKdb7!$!`8MvwDVU%Ssyl&z-eMR%h+y z)3fJ3Yy4Eg|KqZ)0rUUsPaB`^n6Px?Z-&~mI~$r`DsKN}yf~?9VXL*>Q}16LI~t@< zomH_=_q6Ue{Y)4lQuZ5{8T}JhW>wX%S|)yD|HjZ9|H=&~f+L;%X588HWY_iRd-WlgXJ33{ zSF!x3@`u7K^&flkx_0?8et+89Cv!M1E`yQ#+oytz&$1@AcQ#!(v-SD)wwJ;$iyybe z`tVCyEMD1qxPjmMb>|zwxTlK0I%YKeepOJqcqYqp8`c(;|4z;coYphsGU_`hD3<=!Xz z>S?7`Zt#IPIlf#!_sgFj*x6p+rrIlY^tIUgRX0w45xCzo?bU}#H(SLNR~Gx9vMT(n zt$xY<2v3a1;&q$0X58`%$jH;5b>q;N76IlbP7gz`%{0;q{qgTKqhU(ft_f2%xA^}% z8xomQ)p>CLj^t-|)>paZRH+769Xv7p!Vj(ohf|OIa9Xx~r!0%vmb>B+^KY|zX}t~H z%>0UJf_Sl)(fw1EB5~(t3ADW|ZA$$bbY$(BaR)>rYgyd}CDc{IJ}_nfJ2yCY;gU`(U1U)xj6j zxfAXkzsvBg^g^HZ?XG3l`4WPyIo9M$bF9hz%k41#h1xld4>6yAN7>!a`BSdHeU8Mm zm$fr)aZbDDeYH=<+GP6kuiFv9@386>eUtyN^R{NbNvS$o{LyRu_M>mZ+ANw-Kvk7%dW?n+TOSz zmJlr6;OhI>oF~-wmHGAmX4)s~te%qG zTGw)0kKf0$JU_NPs`>Ma!;iaSeb;Z;GJBVTf|RZL9lL-fHf!#g2xzOs)UNvcW|l%` zT}j@O?fow^ZLcRS^^iSenjF#I%I+d_<>&WTN0&{vh>N`P<;ctT-_3HXGAf+sIevc4 z`f1TShWbYfFTZ6lo5#0dAMb%#*90PFT1$uBIR0baDXF`UW{RnH$7fk;=3K6}&!~FE zB(_Ii|7vWeu@zr#l0H9gew#J3mXS^Li{i(9vA+BtwflrLUXziJQXvhIDy|1Ljj z@qV_Y|A8lKI2#Lm^8>5Yf2?qP^)N1OR-Hb7yV>%cHoNy*o&9W7TXtvT=9h{)B#xeP zd$0Uj>tz1LM~j*Au1tHf*EET-d)|jhcQO+6FLTE|T4NIU->q%NAL)%sW_w+Xc7}yL z+rcP2f3MiGGpCJnt8U!Z{#UO5;=f0}#D@xfjk&i)&Hi>Ap0k$W+7qV-+vlwOa`Gcf zll+(TsC(C6&0O=*e&2;6p;>V^Z1;Y@WPOmGHz-l@-qiF9r>k#IWn918X7z$nH{q!E z9m(aFKcBqLF@KY#*5Nr7&3i)Zv|eo&Pq=yUMXyz8R{pZ28C4~-MBk)V-TKDrGU<2M zZLyHrv^7VUO|Lj-UC*@VZ=yM9+HOzAr7vuMcZ+-Ye+%+`f2;l1f#CdaEthW2efZ$h z9fmhKtc~%T-tn*TJ0Vo}mHA)F=Sgb+GcEW1xjM)F!Ok_DjUGPvj#cUv`yE%^Iz794 zyN1k0N!u;H4}GVzFWYVWFm!r4?^*|^4O?HzdRZ;KWxV*(Cqz^69g)?;TLDI_TT~wQcqL_q@}6Uhw8mE9Ls3ZN;?a zEZdEzFP-MgCtrDDW%+pH7WL>Ud+e58ef+`a^vA~Mo77tFUY>pPPvVUCuUOtMUBXsf zDL13ly?0_RSN=|;gs#({zps8N*?-YXg(Z4+oPek1g}jO3!i%;pS-ftAc69*H#hryp zNe?6xPsY!PTd{z5XP)S!|A~qx{ndQzo+>^Jo)$f8@)2Y0wR#yFm%e1(U-9ti=}CJu zw4C2Q?D9P?_rz=_$9Ma3&OHX&_k;ZTecwMjUgf;Mz4~A&|F4uqx+7}i;GzH-EXs}g1ICU z_ob+Vho+d!nB8_;gzx(&t+P*e8b7#N@}0k`)PrN2`CjL}d#zji@8xJ3W^;8|Pfs|n zGTrW^$g=mAJiMK!zU`1awEWD*l0VbFMM|juI=j}nn@>7=);&RyX>%3Z9^bQ_Y}gf& zQ?>2EjBhs=-?MrD$C~N<>Aes4Z~n9>tt$L}JVUsjPJ^-g_eO5@zuf2KLOa#=5A3<%ChT! z6lc7C$I2aS%%_{MlH=Q_4<`)YJZ<&KUv-*!{gU)Ei>`V~Y%{l2$*9Rn+EyT4>5-N1 zzw`Vh1NFGy%2VT3#<9Ab=68?M&tLmt+Slc->MSSgx9@s>?$q?Ihus$|?reFnVdLJH zQ@07({TC{I*mw1Of<@Bh&HOukkL5_kT?&8u(suO|*Rx;N&4^%_?)QRKyic2BPW&bA zb8{=$=KMYoIibG%UUY2R^VnOJ75^-k^PkNt$SOt zZpX6Mm5)yOJ@3@Ee%|eEJ*8XQ+TpEsmD9h<>j!W6Eq*ZbnefAt(;h3E?R|MxzVYYF z+=N80tODa*X;q*BH^$Q?3EBE%Ph{rg3H8@Ebj@+kKMj!g)3i&_4G#u z&qKcmCN`H}j@;SCHhH&7{TflRrNX{G!ZrKC>zwC4UR=r>UXhnI@qgCWGoHpbZhdiz z-*ZZu%QG(VWISY@M4YaJ}SL?3dS!i{kwSu777JjO7=owLaWA{YyhJSKgia_|+HL z|KCkg`V)Wp%+`YXz_^;a0LVDS4OdSGLaUB{vt z0p{wa9Xr)Kq<1&&*rwgFFV->UD(jJ}a~~}6t~wBEyZ1xDJC=$)PgyE-s`qGKo_(!G z=*Min#>$sB4fIW8V-EuW_(z3d|NSJG0rPj&$QBi9ap5vajeYtCUYp@T0 zKJ&+Ee{){m+gosCS-QQ|lfFN;*2zkD?B01*B)Ku#eDbT4@zIyBuDbAOn@xt11;0_( zX9eF^oTYnhA3ixG7f|iMZ}Dx~JB7Sge2e1E1PMd5#6yMCUba5_c5LN&^SjEN zUcT@CSqkcB9h^EpExGMdo9punNy0uW)c^VvICfh;6j(0azHqtwzDbugm$lznGw<4_ z!=E~uC*Jt-#(lS#a{Su~#zpyM&uR-^&(MB&vHa7+gWEs7&8)g!%2?a&%Bqo=Tq>s zNt@NyZdVWevh=8QP{^#@s<@9IE z`K-8w^;)6>5I9t@oGfI-4dBEvJotc<89cz z;xz0W;`}LoBEu8sZeRjOOx^tg7Prj*?TY7)H zp`~hokm}`X=5|x#-v|C|X?qnjFHS#S?cC#~%kH};r)tm1sbW68PAIN&>&u15CVcQY zw`haUdx@{7l;><;l-i>FcH74WjZgNz+}lKtJ}qAr{wTuI|I0VmA2)x9>)sMjpC!jv zEOv7G(Ukjgv*+E_wA>ea?!?ZyQT^?FI~PCrB9{DM(LUFL?@x>$%$xq{QC3xwgSo)p z-G?{aF)RpwXCW~$mT7U3*P`qyUAcyznZDY&ZpXo+%^QxJo2urT^iF!aA*;%Dskr)? zFB6iUmK7dn4}C4xd7)>Ik=ohWnIET0yf`o7`Y(0aS%!8V)t{P}BDL z4&#SwOU}od*ljzq>Sg8WPggE`3VBZaALh*|)#`am{k~iGx|V!5@5`Q%wa2P=ggz7n zIq~Q5PV0Net7gAGctz#1Gn>D?>)WI5#dZC@=OyRdD{}e#%~DycB(GRrDsDmTxs0oS zc5T_uUNyJU`p%yRM-6`5lneOs-e$+ojd9a_)?duERd~BCZ-Si$zt#7>Y)h^!K6txK z<<7)tro+X@kDmGRr}x*PLn1asXBOX`Ilb=2mwUzLEiW_IS!cxLbgN#T&HL!urI4tU zI|qO6c<8-mZbQHGoPD3NeAe$-`jS=d7N^eUt5fIuF|@x`scd?=b8p2gIVsM>TD{CYC;`Jeak&bqgv=7juA_PcIh z8v4GMwQnmgZ(n1*+v(fe+6O(_`Av0i-?i4gec#r&yuamkkynC;A1BXQS@y$8DOKyY z&fs{z)U1`Y{oR>hUVVe>QyGneFPHC~Jgv;Ow|(u#tg0~oYyDzJpEhqf`%JA@f6hEP zscBh#R_oXMMfr!^-S$YL;6+65%FcW9Brj{vx_RQtbgs80bK^rUdukN)XlUJ)6TN(R zw)LKWM{}z97L~r9bn9)go89HDZ=19F`Fs6Czh%6bV#~JcSzlY+-FI#EUnQ2kdLvhU zz>;d zwdbblgVU1iM=c*G6uh(8p<5o)`P@l?xYW!e zpUr>#o>b!?GWD)^_ZHK8Gv~I1$0Z~^^egzkxJXR*l0eK`P0iU#_dcwZe7bqdj+TbK zq4W2gzw}7!s>##XMFq2VKE5;K$i?NECp+I3x&4cuZpQDlJnS*w%=qVbF0Oj{^@JRA z<;~=U3e`GuCfc%{J0r>ayhMugdHH^6y))8W;?M8%P5&anH@#ejv-WmR>+9lU2YYX- zUa;TIl6Ovyow@j!W8k}p56}8qAKlq#XtK96%RfIcD*ML*$6pI)Uo6b{EL`ra;eU2V zVVReg$h&lJhKiIa{{K!)iL96!e&p(9p~8pj?RIqK{ZOAMZE^1C1I8;mSPu#OQPcn4 zQSmR}^;e&5HJdAxKKyL&dMNKM7VPsQ?*F6?|6PIk>jJ7)*_uZ^3slXX{jipE&iTbW z(>AyG-;=zvL$2(sr?oH((hzMEmEp>E>@JU zuGzWxVf@a;57*qeSde#4VuwPyPRtZrKE2a&?BOZ>t*bX3KV-Ty`QffR8w;G@MZB19 zEtYpmmYccg_^M^NY0292X@&pp-kJm1h2^8HyF}Q zM~{C+h8N~LcYA5r)n`8p-o~=ur|ownPi@>ci*KI~$=DUGPVN?re7nhgO2Yc}(XTl( zsu*K0XPdH}%Qt1y%Q9ut%Qa=wJ1@%|{;aQc-`Zn`O4mM0uR6cw$mtaMrs=cqGjm_M zb@2Gt;0J$2%ym3JAK3K8N9NX^vanUZ&zw42s?nTgB5wDTx%8#|x2hNNNlWcdeR^=I z`e{*AkM03hi5=&C-p+k-W&fln4Y#-_Kbg8H;M{W8mrcbwllFH{_+!0lF89%hB-^g1 z&vj$h&C1|K{Z>}&EjO*4_2K(2m#i1tzW>1;nL5FRso`M`wjUz*N(b(nEH*h| z%O3L!_g#NX=}kNzyy)RWr+H5Q&9^ulTUc^V!}8~sY069bEElUk-(D;5DXM?_(wDYV zZ8_(imtrn@wseERTIHIc^>#J09yO+}l$$Ys(!W2uHRsLFxIM@F!zsBpTRl%XeT}yI zH<8b(=-#Rr>p7Cb6Rq}7e!GmOO)N;>B+~2P}U!DER_h4IB_egz}{}QEgXX`QyHKtW_ ztl#95>-}Q0hxo39-%e`%?vL);DDTlv=qY|N#ae5z_qi3jtDp4Dt96_0S>X1Xlhb_f z@#wzxg*s-JzIll$_nL(9KPAMF1c^zbs9+?>GFBn(3`_|{fOBUD8{^#;TWc~*&*DqJME%n$LTJd)~_xwK_t@xL#rOk<- zT$p-i^D7y-Z$)Q|yd#qpHIE*O{x)UWjtzglZ+-fC(*Mw}W<{Qvi~bgg^e7l+d_A@> z+4G%t%_onqS?Ygs5^S#SZU1+^HGF66k5g=y#iN}*iF2RqfB*3MtLYp)`seOH{OUew zze~kb?kj%_waR+lFVvr6>k_y#d@sw**YQ;^xK*~XxA*S-wB6}bzrdtB{&zmOF-LJt zb}2b8cT-P4{mY7`If41}@BXs0Sbx^VV*Aw_J7(W&ww(On-yQdd`_JaFA1$tX(EKHD z!>=n<8`k9An%Dn&nf<@S+V5|D#1g?^mupW>cJa zZpL!`v$9{^?_U#sc-)JkK97?p!T<)$G+Zl&%Xn=dDs7b(H`tKd)LPukC*+aa=IJ7 z-~M87=7}R^)At(j95yg*Kj*Zn)c4v8>GkI&t)CvdV|dEfGWj&ylOA1duB?J@8BgD> z*=;8=(=_Mgj5Ue!_iul?SE(G;H>cMB+>TAv(S7>Wi)QBk`Xn54dAm%s_sz01h5pR~ zq0e62cmdkSf1JT-hhs;Yf=jT#BD24i;QjMFB$3HXMKY0-VtEfo99=iR-Q$($$@fMN zla#gzT6{`0)+Q@m@QzIC0r$Lq(Ge%Fg{ zl;0I?Hf(;Xqo`TWHUE?3--&BArfhBrUnwwYPuPzqs$Y(8V|s7rPJ)XEG!UV7E1NPiHD+p{GsD2&7NU+m;h%c~Z?Rm@3~nzSk8$CIh;ud7WorCa># z`u5H7RI6Ef_lk6Ldo9bM>Q)IF&0 zSYFdnde5ysMZ2bGUsbXBJrTW=(l7dRTf;5G|Nhom$M8@)Uf@r7ZSa93)z5_l;+FFN zov1tEiGGX9`hfiOUl&>vIYyKF3K{C3*R$Zr0gNS=9%L9O?_E8qR& zX<4GPL_d8}t6g`W_#`6-k56e2zs9SpJY66WQ6~P^^mc&G{FQ3_p8p#EotVb+p)1D4#gpu=3;)Fbn!W9y`uxSS zjAzYLVRu<*)cfz0V$G-XSwZWngexC?)STZDecv_shBkO-e0jKgd_b${+7|zRZl*b& z{{kvbe|m9RxXV9IKQF!`-YQS1S<6a(mHE{Cuzeceo?n=5e9~#-9p@iY_P40iYqEu! z1njr;{^a#5dt0Ng{J`J7K0le!^?2rCyeZ^V!+Z6H4+%NZi>*oYq__86cSu5(Iye#YQ zFF`X`EZDnn-zVcEwpr!>)D07&cJ0WP{P$mWo76N5A+xZq(q;q-J#l=blsfc&&yWB7A`f2Z? z9WuiAZhyI+%Q!pk&Bom?JukoJ^qi-_wz9A`?yvd$|6GO{V&|OCE!>~Sec{WM^J_n~ zTGW5zJf!_T{Q2~nPuyR^b2F#plYTgxr`@kU%)VZ~|E=A2#mk2+PY6u z({^T^cl@k?8()(8=lY)4zQ1N>%YW;Ky06#Qra8~Q{pt3WhgFsf*1cef=3N_VYAcg8 zIn7QXZ}xJ@`Rjdt*W6gU+`QtKrju5+)7z<4e^0M|`SRtFJ8JKnccn6ZFZos7ZN2z92v=@qIe z`f3q_&B6xX^ENqE7n!T`?JDaE;#bCeHP+U4nv~x8C{m$Kry*-{v5ldT?UC2_mwtQq zp@GAOPvHN%Hz`#XkD3jS#(lZSnHQ<;EP}mHg*zO4W`{7o)fNymb|y8t+(N!*STbzUZHkvh4m8E2p4&S0>Fen)&aCzziLg|01QL>U^rAr}BPjb29q+ z+lmMM^W~W_SC1{kWWCb+H)7j7%T~QydE3dXqfvD4)q8Sl^||={?QU_(emu5r+4ITr zS9+Z5X8wC2@MB-~X|+|yCp~;FCZ2es@s$t%!NV&)N;sI<@17aQVPgB|x3-S8v&gh< zLH&jyjmcN^ODBEGDu_y%{^8{I3)9s_O8ws33f$}JcDZ=QE%YB-{~7tRljS}l2YmM) zo}N+txj;CxbivD&lixhmec3O>BxkW!wZHa|w!U!O(_-1${Mr1v$0FXod>B;qGy37w z%vk4No~Cxz0#*f5{iil@-`gbJqLLrj-dU*aTbi(^&|=*RruI!j_b(q{UVgRt($x7c z`n4VgPg|`WaCM>IY*~xm_)~lSRlc&^`^sS9p3sWZ>w?a&)X}o`xBVjhT&b|dBS`Oh zT*~A)xu&njT%9Lwl#BiHifKQi}?x_Da|39E!8J6mM}UR&gnQY7uzbDiG<^!K3IB`-`cqQ^~}>xNjQ=uNwOogX7$a=LDU6 zgq-%Mw)_a;*yySr7s9A`WW7^Id8@#A4#g!2O(}19>oRw`a(v8JJffp`#NVmouhskY z^R{s+PUBFF6LPwv+OorgBXG7|L!ys^eYVCiCX*SawhQtUj~FN(iBUXaH}^)w#q&-b z&zs#&-Dv*YA~3m`&HcXqYAc178OkjZa&J^`wf=v3<*LW@OH4VZ^yco8ei;+h;Jfgv z8z@VzS;@H9i^DKjU2Nl}BE=)kP94{_DEXXmWUlhy*ckM@wsYx*?;W-WT!dG?jCJDP zpgD2Yyx@H`m#P*^a9>EcwxuCSC~A#xbH%Hd4`dXDqovr}XJ`I-yf)RTV|K>VM;=R- zl^g0FSmu&dm42Bihik2Q*G2~3G+$1Qy4%O|?`?V8Da6<6yI^X{BDQmZOme!hM%c?N^*Q>t5>? zhS{5(m%nqfnk<$OoUu0$R7y=YU9h*Q+dU)t?V9vVUjD~IL1euCe8USDK0bYHqu;F0lM3oFo?Fpx32*YMhPL))j*rtrcQB;w6?k;|!9MGlh9-9Y2fsg679?BM z_KGgle5h%#Q7P#1;mSbu4Y45SHX}J#b3yovEoavhEdC|!)Umr&;BV992NgV#e;=Hb zuJ8#hS3L66sl(B!<9Cziq-n`vJ0j;Dr z(HOCO37l)zy4wGd!L@$RYhL;y?RO=5PnSFrURO}Jj#t-!Z3%1j%P&74a`5XNpO<6O zdF9KTqL}a{%i6Vf&1Hb3yk(b}yQDKSs}Bjz3eegAF}Q&5)SFFJF}KcTIG;5miy*W^9!!Dh@~`o_@38H583q6FwwF3<&%a-N9=RGEp|;4 z6G>n8;)MuxXpPcvX^_A6D4;MbUsC4OP-g24iqUU0#yLb7nZ*yvX zd8Ogo^-On*L%pxd4x9;4pLaPjIC80Q|EreUoNpNNN)Iw0%lx}an6J~Fc@NLbX}K!P zXWW}_RcbCYJC3)N?ea=S)6MF7f}gG2{wxeW{%XpLxGW`&OP$W8Rg=XgC9u7|veD|{ zwdolLmM!muSa+o1k)h`n-m9Gb-#1CmEqN6=SL}jQ7Q;lf+z>I{BWw>k^|s7&J2Z99 zMTYmE7pF>})LbV1a=M$@UMVi#Wx~u^X&D=2b&sgoEC{~-DrEArZv}y@x%H(|-rO5G z)A~+yA3MvCQ#I?xmn;pF8GhUvafdu#$It!HVPGx%@}-jg1*S`0{E%hQVBs3m)MI9tKPbKEQir%Rje6 zlRYQRO!k%0u$dy36s#nhw`Z!DfZ~p;t=26!NX@;-nq?k|Gsfr+ehtp2e5h zlxg8`zC-v0dwlKd_T=I3jUzpyEqdWbg=79pYVz=$u-4me^!};R0 z)mO7g!u%O_ZX6%C`$hMZaOtXecBD)^2Ap-Wy+LCS6{=@Ir!>>Vk>$ z_GYMhs!Z~DpXhz8($;46q-~cyD&pr{?kG92QC?Sp$?lToc@ICsy`=~raxxxe<=S%2 z?Up-tfk4GQrQH6Bb8akN+vgF!>5)dm~i$#;BsYXLbEK%?e>-<&7^@#iH^>K&?@AmXaR7xxHWFqZ*nI z-MWxYy!&zO{*<)-K?6$4um{no;yPll-b>uzjK57M{&VKIfL9%<9wxqM|CFZ z6?rUdwV3nQD%T{4If@~e)6CX4r^-}B%152W>c3wZTI@&keLVamzh$qo9mG zW0qfSZ_3vbYSspE%VXUR-R79o>Y?AewMsA5_kr!)9U%X;U)Q?`OOu)38y?xIM#U@F zdUF>j94@_;y2Lz_kx%W?;u~>GSq(xHE?*dap;%)QA9wc;? z-bzk^VP;#LL6EARE?E>L*>a?5Ft&zX#T&kW~&lg!l7ZCH7TY3>fmPG9|v&^qas z?ShGNr=LE#9O3lkO6K&51)f!#8V*n0QtKw=$(^vOA-*f)PR|pO%ZF`eZGpw*E!zdI zR$onpzKP5^mumIaD9GsU>f_7AYvCFDtz5u*zuMj@Jj=vic7>YR9_y&IDm0!H?8AS4 z?oxO;`i?R6^6I#psvg0USylUAUAgN4Ndddrr}(a~+W6AY?abBA*%NPk5#okcId_>) zEeqd!frHXs z53@VL8A`U-jb`oY3VWsjQfRZG@fbMh=OYTmyUbN{{c3x^2Q>b!b|9qD*IyV?KfPnjT^$^+T~^?q-Lm)~2e9WIx?%3gAH3j@26BgjGJ9p^chm9IOO-7Au(zg=zenq}Yj!j+de zIedS8s#g4YR~qm>$K{pR+DOc#4# zP_Sdtwv!&=7r@S1zw=yn@0K3110jwVJ7FSq# z7m>=E7p_*NWd@u&wObiw9icQfS5GmW6(EdrJa13Uzdk zDB3K!ET?Si$?d_!2D0GcyWlk|r@TCJ29(*?m%^*zV5VJu%kR0pa^WuEnD}nxqzpz+ zhb7K?EVe&3QQG@%d54$)7Fa|!~_^8zWcprl2}4;*vl(-JuH%* zus|E`bA>Mav-)Z#H1EJWle{aL?GrypEK5)Fy@ z=`Xfyw=!MOdSl9TP&Xzh%Av(&my*PCp*MWzZeFgE=Df~g!5UQ#shn6#I{fbTwk$7| zap&HsdDQBw`J~DJI?e`ob8HM=e%I~LlXomiww_PSK!#)q%)iW(bHW$o<+vrUMKbP! zyDxJ^0(@F-m%PeXnWJ9J#0|2ub4!DY$|Y8biVd6YW-bqY|LRJYn2@4{yvOM^eqS>b z&6wW@E-5v;#Jq(;+WB=KI5xI4xb5nHYp!_2aErj~!mWOLR}0IXne!%L)AG0L{L13< z{_pUc+uJh#e#VDxzngBGekV;cwJJ5cWQtRkNAsBIsz{P>sB1k zP&89;Uq0{Z$#=@OB2o3=7+KC{a;a5bLtj_r;GPA+$6uMu5es7OC`r|ROV814+SpTZusC+X4LY6men@dT03S#ilU)dT~Wt#`2>>8N!%qhKheGx&9Wfyt%uDE51vw^|q**ClJUGHTtfYZhXp=x;!pR=P9sBe61gdO?euq<7ub$~22Z zl_x7M-#9XJi(;$~cQMBnS#W%x6u97CdP`(oL40_5RKk>lso(8i*;vO|e(g6Gn<4wm z<>)ORrz_%4KG!SjETSB^yBS-p&Vv@0ztG%rK%&vT_wUl+_JS6-mmwL^0pPy8>Vo)J zTeOAlx^wq1RS505c`w#u$Ai|DJu?%}O(@vBd$yQ_>xVS{H#09kZ(CjQR(-3G^PaB{ zg`yHfEU!M%I;;G8x*KG4poz+!uM`pid-&mJ}v`|gn7;EmJUe#16-mgn0GTeWKEhW0M(E!Nl)3kgDr0GYTWmsK*X=PJyZ zo#QKgL`L*Yq|T+z#lc_1as!w;T0b6*F2C$%DRIjTl;qE(@Mc`s;H^IzTqF~IOjX!I zCvu^%|L)U%=}wD2%3fHxSh%G?QD=hbI!kG(Zi@`Q+X?S#SYp2Ny zgDY?Qe+Ze9k*mHz>CN7FXYJ`rE^LG7y3+9ID>)z*$d+PGI)MPEc z-kXEjn?IgvEUgM&v43Z`2so8+{9F6r=8hlVn~xt)WqW@j z`OCu5*@V#@ya_P4h9AW22WQ%mvv4F FO#n*LaV-D< literal 0 HcmV?d00001 diff --git a/src/webui/service/static/topology_icons/oran-du.png b/src/webui/service/static/topology_icons/oran-du.png new file mode 100644 index 0000000000000000000000000000000000000000..d486305cf02b0fe1ed6c92f38ce1cb21887cd3bc GIT binary patch literal 26185 zcmeAS@N?(olHy`uVBq!ia0y~yVBE*Rz}U;d#=yXkmn`y%fq{XsILO_JVcj{ImkbOH zEa{HEjtmSN`?>!lvNA9*a29w(7Besy9ROiQjg+X{3=FCFJY5_^D&pSGWv>Yd{dRo) zx&=v$m(ql)yq(_bvh2?OxqDjZm91->jPe;=#d5w}ShIR{_CdXlsk18e8C_UhGQY)z zEiGT#@x|=p)9gf-mFRhvP@9Da{f2r%t*q`m5b>Pt#Ob}-yV&;SmF)iC?RNO@eA9|oFHW%)_pe>?{prS~k@IE#9{Boh zqwBhr?cz&%t$yXrdj4R}mDT)NTi4q~#Qc6$yE*&+-wW1Ttr$BdzbKVxOO#Mk{84}2 z^7V&h*Y^I2j*fc~e|?krnzQ@<-*`1Acf)Gc1NoK=vo|xEnXpG(=6UdZ8H2qE+mBU> z2hzVX+O1^YV8oqJsdk`9{J^G?hW;Q%I}gT)2=;_PSqqE5J?Fpguf4UF{hr0wKg{dr z|GLhc-?hwytu0Zaty43j?BCnByMNZdzj5?`_3P@soUB?FzAel*ZnGs+XE&7YWZ0j= z{Aa!80sgZG{^tsRsK3kdC*FkZe>(5M|AovJ+xFPWL`U)W)lJ}Z7vK5t#Ba%hlsYMy zd9#_?yf_xF7i`%q5pXAxC*XEx9z?SbuUIcQCKTmc_N%|L2wE{@H!&E^oUPv&?Ij4eOZ?Y}>{#JBm3c zgL8wKctR=P0exMDx-7nb?`O01tlyYeGk==#zWz<8B;&1QD)o8!&U-f=URwHKLf5f! zF_}4)Y%&$g#bhd8hupB=y6pcA>E#T2N`(%XFjmhKKmX6r)8y{=O(zy@H1cuM(6WlG z@P5_VbW^uAd~ZZW?dcYGTP3zBO)uiP4y}GGB=Ziv1h^%1Zw%FMYK{dhUMi0}szJSX(pYP4{cwdwxDw^}Mx=^>$yy|4$U>Wxn%!PejEF*Nam3 zL^4hOEqTfpKP@h2&(Yqc;>RpA-rf8nHi_@)W~oEQzt=l`tW{{MVR>|pRe_C#S3%*= zf9B_n5?|~(>T5X;Exx--{F0KzOta@4Tp`n6nD1U5u;uEnzdSYO1^Z_e?q`11u;a6> zK=bqljVpH3ZoTLho3AADHE3Z*yu^2-^>^N{z4GJzZn0*KFK-3A!fLa8OP$R3*jq3E z`MqR^!~*F96VEZ!m)NYEE6cELyM11bH1o0TYT^&B=N$e~mlJmJhn;!P`xl?s3cfT~ z6{IAJ$yDhJfAcRt_$^THhTSFB{rv?8-ye?oaJyFW!|lD28*($)a-<)%0qmwyryU*pUx2v7>|G<*TjLYWq{Quv5ce2a5bK)+!Rra2TbB~rD(G5N? z(6!C;zw(hsTD#vxu{d3vCo*s6*&_>fzFhQvOUcFbU-2*2TFR|A3%axSj>fmDhy2dv zd$^Nc7zr?Y=`T9#$^Wfy&nvdS-?P7@Idk&{1l9}H{yOn<_wjiv7rnbsuWs_~lTqD% z_oHX8K1f`*i{a1=$CvkSzT|3H$G~nCYO=@ZaW?;l>gtBIxr}D>Z~RcOxbibK+2Wh0 zv&F78jBnW&+?3xv9M z`O05fQ)90#R>!vIR@SX4A{AS&A6?KoHQ6kbvxBLWKewq+OXI!%H>s zoLvWbXXh6jTvk`Q?RR>Y+m|@m&PDHR|NT?(Z2A89qQjTZl`q~}F{OUfb^5s0yldyl zzmbA`+|^gwkF4Ds{4#Y3b9ME^KC1`sV=nS>_M7#Z%{JKcYIfDX%ry&_tZ;W(_$$BG zN%*nPpZXFRmgB2lJe_*|o3La&-+^5@76$7L-_-4sdsC;z{jWkxTk+WTjs4PQaj)BY zukYZ?ds}|&`hL?ywvTW9Hhj$8b&L1)`l6rL<0tN%eQ&pM!{jf^PkXdY zougE{ZLuB8w>dA2_o|(3m{QU8Ua)K1=}RfoR<#(j+wPNhvA=KmrRdUw!1}Hav1$|V zeUA2@-EVEaf1ajDY2%LMeV#p`9vAyIezfdcG`ar%jgOu;E(<1{=TzG`W96A21#aol z$w{ZTg%vDVV)$n6C5CT%LgdTr)%!o@?zzP)y{_c&vi+%tcAdUsUH5LGhU60kLT4MMXuRqc{3hhYU0o~pR;|i1GvLbIz^~t$jIRBZ73=z?U)8x| zQHD6z`fpn|)*Mth7m)P0SnMqK`L+LF>(9MsvuW{S`EOAMwjn=FYb?&}+{-JYk;_ya zw|4#Pd-L_LwBJ2{I=x1E-HDd7)6);_^1gGsZlB3gyR)5pLWCbXFZ{Vsk{)azNj-`Oa9Ftljbbcf0ll}YJGeD z=UM0KZlovWgmU)sr4Q^Y7`lMSFAhEZ=mIp@~bcB7DofFPnlA!u!|zsO~U6 zCH}>zaB=-dRj0t4KPJsQIazvc*>~@~_kaC)op-IxTw5YOLG$psZv_Q)!8d+KF}q9N z|K)vW!`n$Z5#^50Ud{h}_oa#Zr@*s4{H@OOTH+__hrmaga2 z;XG3^^~{f4b32pYmI_?y@e?QX^4|C{Y5IeUcFN11*l+%_InTZS-7A(2w~t&oB&Zkn zf3dPm%mtBeez^}k9!Hl4s{N@e6kB6^{OjXs^Ym&rXIEbT?V4G0!}y^1_Y!we?L+gA zA3Yu+qcrzeUTFD??z_`3<*3NqS$K5y+YO~b+@jASHUIf(YsT*L_^OSK;#h&rLcJ zv)}(Js_marRkd!3$$pI<|N8i4xx!smp%vcqgyv03SGrK&8a`WfνcKlTaTOWObA zx{yG#c=(mrUm<@^8M6_WG?CWphe=JJooKc)S3TG{_n%(?+SSCUv#~7`}S4AKl`_|{mnORsLi*!{o`8f z1kUX9rN7JPPUp=2Y!tTc<-0u3$?EKZ67%mB2kgJ3p8RF*>~-&L@3@XR}9n|*bMR^N+LyOR?c`2Koz>yGvnv3s2sUl)&P);u|3{vy4;j90ruAIiwUL*<;h^*sT8g;{W}dmG1YV=du6ZR?1bscizl@Z&=u$ zn>PN<#CW5w||B{_tzv;zX4x5mNK*oE}E6 z%5RX>zwu+zd@0)yo=0)7LeO#Yyy|nbuoRg+cB-eh-od3$5`RHV)P{FSEnaLgo zr<6LmZ;Rg7s_Oh9H0R2qIw6T?TedY=D=iLTo*kauAJUZ)x9Z)f*&A(cefQ54pBs11^UlsMKe#M9cEd}z>|@)P zO+WqLeZ5b_ZPny+tJY=SH0kd=+IXyej`dHIg&FH#9Bn+7>U!gI;FbBAp9|e*{w;qP zdOdR9l|?J+9tM7QPpPw5@+wfAvwxZW1W(5`z5KlY--#;NEUo-<$*{3ke`iH%-TBvQ z=ijqV_WJa2_xoLkCdvx#yM1{6&6|vT>(8_?8%y0vui=+Ew*9l9_?wy&tk!B$&p+nw zR+QZqH;*q`-@9FRy2Py-KdYQq6WF9@FFSawjq&0C{ONqNtI`fE`@{3NzIxf=W1o$B z^-i@*F=}G%Qu0mg{f}6tW>nQ4+qKX1(XLF* zEkAcG`cb#-Pu}^6p8dfhzuaCf-*9<-`(o?+$Ia#~eW=niLpr|TwOMIffY_0LIlgB5 zo;_EyOaPal=s2v8Tj*4=fh!AeuqY|b1m>3>23|LXs2e{j9o%39Q{>|8^yt#Lx~ zdY&5`Fc+zWUa(ug7Fg89sTL@Ys3Jt%`*!*pE3tYewEvwPn`bz>A~CYzqjnQSgCsH-n~A)f+wGI?tWQhxX;!$bbKF&o}Z38`mowpJB2yVB!idP?%q%9R@o@3Tr*?MgU2b>;@Sv-&L` z*S>u9>Hke#?rU3$eQ(~}l9%)U!J%UhkF{&OlB=C))Ta(+kUfqr7g0ruFlvxQo(p)%yH# z8fTk(v#p!u&8IC}Ce~NRe(&wxV0peXU1xrLvz^V_u735f-2Hs(e{+8x>^mOopXasu zZsyt*yNl+o*qs#I8}egqnpDmbwzT#OEEgFzmd|+J^wlArd@Sx1|Ma@O&rhzAZvMzxKG87wuBK-G`t=h(DS!L3E#UH|U?tIO zrG*D~eP%v(efOr1YxCc?g|0RF_s7!ua7C2AMxVJI^ZH!}H&wDs4S1{_my|Orcj*oG zebeDH+r!}IR1W&aE{vtO@UZoFPoKKf{e|Cw9C zuWB~$b9+@~vT_Db{USfF*3z{`39{?%8yoI3eS2ra;#jpcrwaFaJnpv7so^x;=W*|? z>kO)e7hc^vNo<;BgXUR(Omg;#q1=E_{h z>sKOAR~?A%u6lLM{O4VpAAe>aFk;KfddN{-lTl-_aw*s2+ux&@e|(-=#lGSA_V29U zQxDEqG*fivLbq4nUuQ3q>zw&>?i{YyvzH#eHSgK6?Mv56hoz_2?AW$&;|klt4Ifp{ z{K%Vq)mh_K+3D;LO_j@E?7scupX9~&mnE$J#)+KU)nFzaE|gf4+WqsYpvjySiI0oT zHcu-#^=0jg(6pNM`)0G(=e>-%c|qsJjag;|0=)VyAK%Wt#qiBHlc9QfN-vY{X0cvv zDYHLI&n=eDT9V_sxT}+K-W;yiMNH4GFJAOEqh-r3Y7~Nk)g6dhVZmOxS+XfgiuJ{khj~vtQJ-Qa>U5d)L2xKji$MT#OTo z`??{und|tRDj)0EimmoK&kvtq?P$8Gm1~sel2v12x!mDzP{o$UY2^nr^=m&DU)>k1 zedEWR?)=QSYkSUDA3ghH!4Aa(U)=I$$lbrpWA<<9x%=0yd;HAY-Me@HSJU9c+_NST zp~k#n+fOu@#`a0yeA{Y%^VTx80{+tJFu&R^o^>64!L z?bL<_v2$FxH67u9l^4yCc>l|8+1aDL9=-hPe?)%W6K3|7X1%8Brj{&iap!-D39qiw zjURJPetK%__g(kxt^Hpn|M>F5A)BQ-K7WSi;|})Atv^mDDf-&d+%dbUyGQU_ORwVj)Ga4>2=smw{b6_E_5tN~8`XTbKj*~PuYbPw zNucryjlP_u$Hi)&?OsmW{9<>Ufpy!la*te&>h!DDWe?uE^}hTn>^f0EJ%7c_Pj4P- zoLRqSdwG@ApY>r-=*W+t5bmQy+bG!OJ zH>rua_k8fD_=PLtT|=&%K7C`s&mY_3H?oP(5MLqur8L=O+Nve`2G_lglwS5*es-R~ zQFC97SBkIQ7R`Pm`0#7ymXkA*r+<8z`}3S(+QC^h^%h1&c8i^6hb2BPRx7rDS@f=H z{af>W$=Qg`#moa4W>ckO<*?!~8Dd(KzQlDa=}uAsc#>-OBY3IEryRe#Uo72Z?q z>G6gCm)gY0?AqQb$NM7<_LrJ^=D+VL`SI&a$&Wv0cz&!|$6c54rpZ)SHm~NOa&BJL z<$Y`CeUOcKI45UehV$3V-*LI~KCCKk4Ub)B-?;du+oyZ0nnL#5H6C33SL@f2A2w!Q zDy$bQIurXpWF%)4hd#P$=33`lI$I*(&P+4O;5R0AcTOG)o}aI-Bq^P zH&OH!pSYRbbHnGC{c@kz-1+Kp^3=O!$F|oxx3~+vea&)w+t&E{2Vc+Zzm$E-tsr`f z?xE6Szob_Bx7_|5U7aPh#!8pB&d!#%jzi*pc>1!#>FG-kcNxci@U<0RlUsV{N7&W! zv-~laeg&t7xFpsb6h5#wYUMrYz%7{RVZ=s^jNP<(ofmE~ECja}DQ> zV?TIvCl{So+k1Ta$D7|v@ASUdn(Qxfto=|^*Rhtgq;4j)be{8(_2Obtb+%!(PTl$i ztJ;q`iD_2E$=!>8I%8G9gFQB`)s`0~ZLQd7zHY^TZk^j3)E<{_=r)rKPD-rtSh#E5 zrSmP?HcuqvKZty-TWrWZUlJ56`IY^C-gRe~b6ry(AHFPkZ^nJ$Z|+5M_Z$5l+`qc; zliF^+2hBaFZ>?K-TiERCir|wUPE}Q#2A{5~KA7nD=51|V7+X!zHtuQH%MM-=5wE#> zfHgaMM?$Qy_?lJIH+~K;pY?U&niZXwe#j_aeep7p@$-*&n?m+1VpZQ-adowlR^74P z+jeUCHRe`V;&4^4Y*YlFD;VpmLMv!64O?><{q_58VW z8Rf5^Ye+4P`QVrogAiNO}Pl|@RuT_(r$Jbc5v<>U-O?Z?i0Ue*3$ zyEk!5|Dl+QE9;rowtjzb1nfw=$1LAC)OJ|h_z{=&vA}%mO_m>9^73y~osyi|v;NVN zX(pF$pKcJ{YW!gFF1?7Dw|5)jAzl~!--mR?kxCGCvb1l z>6dqpw>FgrA9=v9bv$fo!Hmz!0&;ITZ!Jmvus2iXz311j&9~|q=cOK)E7dZaC%5jgX?vdDuU%nN* zy_aON@4(N3z+-tj{5Qn{54tNKn%~X7(bP`4J?^dMW1S-$>zbXMKdsQte7tPKN6Y?# zp7$#s)!c~X?S0?7>~Uh$sM!rpOJ}dHAq%FADQ+Ed_!0lGPZF*W7bIc&Ui~F8` z>ESyf<~qf@6JmqKbFv<^#Ty%+`9DMCD{n2Mu~^9;=1p3Eb{_ODIPpfk@N~$hI&ID# z{%$$G$1mHK|I^xYOX=ZPThU$1rPXbst{<4?xcXCfeQk$x_T!An*EnaWt!wYeNL#sX z@u9`BtJn8-t8O&i_xM4PSTZx)YokZjI#VurXKtRF@VHp+p~U^oS^7Vo{a$x$Q(M7V z{@(ZfeDN1vTQ**w<@Y8@;=V=2>X#K2%U@dDhdlz_sx37#@9qyXvx0-G&h&IiGk>4?PyC_gUX3orRgaDCW&hE%+4oU& z-NTT_hkqYTTBN@yy#88s`Ht?Mpv(vZ!?t#b$x-wASGuP^n*|rI*sL6N zP2kD`R)urDg^GQ%KdxN=Dy{E*LuT|tj^rat%~>}`xBcna2#J8!OK~4AY^k}iZ>8~p z`D$wE%l7X2nET;bvGw;o6uD!O& zL8sX*&dhw(_C4sXf%;WeZ{xcg_O0Z;_HuG`(7p8qhIdls=Kp#r@3O?`-w(6!9c{tA z=Oeo+^TFW(A+x-Z@? zKD;|KPs6kHush@9=wN&1y3*y-LUt@L+FRyg{LxP(+4sgRuInAQelWT3NZ?nU@$<)x3EqefzhWoISIjou@Q&x~-Z>8nmYdl=ni0^I-?byR@QJtf zDkZ&R;e7qOY*q=1?maG%bWB@%{%4NsKMHmfKZ^djp)fbS!4?$uf9D?9zd89&*|F`7 z;j_fI&bpKH=G69C{%aCyjA!+=#`~9tzIYp2vpxOGw`oguFz>Y$KjU56IPF;*|7M=Y z(V_Z}Ppn@z#at_9!~FL;wN6edtp|L5T`Bpxnd^GTsUKf<@V(4Fvga0C?ZU5|OLH%; zZ#KM<*p#vC$Gy$>*O)!(ySY;Iy(iPJ)#4qy!zK1INmYj)I-Fqp>c30kN7XGiR~%Hd zt8Mab`FXs&<;Tt*(T`^PoWA-#eyH1&&DJ{qFym3)jLTLzHRqD=Ew{C*m00%C)@rT! zpI_e7PqCFNy?xE{Pgb^W$@M8SuSbc*npi(KoN+5BM)mP;lcnZ=LbPM=&(pD3+4}8U z)8wdozQqUUn24{)%!`=xw2k-JIo;WHC(mdsxqjtfFw3Hw*#h-`@84$b?{Jzrr$w;! zg6Z=6^mFPycZ5tK_lgE9CA!S@u|O&dk3Vs*h){ z+y8nthy9#~>vkmUEn{1=Vlt!m*L!mNZWpswRp)8=mOB^Dk`_zfl~^onz9w_R#+EpL z_xp))yM6RIc15np2oe+dQRn*Gx8ln2%+G<+@k@>iX&x2+diVd=ZAuy?Pg`5v@6TMi z#CETb(}CD9n^z4T?IIuJ*62*y#`W!&QZH|7TVJ+UvSUoIK7(JtLEjaNB|lv;-*ipt z(z2UBWKP_fn)`Zs&7GAc@0QyhGTP_9{Q2SR;?D`EcNwVd`g2q8&+XgqzvO49KCbS$ z@yV-uQMX@8jq&WB_V?#YW`Fy3NG_{$@YViX zRD0=ZKKH&=H3DmAezdhSmOr-lqIBJ#job(3@l8FuZj#l3i@9sVFTOr?V#%`d^gXw> zyx3U2N#1JV$J%1Iv;Uh>Zj^k6Y~AN%MYJ1G1u9WRFe^OgL%uU3ElIBb80%= zYd!MyFRfj2io5%K!zG)l&K*s*Uoy@$7~kWTyXx=Q-@9gixsHDF`BSb*0SUanmudH}Yx`#Tw(GO{trvdOEsSN0pZB!s{CU6Y)zu{jfBiXd%htrs z^e(UQr8^(?sXp#z6_Su&^rKDc`7zfW>$Eg84oE`$qH63p29p zYQE-%H~dvMu&;gT%>E%id$*v2gtLKA^D%Sf=l2a%TRw`KOLEVjAIooNYyG!n?_SHs zdvS%kq?fVxyx+d;m-W6E|1y-_gdRKF>|93UOPMValIk*QZkIl`E-T4i_cJVZ(ubmRd(-z`*^}WDYP&DeSFXW7`}%eDtrzai zvskj>ks`O>(}Y;67%05=GtpJ=gOnDNhRh#F5NZIzRR1x ze0O5yU!REkI*X^o8P|EF)%@_gwAxR=dHT(Sx?f9XHhvK@biSB(;r_y#AJ<*tbSnOE zCfDtCZT}_dW4>qG{rA0KD_Ak-=faP z4c~e*`S7J5*RHwD5O&2=f4gmD0w?p!w`V=d4@WaTzJ1}0>FhXbkXuijT|Zyf=GEdr zUlWIyzhkq0w{CwTwfJGc3KC3UE+jy0UsK@=US4GY9%cpO&E&6)BJ72~1_Q^~B+pp^_dD$Tm*~9;GeXQD^ zeYJu!!vc%wejOnzF|9cRAJBeTYB{hL14mA?X_uIybg>A~gi5sQCHeEB7k z8xbO`G)L?4k0tp>8Mey$db*rQsbO9|Uvtkb=3nzxPvom~E7Erax%BlqZI7K_zuo?J zKIWRK(qret(w}1NzSOTW=c(Ifz9;66u$NdF>y5iy3EtWby=xiGw)dRZJfHZXsbb+V zW8dR;ztheoe{lL-_^+V%{o-A`4-W5={KfhD#_h}EYnD&E7uP0z@7xI%-OFEZoA<_k zle0~h)a-q4(HfZZEk-e{Mt8S9j`j<+dqfffB#+PEkEa8_`&e+1nd9v zXWz36s9(-LF2zxE;s5PDD~?}2+r4kroX-X}*K6k3$2>kaOw5tlP_mFPVRrFX{oiuY@fr!nW6Fa3za4{ML4P+JY1nJdG_{&*N2nd zhu$|7E4lo-Rr%`r|2ngZ7L{B-bihw%qEz{VFZ}tQU!>Viq}H&RpFbtSx=%bOGCs>S zr>5w_s?fl*+kD;a{;r=``zQGRd(QP|x)1%B_k#EDzsu79e!ee$aI5qA0aM{~jgnF7 z^(W`>F}$9|{3CXw)-rV`{U-lw()S;oe3ooKZ_aNGo7**O{{MXTSm(F!yNjW3*64RP6EnM+ic^*TejERkFg}0n|*RK?(C!z9J)0eny4xPU7_Q_Ba+i4Te|LAF7 z+*BUivS_Ny79GW)jUP|Cu0AIG@Sym*hUw3r9OPaaD0M&i`2pSjFKyCtuXv}6er@Y^ zo6B7MY+JLtT6xvKSBv5ferGFucxZM0*}4T!Pn6Hkvy+>bX(*<)Rf0RLXZ?~oMIEn| z?C)Q{|JL{Y+o@>=5_@em%F+*JXTDqh@~dz&a}WQ{>VJ}lR-fywxKI`PU zH-0?nGJk)`2}#4Zmrnm@)t~mQP5k+jn@Kh1c2}g=RV&D^n>m61dB2Ug-uw!?7#pMi zmp{8d`)>PuU)=TQcV|y`RqmXneY-?3ylj_S%*|E)hqLwf7C5ZmEoOHojmPG4jg5_L z>md+;sg9T)dCZNIF-!&i9B_sn{?uf1)ugiKNmhg8eO*WG@{T&BNoePrDp zcSz{oOx>32=K8CgV>cde%|0g78~#>RP%i9$wn`{6M_=9CmU0 z3dSdQCx6emzR-643!5$1kLI#}-?irGgLikOdF{;iG!B0$J~5aT$t-_@%UBEjxUdHKWsEhe(*Bw@x%SP$J{PFp1nXn;`lwexmSc@4mB(@ zKRuOo^5vM%@#|h^IUn}n;WOIDxU{r2JX)->kdI4!*Pi}mpY1QESNT@W+z?n3%)EE+ zi7L+@b!XpPdG|xOVtQ1KXNdKAiPx&~LgwdtYYt62bF7_bX4$R}E9~8Dw&c3z)O@@{C>;r>SuF{s?XaLR!_GnjP8$nbZy=A z4rwdRN5A^^cSlz@?bxZ_QU8UZFqvQAdTG<o%2E|HxZklmC8e$@hhtFW=R(U6QyNym76?i62cGujYAej1U#mbG@r* z^Qz!hO@zq7lTH_xx&Hgoe>C>4B3Fobu2o{imi^P-9t+aEXRze`qb9bH7?0U}(l>kg z4^9?Wdiyk5P^1b$34h-S=-<=e~c(n%n;5 zXYv25+_U&!^7gjPVUBFBcK)^CUcoony$^dBe+FEh&9APx*FoeP)5Z1b9k;8RcC3`{ zklxkw;i)4TO=-0BFodC*57_Ss;BvQG}xbw*A_6`^FO=h!fozzPmXx% zW>ndgi}`q#+kW)OTE*l4lTjwEruo@Ctv&lDUi|*+l-jO8KKg=Ut+!+kEza%xF?aFC z{*3s)btw7(Z5>~5#~;oEB1oI88{L+YQgvAo>ed)jix*msscb-Zl-dBMR0HU;0$H-{`$pA&jRIP2?cM$_Nl8Ybtx z=X*5&uH&6cXASn&m)PdjTrX{l3V(XAW7^?9+gnLCHj`|{%zLt zW*2<;@+;%s;(MKwW43H}y?^P1+D?muKbk78-q${wxctVCCre{DC+2TEFIgvX_WioT z@WcDlzcjVqd#AecV<}@{ZMenPS#k!;o@P{RIBHR$kgj7Rv-IQH9HT{-cJKYP*Vbfj zxslPsUX$yhjaxhojz}I^c&z;HmMIp{@B;OtRzTDaF(0}_jGg&b|LpvM0*JW#ieeQqV`0=Fg?>i6Ym*rRr6}{?hZd|;s zvHc$BmmkZd(m$O{s#zX)UHDa8wW7#Vv4bshHX0c2*2sE1`&tRlp4pXgt-%s6n!YB5 zi|v{CYFF~E2_KhKwoA#|*@*nw7S?rgRgdCv-$TK-=Egl}5m{mUr9ARiwbf*^)k0$5 zqSI0@q%CFO-sQgAY}MSNf}I`ivc9wVxR*=FFWM8}EVAOZ_R*y2H-0=>?tHFes%&&$ zQyA~@1HJd^3|>9$UhraTjf86F$E$l5s^7VuCDL$~^O_FlT#YCyRXa25TDIDm z-hR&We?{EOBmS=TW6X~CPi_8|v{gvN_wKWG`0|!1{ayjzo%=~T zcP3l2wWW&R%&8H6FjwtxqTtK7Q|%M)PJh?5{q?fv7j;gy9`5D8*qu7%eU!*qeXc9{ z8JDMOe6W?d`t`z+?nM#S68cQTW^(G z{r!*CHmP;9A3VJ-e&E9N>cbDjs}43S|D2pulU}v!u%?&ziCqtsc4(LL@MM_^y*n$( z{Qap2*gbELeLwg}Wc$ZFeS?)tYx48^w1w{#?L1VUKgD2?fnDu<&(g|6+wZ(Gd|UF@ zHg<_OcfhY*cDdHMyM*F$J)cxZJz6p`NFd?xvl|1E#!@0@;zbGv?J$)TW{I7UD{;#Ztf?1 zyBPHT?PuDt^loiI_V3>dHk{?yVZ5B<-6_qcgFBNGJa~HYi#~ULNPE2dA@k(7C-0p- z(Gt1xrF8m|rKL-LPMEII>wi%wI;ZKuC5AZ*gkHY;`A}+pc(mljBVsy988sOieu)X0 z%7zw)Olv1f$@__H%#t~F=1%S+2Wh9--PZFS@h++tQRa6{%s>A)TJM+7^a3>t;YrWV zvd_JxSbpSn>}{JB-~U|rQa_;8h1<|J`Uf6xxwxF(GvB0rku^_O&{@~H)cNpt+ z_sIUMx*uBbafgjXeU7KIjG3Ang*wQ7h56{_QE2$R|Kc#W+o-fu{zI=IR z!e7L!{?bZJF%Pl-?hJaJ9Zr|*se5j z`o{TZ;mkjR^Bj%^e`8xXMQh8>mPZ%E*sD^mb@dh6AI~VBdcb$BXm0CLTPxnlceL}g z^L%DcmUBJ5bi8?}TRN z?D@_j_pF~yDAf6N*{kf^g)L@h+rQ?{H_maLZpQC${ElFq$-cadnw`oE!{2$lm}@O` z?!4?u>HG1;ZiiDX7eDNJV^|RSO=5>ywMoouW2trLWqHk?^|j3|azCuQbMeFZI~Om^ z&wJDRey14!;VZ|Q6AQD7f2{E1((x)hd?>_R$M<~8rI72tCT%%$@5?b+c0R!po{~oeg<`MY*`tslHU;P5>XIN;7-jJZ0F%kx6}En*JQtLUl6^z@W$iMv!&us2Np!04lHmz9as>0IHiWaBOEEgOZ63VzLW z`sjPP{l=H_E=8`{AHN>{b+guQX+c=6VM5#j_4K0t<4?t%r$73;Px$Ie;jU@x^?!5x z-FI#M@#H<}^PFaT7#w?kA^1+1#;a8aexF;_%0JH{D)7bcgMsgxX0FP-T@Z2in{HdR z_0ygiw^pA$d|`E}pw#?$y~o;3>cw(R;j`}Xs?MB#@X?iN9}3^@`cRprrsH$cVv~aE zghYoRZR~h{I+Q6IsVr| zw*S4`!WG$HmDcSK*8ZI%!PfGB-RybqOE22*kc}3Z&)ffAX|H&n`n>QTI;)O-{ZcG& zwf2|eJ_{LbdB)F|tvHuHVJ>|Bdx5>dtiArn&vV`5|JPf2#oaYtcfQ#%i`kp(Tl#d} z&0bBiPO9jiBglO|`>(>B>sf19j)k-Ir~9|K7t1%V?6uiov32kN&$niN2%cN=V?*ET z5A3Cva_?qi;!+K+ zXdliatlr~T~8<7jo8eIE}Q|MuHkzC!qF z`r#juXJr5Vv)T9kv|aa)2@6+bf010=^{c!vdgbjO6IZMgS3YIeF6+ARys}7X%ZC;6 zulA<>fRx!1p+&lxX#`bhh`or|rXKkbvbY@P1%F+SSA#XHKsWB130 z8(sLH+A#1hcxd{DJ?q)ifBr#H2irEkK5%ODrR#cY=YG84uDPzRJ2;4`{)*@6kB=^% zzwTPGWp~T=lpPvD0e)%DudVZ=aSGVPSlle5Y&}#Fw~WA@ziZ=4Erx{u>2nHhr^M* ziC#c-`NMk-@8?;z32No{n~5e`l~B5gSXEqI(6m$+_2|U&-)jfYt`pIxW{zZ zfM>FYUfJE+V_$XMs`5`se!ZrU4_g0I>i@$7F9nE6F2 zrwp{uf3brxv*N5Kfv=7n_a0151ntRhBY~Xp#O0Fip%)jmzU)tR{`TX{0>jJyr?G9` zapvDy#|tr+|EDP_PqK0QWZbj)!-L9@SKAM*&J*aeYOjmb`f$P5#_@LaCyT$6riiTi z&h2_zagS<$SM;;_j{9{~e{tUWrTMh=i+9k&i^sUvf14YyCHBzbx!(JAM1LJzc1tZV z;F7P%!INK3r#_fj_3L@`T!;NrDw^7N=-GN#TuoZILb`R)x=T;5)?Getx8%MycUMG*@__SovsjbFE}oW0*2jOipXACDSYH;xGpAj> z`n|xZFSov&PSv>8?Dp=e_{-@+-U{oxteiD&NfjR7eeC4x|4~UC{=2@fYX8bExZZ5Z zq4Osi7X8zCH-rDtI@e>IUk~nB`R=d8|FG~&^68U$7ad*x!hdGm+wi|G`L5O~zeM?$ z+*jl6s@lIJeQBbK--3W@7oMmdHKU`B$G%US_xRtdyI;JE1auDFl3Mtq#wl<+cmKDo zA2MQJmU}gaTPy5QT_EkY@LO-dmbNd^B_gGZKK=}wzc}7Y;b6^vUA8lfh77zhuk~%B z)E8#hmWr-g+q!74;=A7>zQ5H27yO%RHYs4kaoZovYowW7>*J4a+Ocv^mcHSFEvkPD z)oy;ss2AK(pyydL%>Uh=q z^%u%{|C(i9==C?Ql4+ja@M85$`Bgg0KXP8o|HfVQ=bq&P{>It7*ZDNouKphK@t??7 z-d|5!nvS*GhL~*sFk$)jQ#ZUGXs-M6{?R}E3m$eN%vYa1+IRlr;fzrCcKC&WW|! z^=s(7^xZ!tpy}B4_)R-zuw2;x#Le(StjSK+)cYI{pzQ9n%T?>zw=v@ zPf#}gP=o$m(cGz=BsKr|_i1+8qV4J2SJl3p?qlfX|Ga*M{ENvYUv91p ziR!eAIj3T1!F+D9-u3J2L{^E1{E0d__17EY^}qIW{num8soChB_E{)>T*y7-sj zWN2)6{>)&_p_%1w$r)c`e+E*+;d)7--U;f>Ce7k#vchm*_cDG3n&pilO9`wiD zFy+?EMF~+}s&@^oLwV-Zsr?O9n|VOpJLbAkh2e|(j2}-VuUvS#Kzjbal(qNV>rEDd z@>XQ;`)x;;znp*4`kt|v&-DLilJ@+FJT{TbHCEZ?*48h_g}qcCb4xhYzt#J@wdql` z)~}zNzW6e~JLq~vNb-K}(b6xS&Jy*Z*>?&G?ef$feEcdbci;8PY0kwtMc#(~c`LWQ z&|kgvee0q;!MNOMA67-VW?G1RShvrQi#I?Gl+t^Su@_8wvHouMp6p9vVgJs&nzb^2 z_i}#uUtLW0n(qCJCw)|8{Cv1P@a!pg1eUnC3S-fI5hO?@Dc{y*psvyIY}na?{GEjq;= zChU0OhsaygU#gm%QuD)WL*H+-V3h3TznJcN?)anXN9-Kyf31jHAX>WWg|+V7I?Kcv zQt=Hx6@eLa}q+fT)EsWPoe(=b+HOR&}{&M^KkS@OuiT&moH9uVXg(VAO z_T^_@=8_7y6>`7PO|0Z`bPK=a=9YB7=!@&OOw2s9qsK+;iSfS4U+%BGcRRTMrE|Xe zqJn3tP9JMm@?Wp6@xP$2-Xkm(e^YM8_t*EEZB-?E`2)Aaf6+Z@b2M)6^YFUMU-uPX zZe7%O+5E<_`xD)3R~$O8CiPeLzR;Q1_FoiJf0;{6NzdDSYQOTapA}oxdwgrJ@_*g? zZ57k?p9?>p{Pg9GuH?G>Ww~!o><_Bga=v4qfLt!;-;FJevqSE0Wcd8IJ>ZIdtNZUQ zL1((YE&Z_K^UHoUo;ypVrtdtl$#d(zjZN=uYv+5o&ejoGEB05c`N0LnZ&qJ^#4o!) z(V*Z7i}@A3+iQ=q*c7t(p1%?NiS^ghmdBcPp&GB){w}<^SXPvEpW?5k(l@RTH}U*! z6xnXd%~$Ak>9%vhX67?%-Ty{vyi%X~kFEc8^}-DQ%kt@S`od*b*IRt#y!_yZyq}Ii z#gwkPn81(szbx!=X`X$iYU|xb<-iZJPtz8y{nZ{L#&uQj(Bk7;PpX7D@6c{rROec6 zlK4P=-y+$|>At5J&K)|Ood2O*jxVC3@DPXI^@*vQQ{L!m-YPT9c-JYf@b&GPFPC}$ ziFCbp{PmPY_{GdDajx~dg8o}yetf0x<#HnpEjjNk-WsGd{!OR&@XpQV+FuSW z?Y3^JShAbFjf7?usm(BC^+^mHB6P$~8z$v6s7*bZv@zmS*G9%!A!6M}lTKe`4S1B>R%=;KoSr`|F{ zxuwF3YaYJJRy?xVsYAL|ApKH;>akTH za~JS>bcH_t-D;+wX_6IucDhmN6Mg$5*};bF$HD$#Bbe5LzR3 zzv@=Qk_gj%^D~(zIX!kWG;^3d>rJO@V$uFhFa93j30!96XSnZERWQfJ&U+qB8?$PD zth>w^VQM$0;TcQD9Su;iG1+wE4;Hy@PwkBt=9*L-n|Mt8inCM4~xf3r2ClsTxtxsu}ZW~oz0uG)9a%^&W{7t5$i%X8h={JPM5D#MK*JR3iT7H0%a z*4^0b^X|Onp|8#L3(Z4(3wM2FZQZ-yCF$yqYZus5j;{Ln*F$=O2+TyUHIseyHDb~Z zs`P(ccu&~LWTCl)`WmVGSrE_3XCOSM)A@J#$y!&fIi;479EJS?kJJ>8{B-J=bKqO* za@Ml6mzpgQ#^9yz@zkAeoJO~=C6}V+WzsO(^qDvj#{SqP*zn`gRUg+b;`QK?mQUuKbtT0^XW!+;-$gpRn7eN)%jO+XYJUH!U`NNc+|c|B z$5u;*_3F(rXZR0r}n(qu-a!5Am++y*5!P-z z_E({*i4sXyf6Upmb$aOI-+hP#x`Lg|dU^e-$-e8P*A<*F4Se4w)T?vM zeP;y6#v@ODg|&1aG0r$_cxcr}%hYz^)yKZ;<~jsHBYf_hh?@Uy?^R_UR?E%d5Z1rN zt@v!_5y8F-46BqkNyQ7)ESEX!(d;GNBbZaucH_q?OOus;zB$tbl6Ifm8=^Yr$%GZc z!UgI4QvMdJ`nd0;n(tGn*u~zf8Y6n~SW-jiAzZXWM7U@wZ_^7ydEBno_7|uRQt?x zlJ<0(lUK82{cE?$7S1nYZ*}l)_$c{n4pM^g)OlCp_;{Vyj?-w4r!84Eem8HOUiGoo4W21OmaCL4@w~I}$rM|5K^xYlWAa{pl~uiMDF${d z)rBV40%rM2cL=RM_I!%0-;Ey<-WQfwscsD0-agAgdV<898t2FBy?*R7p6My}c=tV( zYpYV8|J#^T(`L7n*MqB9`sfV?-&Mjw-Mgn4B+7QM+%0PBaaf-n>-6RbocYzw(C#qoK{XTn~mOcg)T} z61|z-F(H$cejaPC{?(mp@l*Ne6FVnPe?kAWNhg041X}lQ*LtXDP?iA7WQRLLA0OsS z@oPBN3u-i7Xb=8ZR3q3A<7bEaMH0mq2i>7C2Zt81T3t9k2_#HVVLeTi?4)coKwi^RvtI*yaIs*~i+JI$xa zE#$S}uu+(P&tJpxX=|;D%IuGdVeN0;R-8`<`NQqXs*evdHDLY-{dOek?v!8hTNv3V zW);~lEOFr|6v|cc^l*E;`B&tzhZi#v9~*D!L8O&U>epULt(dljv3=vcC-ao48G0PzSU!cWb+@mKBRJdfWm_^l`GRQoRKRrda^2KUK~n(MQU$a?*V z>=1(}Un6xt2vHiGniFBOt^Jsk*Xm4WzLc($wXH&a|2*9$UHma?<`G%1vK;wi$I>~b zb6G+woRFEqvvY;AH7rwkgER_uYgNTBH0d#$prW$)<5j~>>nZ;h@VbDDofb__I7?dpek3yr-Nd24DZq_ueuzZ&EoX#6w(WNquDyXs}9LCX1#U%uh| za{U&@Zb;ErwA%B{!YwlpQEH?v#vi?OW7{PUko&T}mF1@CNT1BA37ft;##wqp2gpZG z`KzmcJX&W7PdCqw+{+ir)=+K!_|$o7WA&4ERa;wbftq$m@TKK?NM%x-_3_dUTuKskA+{o;k#H+eoWPiY) zvrqOpY2GQV3FB^^oAlWFoDZnEmvpPab=S--l3sp>`=ou7_*D@W$=~PR!pNTVb!qJm z>+Kspo;+wX`G&J*zgfb>b!xe7LMXO`eScLm+w6e@+l)Km8m+s-)urdlEZBJAhO_3a zy;hU2{>U@vw4DN}UyanSy?V)0oWaa@X85PSNV=4!VR`h& zI&&2DJnqYVj`AI424%eSm)QImr02`zfD+n=54SQBKmi_pcA@7~%Z*|F3IAuAJ#d%@ zic7BVEM;cxf9&*)GAKOo_$2hD;w;blJYy7 z4P7Kj-{76w>{5f z7QAqA$=!gWu8*M3*HF@?#$IhU4aFnhXel8pDCJi|FtJXgV~fYBz`ddi%nny~xRt(NLR zTX?7DMbx}n`mya&*{z1=1G?8={B5};amztyV$QMl(|#Fe7Pd^D^QNKqyZ|^|U*+uF zYP4DSYKz$efoU`Ecxya7vn@sSX3zU%kS!Lu3Qiw9G;Wn?)H+E|5LsPa`smpMSkAo4 z*?H9`iErud3}(IqsYUXknp4dtxu{J382PqzVS!|mY(y;g>nY!lZJ&Ka&P)Fyyn?#Q z*(sYNR19i6STtDszEhsEp?t;}mB}A%GlcRr)-L6BIcYdKdya?wW%+4S{;6$jpLAw^ z|0k&LtQ0q{^-WsmWik7#XH7y8|3Z^KNQJxB2vp(P#c|)SzMMVBqxvPk_bC@p{%1jC z@41t1TvaP5)^`*)!6E%L$KWXZuc}rOFk>f^C zv&Pm%-2u{-c{SxopIN8%lxvsSRM^ywF8pwQX?@E8kP@G%o z=kATkySGFHCJE(h>~)l$AR%Q9>Q{vzBrOLIlJvr@D@hTj+8d@bw7)_Ov=FhNy(FiV0E4Xtt z7$2~RN`;61YBYPq@WOThs30%RN(ycfnCMv@(+a+96HuCKCdRIG^AqpWDWAV< ze6b4vjSE=WZk#B^#Wnxh?MrOAZ1=U-8SgCHVbyLH;XC2#j}IcetF!f2ZeVZCwh%sg zUCpp{@!H1rvlR_$zo&WfJbV>%Yk~8E?~UNL=gZEuq6gWog;ZE=yZb;s&tzGTl)v;^ zw-YHfJ6fKlb}yHi;}OloeM;DKo@Y$hmpKB9*mAG96)X~X)){9WqngBVQ}4xIaPauH z9eLCuTIC=1wfew{MV0@<)i=m-o3r+%N$|8D7YR)lN~~GV=EhKX~M$2R(G$6~VE}IIK5+zrdsO2R<>FXv<7HeA0hM zoRB-qhbb&N*LLVUx!v$#f8haVK{{j)p2OuSIy%RF#!s|6?RRr{W{op08k*>ewlx7VvmzACW0Ya!2}PMu9+DQ8vg zWwi3k?Rb_Km=JVExN+<1;ueAVoQh@~ihQ&G#F!j(8UXJ0?%g+56IC;rBMMLP_Cn^$2(4$wq=zlkd5h9)Ef4 z`@G)w`yVx4J)D(#angavxhI+S+Jh7K$ypILYd*zJuAUlL;l&&*xLit}@A22A=8pxA z&A8KlX42mScRUt+?*JQnQ&{@tI{uFW`=7(hvs^;{-J0gz-73O6E?;O?`#vi}mRHAk zV(Fp@vKOk|K$$#hu26L+3tNZ#UX!JbhEpfp{88}BPVB)ulNTzBI|Ux8PX6uR@*&|) zmB|5>mV1zKo>wy>V(QIZISS9Hh;I~Fr!0NEEuC{_5C3(hN3*scY`oa~$}KHnZI;UO z1UKcFUmx@pU9@;LIu}|xK(B$zPG@% z@fkBH`Dv+NV=(94XHvj&AxH6uxl;$T+D;?kcS4(dI1Eicq`X;@`G!YW^T#?~`8Qom zrwa?pXWdn+mrt`2`5}E+_|nA}1)pD=R5fOCoD~L_x_&tscN&E^eKhcsQF1LlvOMt4 z<&B2mnWr>c8;*{pkIokiwaF9$lSJsVN%Wf1 jLZ03l3hd4a|JmKw#{Kyd!`Q>Xz`)??>gTe~DWM4f9+#x0 literal 0 HcmV?d00001 -- GitLab From 9099c938b16d503a228fdf0e1d71b6c70efab562 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Tue, 20 Jan 2026 01:06:55 +0200 Subject: [PATCH 334/371] fix: P4 UPF handler messages --- .../p4_fabric_tna_upf_service_handler.py | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py index bb4afec97..c378a0738 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py @@ -112,6 +112,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): rules = [] actual_rules = -1 applied_rules, failed_rules = 0, -1 + label = "" # Create and apply rules try: @@ -122,6 +123,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): port_id=port_id, next_id=self.__upf[DOWNLINK_PORT], action=ConfigActionEnum.CONFIGACTION_SET) + label = "uplink (UL)" # Downlink (DL) rules elif port_id == self.__upf[DOWNLINK_PORT]: rules = self._create_rules_downlink( @@ -129,23 +131,22 @@ class P4FabricUPFServiceHandler(_ServiceHandler): port_id=port_id, next_id=self.__upf[UPLINK_PORT], action=ConfigActionEnum.CONFIGACTION_SET) - + label = "downlink (DL)" actual_rules = len(rules) - LOGGER.info(f"\t # of rules {actual_rules}") applied_rules, failed_rules = apply_rules( task_executor=self.__task_executor, device_obj=device, json_config_rules=rules ) except Exception as ex: - LOGGER.error(f"Failed to insert UPF rules on device {device.name} due to {ex}") + LOGGER.error(f"Failed to insert {label} UPF rules on device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info(f"Installed {applied_rules}/{actual_rules} UPF rules on device {device_name} and port {port_id}") + LOGGER.info(f"Installed {applied_rules}/{actual_rules} {label} UPF rules on device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -206,6 +207,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): rules = [] actual_rules = -1 applied_rules, failed_rules = 0, -1 + label = "" # Create and apply rules try: @@ -216,6 +218,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): port_id=port_id, next_id=self.__upf[DOWNLINK_PORT], action=ConfigActionEnum.CONFIGACTION_DELETE) + label = "uplink (UL)" # Downlink (DL) rules elif port_id == self.__upf[DOWNLINK_PORT]: rules = self._create_rules_downlink( @@ -223,23 +226,22 @@ class P4FabricUPFServiceHandler(_ServiceHandler): port_id=port_id, next_id=self.__upf[UPLINK_PORT], action=ConfigActionEnum.CONFIGACTION_DELETE) - + label = "downlink (DL)" actual_rules = len(rules) - LOGGER.info(f"\t # of rules {actual_rules}") applied_rules, failed_rules = apply_rules( task_executor=self.__task_executor, device_obj=device, json_config_rules=rules ) except Exception as ex: - LOGGER.error(f"Failed to delete UPF rules from device {device.name} due to {ex}") + LOGGER.error(f"Failed to delete {label} UPF rules from device {device.name} due to {ex}") results.append(ex) finally: rules.clear() # Ensure correct status if (failed_rules == 0) and (applied_rules == actual_rules): - LOGGER.info(f"Deleted {applied_rules}/{actual_rules} UPF rules from device {device_name} and port {port_id}") + LOGGER.info(f"Deleted {applied_rules}/{actual_rules} {label} UPF rules from device {device_name} and port {port_id}") results.append(True) # You should no longer visit this device port again @@ -713,7 +715,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): for host_map in fwd_list: mac_dst = host_map[HOST_MAC] label = host_map[HOST_LABEL] - LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") try: ### Bridging rules rules += rules_set_up_fwd_bridging( @@ -740,7 +742,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): ### Static routing rules routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) for rt_entry in routing_list: - LOGGER.info(f"Creating routing rule for dst IP {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]} with src MAC {rt_entry[MAC_SRC]}, dst MAC {rt_entry[MAC_DST]}") + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Route to dst {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]}, with MAC src {rt_entry[MAC_SRC]} and dst {rt_entry[MAC_DST]}") try: ### Next profile for hashed routing @@ -866,7 +868,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): for host_map in fwd_list: mac_dst = host_map[HOST_MAC] label = host_map[HOST_LABEL] - LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac_dst} - label: {label}") try: ### Bridging rules += rules_set_up_fwd_bridging( @@ -893,6 +895,8 @@ class P4FabricUPFServiceHandler(_ServiceHandler): ### Static routing routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) for rt_entry in routing_list: + LOGGER.info(f"\t | Switch {dev_name} - Port {port_id} - Route to dst {rt_entry[IPV4_DST]}/{rt_entry[IPV4_PREFIX_LEN]}, with MAC src {rt_entry[MAC_SRC]} and dst {rt_entry[MAC_DST]}") + try: ### Next profile for hashed routing rules += rules_set_up_next_profile_hashed_routing( -- GitLab From f4fe80d27a69df0a507cea32152aa4f067546786 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Thu, 26 Feb 2026 14:28:53 +0100 Subject: [PATCH 335/371] working closed loop --- .../service/AutomationServiceServicerImpl.py | 7 +- .../zsm_handler_api/ZSMFilterFields.py | 4 +- .../service/zsm_handlers/P4INTZSMPlugin.py | 6 +- .../service/zsm_handlers/__init__.py | 4 +- src/common/tools/kafka/Variables.py | 2 +- src/policy/src/main/resources/application.yml | 2 +- src/policy/target/kubernetes/kubernetes.yml | 2 +- .../service/ServiceServiceServicerImpl.py | 5 +- .../backend/service/HelperMethods.py | 40 ++++++ .../service/TelemetryBackendService.py | 58 ++++++-- .../gnmi_oc/GnmiOpenConfigCollector.py | 4 +- .../automation/descriptors/automation.json | 2 +- src/tests/automation/run_test_automation.sh | 0 .../automation/test_functional_automation.py | 1 + src/tests/ofc26_flexscale/Fixtures.py | 17 ++- src/tests/ofc26_flexscale/run_ofc26_test.sh | 10 +- .../ofc26_flexscale/test_ofc26_messages.py | 13 +- .../test_ofc26_mgon_integration.py | 17 +-- .../test_ofc26_mgon_integration_V2.py | 127 ++++++++++++++++++ 19 files changed, 278 insertions(+), 43 deletions(-) mode change 100644 => 100755 src/tests/automation/run_test_automation.sh create mode 100644 src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py diff --git a/src/automation/service/AutomationServiceServicerImpl.py b/src/automation/service/AutomationServiceServicerImpl.py index 5c31b11bd..11b4d5e6a 100644 --- a/src/automation/service/AutomationServiceServicerImpl.py +++ b/src/automation/service/AutomationServiceServicerImpl.py @@ -42,6 +42,8 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): targetService = context_client.GetService(request.target_service_id) telemetryService = context_client.GetService(request.telemetry_service_id) + LOGGER.info(f"Target service type: {targetService.service_type}") + LOGGER.info(f"Telemetry service type: {telemetryService.service_type}") handler_cls = self.get_service_handler_based_on_service_types( targetService.service_type, telemetryService.service_type, ZSM_SERVICE_HANDLERS @@ -98,10 +100,12 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): return ZSMService() def get_service_handler_based_on_service_types( - self, targetServiceType ,telemetryServiceType , ZSM_SERVICE_HANDLERS + self, targetServiceType, telemetryServiceType, ZSM_SERVICE_HANDLERS ): flag = True for handler_cls, filters in ZSM_SERVICE_HANDLERS: + LOGGER.info(f"Handler: {handler_cls}") # <<--P4INTZSMPlugin + LOGGER.info(f"Filters: {filters}") # <--ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY for filter in filters: flag = self.check_if_requested_services_pass_filter_criteria( filter, targetServiceType, telemetryServiceType @@ -115,6 +119,7 @@ class AutomationServiceServicerImpl(AutomationServiceServicer): ): flag = True for filter_key, filter_value in filter.items(): + LOGGER.info(f"Filter value: {filter_value}") # <--ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY if filter_value in ZSM_FILTER_FIELD_ALLOWED_VALUES[filter_key.value]: if filter_key.value == ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value: if filter_value != targetServiceType: diff --git a/src/automation/service/zsm_handler_api/ZSMFilterFields.py b/src/automation/service/zsm_handler_api/ZSMFilterFields.py index 7b00de5bc..ab91e1bc5 100644 --- a/src/automation/service/zsm_handler_api/ZSMFilterFields.py +++ b/src/automation/service/zsm_handler_api/ZSMFilterFields.py @@ -20,11 +20,11 @@ class ZSMFilterFieldEnum(Enum): TELEMETRY_SERVICE_TYPE = 'telemetry_service_type' TARGET_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_L2NM + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY } TELEMETRY_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_INT + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY } # Maps filter fields to allowed values per Filter field. # If no restriction (free text) None is specified diff --git a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py index 74694a376..f3ea519a6 100644 --- a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py +++ b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py @@ -74,9 +74,9 @@ class P4INTZSMPlugin(_ZSMHandler): LOGGER.exception(ex.code()) # ToDo: Investigate why PolicyAddService throws exception # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - context_client.close() - policy_client.close() - return self._zsm_create_response_empty() + # context_client.close() + # policy_client.close() + # return self._zsm_create_response_empty() context_client.close() analytics_frontend_client.close() diff --git a/src/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py index dcb533e61..abb5588f8 100644 --- a/src/automation/service/zsm_handlers/__init__.py +++ b/src/automation/service/zsm_handlers/__init__.py @@ -19,8 +19,8 @@ from automation.service.zsm_handlers.P4INTZSMPlugin import P4INTZSMPlugin ZSM_SERVICE_HANDLERS = [ (P4INTZSMPlugin, [ { - ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, - ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_INT, + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, + ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, } ]) ] diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 5a8e68215..dd3d9e07b 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -19,7 +19,7 @@ from kafka.errors import TopicAlreadyExistsError from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-public.{:s}.svc.cluster.local:{:s}' KAFKA_TOPIC_NUM_PARTITIONS = 1 KAFKA_TOPIC_REPLICATION_FACTOR = 1 diff --git a/src/policy/src/main/resources/application.yml b/src/policy/src/main/resources/application.yml index ccfbffdf5..7292f222a 100644 --- a/src/policy/src/main/resources/application.yml +++ b/src/policy/src/main/resources/application.yml @@ -63,7 +63,7 @@ quarkus: context-service-host: "contextservice" monitoring-service-host: "monitoringservice" service-service-host: "serviceservice" - kafka-broker-host: "kafka-service.kafka.svc.cluster.local" + kafka-broker-host: "kafka-public.kafka.svc.cluster.local" resources: requests: cpu: 50m diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index cd578b34b..a83d03403 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -76,7 +76,7 @@ spec: fieldRef: fieldPath: metadata.namespace - name: KAFKA_BROKER_HOST - value: kafka-service.kafka.svc.cluster.local + value: kafka-public.kafka.svc.cluster.local - name: CONTEXT_SERVICE_HOST value: contextservice - name: MONITORING_SERVICE_HOST diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py index 98b0a2670..03bd27fc3 100644 --- a/src/service/service/ServiceServiceServicerImpl.py +++ b/src/service/service/ServiceServiceServicerImpl.py @@ -542,6 +542,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def RecomputeConnections(self, request : Service, context : grpc.ServicerContext) -> Empty: + if len(request.service_endpoint_ids) > 0: raise NotImplementedException('update-endpoints') @@ -549,7 +550,9 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): raise NotImplementedException('update-constraints') if len(request.service_config.config_rules) > 0: - raise NotImplementedException('update-config-rules') + del request.service_config.config_rules[:] + # raise NotImplementedException('update-config-rules') + LOGGER.error('update-config-rules not implemented') context_client = ContextClient() diff --git a/src/telemetry/backend/service/HelperMethods.py b/src/telemetry/backend/service/HelperMethods.py index 2eda93c8e..d0a68c8e8 100644 --- a/src/telemetry/backend/service/HelperMethods.py +++ b/src/telemetry/backend/service/HelperMethods.py @@ -22,6 +22,9 @@ from common.proto.kpi_manager_pb2 import KpiId from common.tools.context_queries.Device import get_device from common.tools.context_queries.EndPoint import get_endpoint_names from typing import List, Tuple, Optional +from telemetry.backend.service.collectors.gnmi_oc.KPI import KPI + +from .collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector LOGGER = logging.getLogger(__name__) @@ -174,3 +177,40 @@ def get_node_level_int_collector(collector_id: str, kpi_id: str, address: str, i LOGGER.exception(f"Failed to connect INT Collector on node {address}, {interface}:{port}") return collector if connected else None + + +def get_mgon_subscription_parameters(duration, interval) -> Optional[List[Tuple]]: + return [( + "x123", + { + "kpi" : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, # sub_parameters['kpi'], + "endpoint" : '4', # sub_parameters['endpoint'], + "resource" : 'wavelength-router', #sub_parameters['resource'], + }, + duration, + interval, + ),] + + +def get_mgon_collector( + address: str, port: int, username: Optional[str], password: Optional[str], insecure: Optional[bool], + skip_verify: Optional[bool] + ) -> Optional[_Collector]: + + _collector = GNMIOpenConfigCollector( + address = address, + port = port, + username = username, + password = password, + insecure = insecure, + skip_verify = skip_verify, + ) + try: + connected = _collector.Connect() + if not connected: + LOGGER.error(f"Failed to connect to MG-ON collector at {address}:{port}") + return None + return _collector + except Exception as ex: + LOGGER.exception(f"Exception while connecting to MG-ON collector at {address}:{port}") + return None diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index d4e99f300..2a7943e57 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -17,7 +17,7 @@ import time import logging import threading -from .HelperMethods import get_collector_by_kpi_id, get_subscription_parameters, get_node_level_int_collector +from .HelperMethods import get_collector_by_kpi_id, get_subscription_parameters, get_node_level_int_collector, get_mgon_subscription_parameters, get_mgon_collector from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from confluent_kafka import Consumer as KafkaConsumer @@ -144,6 +144,15 @@ class TelemetryBackendService(GenericGrpcService): ) return # Rest of the collectors + elif context_id == "43813baf-195e-5da6-af20-b3d0922e71a7": + self.device_collector = get_mgon_collector( + address = "172.17.254.24", + port = 50061, + username = "admin", + password = "admin", + insecure = True, + skip_verify = True + ) else: self.device_collector = get_collector_by_kpi_id( kpi_id, self.kpi_manager_client, self.context_client, self.driver_instance_cache) @@ -153,9 +162,11 @@ class TelemetryBackendService(GenericGrpcService): raise Exception(f"KPI ID: {kpi_id} - Collector not found.") # CONFIRM: The method (get_subscription_parameters) is working correctly. testcase in telemetry backend tests - resource_to_subscribe = get_subscription_parameters( - kpi_id, self.kpi_manager_client, self.context_client, duration, interval - ) + # resource_to_subscribe = get_subscription_parameters( + # kpi_id, self.kpi_manager_client, self.context_client, duration, interval + # ) + resource_to_subscribe = get_mgon_subscription_parameters(duration, interval) # TODO: Remove after confirming get_subscription_parameters is working correctly + if not resource_to_subscribe: LOGGER.warning(f"KPI ID: {kpi_id} - Resource to subscribe not found. Skipping...") raise Exception(f"KPI ID: {kpi_id} - Resource to subscribe not found.") @@ -167,14 +178,32 @@ class TelemetryBackendService(GenericGrpcService): raise status else: LOGGER.info(f"Subscription successful for KPI ID: {kpi_id} - Status: {status}") - + + sample_value = None for samples in self.device_collector.GetState(duration=duration, blocking=True): LOGGER.info(f"KPI ID: {kpi_id} - Samples: {samples}") - self.GenerateKpiValue(collector_id, kpi_id, samples) - - # TODO: Stop_event should be managed in this method because there will be no more specific collector - if stop_event.is_set(): - self.device_collector.Disconnect() + if isinstance(samples, dict): + inn_dict = samples.get('update', {}) + LOGGER.info(f"KPI ID: {kpi_id} - Inner Dictionary: {inn_dict}") + list_update = inn_dict.get('update', []) + LOGGER.info(f"KPI ID: {kpi_id} - List Update: {list_update}") + if len(list_update) > 0: + sample_value = list_update[0].get('val') + self.GenerateKpiValue(collector_id, kpi_id, sample_value) + ''' +{ + 'update': { + 'timestamp': 1772103489806507669, + 'update': + [ + {'path': 'openconfig-wavelength-router:wavelength-router/flex-scale-mg-on:optical-bands/optical-band[index=2]/state/optical-power-total-input/instant', 'val': -2.51} + ] + } + } + ''' + # TODO: Stop_event should be managed in this method because there will be no more specific collector + if stop_event.is_set(): + self.device_collector.Disconnect() def GenerateKpiValue(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ @@ -186,11 +215,12 @@ class TelemetryBackendService(GenericGrpcService): "kpi_id": kpi_id, "kpi_value": measured_kpi_value } + LOGGER.info(f"Producing KPI Value for Collector ID: {collector_id} - KPI ID: {kpi_id} - Value: {kpi_value}") producer.produce( - KafkaTopic.VALUE.value, - key=collector_id, - value=json.dumps(kpi_value), - callback=self.delivery_callback + "topic_value", #KafkaTopic.VALUE.value, + key = collector_id, + value = json.dumps(kpi_value), + callback = self.delivery_callback ) producer.flush() diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py index 63556d4e9..1b7067b03 100644 --- a/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py +++ b/src/telemetry/backend/service/collectors/gnmi_oc/GnmiOpenConfigCollector.py @@ -20,7 +20,7 @@ from typing import Dict, Optional, Tuple, List, Union, Any, Iterator from pygnmi.client import gNMIclient from telemetry.backend.service.collector_api._Collector import _Collector from .PathMapper import PathMapper -from .SubscriptionNew import LOGGER, Subscription +from .SubscriptionNew import Subscription logging.basicConfig( level=get_log_level(), @@ -133,7 +133,7 @@ class GNMIOpenConfigCollector(_Collector): kpi = sub_endpoint['kpi' ], resource = sub_endpoint['resource'], ) - LOGGER.debug("Built %d candidate path(s) for endpoint '%s'", len(paths), sub_endpoint['endpoint']) + self.logger.debug("Built %d candidate path(s) for endpoint '%s'", len(paths), paths) self._subscriptions[sub_id] = Subscription( sub_id = sub_id, gnmi_client = self.client, # type: ignore diff --git a/src/tests/automation/descriptors/automation.json b/src/tests/automation/descriptors/automation.json index a28156a78..5e6287ec3 100644 --- a/src/tests/automation/descriptors/automation.json +++ b/src/tests/automation/descriptors/automation.json @@ -10,7 +10,7 @@ "analyzer":{ "operation_mode": "ANALYZEROPERATIONMODE_STREAMING", "parameters": { - "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [-5, -15]}]}" + "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [-5, -25]}]}" }, "input_kpi_ids": [ {"kpi_id": { "uuid": "6e22f180-ba28-4641-b190-2287bf447777"}} diff --git a/src/tests/automation/run_test_automation.sh b/src/tests/automation/run_test_automation.sh old mode 100644 new mode 100755 diff --git a/src/tests/automation/test_functional_automation.py b/src/tests/automation/test_functional_automation.py index a29307765..c74d05adc 100644 --- a/src/tests/automation/test_functional_automation.py +++ b/src/tests/automation/test_functional_automation.py @@ -82,6 +82,7 @@ def test_service_zsm_create( # Add important information in the request loaded_request = _zsm_create_request(loaded_request, kpi_manager_client) # loaded_request = _static_zsm_create_request() + # Invoke Automation automation_client.ZSMCreate(loaded_request) diff --git a/src/tests/ofc26_flexscale/Fixtures.py b/src/tests/ofc26_flexscale/Fixtures.py index c5b66b858..b958a39cd 100644 --- a/src/tests/ofc26_flexscale/Fixtures.py +++ b/src/tests/ofc26_flexscale/Fixtures.py @@ -14,12 +14,16 @@ import pytest import logging - +import os from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from kpi_manager.client.KpiManagerClient import KpiManagerClient +from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient +# Import ENV variables +_ip_kpi_address = os.getenv('IP_KPI', None) +_ip_tele_address = os.getenv('IP_TELE', None) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -54,10 +58,19 @@ def service_client(): @pytest.fixture(scope='session') def kpi_manager_client(): - _client = KpiManagerClient(host="10.152.183.121") + _client = KpiManagerClient(host=_ip_kpi_address) _client.connect() LOGGER.info('Yielding Connected KpiManagerClient...') yield _client LOGGER.info('Closed KpiManagerClient...') _client.close() + +@pytest.fixture(scope='session') +def telemetry_frontend_client(): + _client = TelemetryFrontendClient(host=_ip_tele_address) + _client.connect() + LOGGER.info('Yielding Connected TelemetryFrontendClient...') + yield _client + LOGGER.info('Closed TelemetryFrontendClient...') + _client.close() diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh index 026e56876..8fbdd0457 100755 --- a/src/tests/ofc26_flexscale/run_ofc26_test.sh +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -20,6 +20,14 @@ cd src/ CRDB_SQL_ADDRESS=$(kubectl get service --namespace ${CRDB_NAMESPACE} cockroachdb-public -o 'jsonpath={.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" +IP_KPI=$(kubectl get all --all-namespaces | grep service/kpi-managerservice | awk '{print $4}') +export IP_KPI +echo "KPI Manager Service IP: ${IP_KPI}" + +IP_TELE=$(kubectl get all --all-namespaces | grep service/telemetryservice | awk '{print $4}') +export IP_TELE +echo "Telemetry Frontend Service IP: ${IP_TELE}" + python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - tests/ofc26_flexscale/test_ofc26_mgon_integration.py + tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py index c142c0646..20217f2b7 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_messages.py +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -4,6 +4,7 @@ import uuid from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI +from common.proto import telemetry_frontend_pb2 # ---> KPI Manager messages creation for testing @@ -34,7 +35,7 @@ devices = { 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', 'resource': 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint': '10', + 'endpoint': '4', }, } @@ -62,5 +63,11 @@ def create_basic_sub_request_parameters() -> dict: return {} -# oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=1]/state/optical-power-total-input/instant -# oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=1]/state/optical-power-total-input/instant +def create_collector_request(): + _create_collector_request = telemetry_frontend_pb2.Collector() + _create_collector_request.collector_id.collector_id.uuid = "efef4d95-1cf1-43c4-9742-95c283dddddd" + _create_collector_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_collector_request.duration_s = 300 + _create_collector_request.interval_s = 10 + _create_collector_request.int_collector.context_id = "43813baf-195e-5da6-af20-b3d0922e71a7" + return _create_collector_request diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py index 1f9e6a982..a22115701 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py @@ -42,14 +42,15 @@ def test_Complete_MGON_Integration(kpi_manager_client): kpi_descriptor_obj = create_kpi_descriptor_request() _search_kpi_id = kpi_manager_pb2.KpiId() _search_kpi_id = kpi_descriptor_obj.kpi_id - response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) - if isinstance(response, kpi_manager_pb2.KpiDescriptor): - LOGGER.info("KPI Descriptor already exists with ID: %s. Attempting to delete it.", _search_kpi_id.kpi_id.uuid) - else: - LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) - response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiId) + # response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) + + # if isinstance(response, kpi_manager_pb2.KpiDescriptor): + # LOGGER.info("KPI Descriptor already exists with ID: %s. Skipping creation.", _search_kpi_id.kpi_id.uuid) + # else: + # LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) + response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiId) # 2. Telemetry Collector Creation diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py new file mode 100644 index 000000000..f6ea99945 --- /dev/null +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -0,0 +1,127 @@ + + +import logging + +from common.proto.kpi_manager_pb2 import KpiId +from common.proto.telemetry_frontend_pb2 import CollectorId +import time + +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + +from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request, create_collector_request +from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters + +WITH_TFS = True #True/False +if WITH_TFS: + from .Fixtures import kpi_manager_client, telemetry_frontend_client +else: + from .mock_tfs_services import kpi_manager_client + +LOGGER = logging.getLogger(__name__) + + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER + _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS + _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" + # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) + # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' + return _create_kpi_request + +# def create_collector_filter(): +# _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() +# kpi_id_obj = KpiId() +# # kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) +# kpi_id_obj.kpi_id.uuid = "8c5ca114-cdc7-4081-b128-b667fd159832" +# _create_collector_filter.kpi_id.append(kpi_id_obj) +# return _create_collector_filter + + +def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client): + + # 1. KPI Descriptor Creation + LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") + kpi_descriptor_obj = create_kpi_descriptor_request() + _search_kpi_id = kpi_manager_pb2.KpiId() + _search_kpi_id = kpi_descriptor_obj.kpi_id + + try: + response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) + if isinstance(response, kpi_manager_pb2.KpiDescriptor): + LOGGER.info("KPI Descriptor already exists with ID: %s. Skipping creation.", _search_kpi_id.kpi_id.uuid) + except Exception as e: + LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) + response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiId) + + # 2. Telemetry Collector Creation + + _collector_request = create_collector_request() + _search_collector_id = CollectorId() + _search_collector_id = _collector_request.collector_id + try: + response_col = telemetry_frontend_client.StopCollector(_search_collector_id) + LOGGER.info("Response gRPC message object: {:}".format(response_col)) + if response is not None: + response = telemetry_frontend_client.StartCollector(_collector_request) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, CollectorId) + except Exception as e: + LOGGER.info("No existing Collector found with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) + response = telemetry_frontend_client.StartCollector(_collector_request) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, CollectorId) + + # sub_parameters = create_basic_sub_request_parameters() + # LOGGER.info("Subscription parameters: %s", sub_parameters) + + + # LOGGER.info("----- Testing State Subscription -----") + + # sub_data = [( + # "x123", + # { + # "kpi" : sub_parameters['kpi'], + # "endpoint" : sub_parameters['endpoint'], + # "resource" : sub_parameters['resource'], + # }, + # sub_parameters['duration'], + # sub_parameters['sample_interval'], + # ),] + + + + # LOGGER.info("Subscription started: Status: %s, Data: %s", response, sub_data) + + + LOGGER.info("Sleeping...") + time.sleep(600) + LOGGER.info("Done sleeping.") + LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") + + +# def test_get_state_updates(collector, subscription_data): +# """Test getting state updates.""" +# LOGGER.info("----- Testing State Updates -----") +# collector.SubscribeState(subscription_data) + +# LOGGER.info("Requesting state updates for 300 seconds ...") +# updates_received = [] +# for samples in collector.GetState(duration=300, blocking=True): +# LOGGER.info("Received state update: %s", samples) +# updates_received.append(samples) + +# assert len(updates_received) > 0 + + +if __name__ == "__main__": + test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client) + + -- GitLab From eb80a6daab8398d21da63c348fe33e832fb68727 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Thu, 26 Feb 2026 14:43:11 +0100 Subject: [PATCH 336/371] last bugs --- .../policy/CommonPolicyServiceImpl.java | 4 +- .../test_ofc26_mgon_integration.py | 117 ------------------ 2 files changed, 3 insertions(+), 118 deletions(-) delete mode 100644 src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java index 074464cf4..e3841139e 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java @@ -393,6 +393,8 @@ public class CommonPolicyServiceImpl { final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); final var policyRule = new PolicyRule(policyRuleTypeService); contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + + LOGGER.infof("Policy Rule state is now [%s]", policyRuleState.toString()); } public void setPolicyRuleDeviceToContext( @@ -404,6 +406,6 @@ public class CommonPolicyServiceImpl { final var policyRuleTypeService = new PolicyRuleTypeDevice(policyRuleDevice); final var policyRule = new PolicyRule(policyRuleTypeService); - contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + final var policyRuleId = contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); } } diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py deleted file mode 100644 index a22115701..000000000 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration.py +++ /dev/null @@ -1,117 +0,0 @@ - - -import logging - -from common.proto.kpi_manager_pb2 import KpiId -import time - -from common.proto import kpi_manager_pb2 -from common.proto.kpi_sample_types_pb2 import KpiSampleType - -from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request -from telemetry.backend.service.collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector -from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters - -WITH_TFS = True #True/False -if WITH_TFS: - from .Fixtures import kpi_manager_client -else: - from .mock_tfs_services import kpi_manager_client - -LOGGER = logging.getLogger(__name__) - - -def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf447777" - _create_kpi_request.kpi_description = descriptor_name - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER - _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS - _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" - # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' - # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) - # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' - # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' - return _create_kpi_request - - -def test_Complete_MGON_Integration(kpi_manager_client): - - # 1. KPI Descriptor Creation - LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") - kpi_descriptor_obj = create_kpi_descriptor_request() - _search_kpi_id = kpi_manager_pb2.KpiId() - _search_kpi_id = kpi_descriptor_obj.kpi_id - # response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) - - # if isinstance(response, kpi_manager_pb2.KpiDescriptor): - # LOGGER.info("KPI Descriptor already exists with ID: %s. Skipping creation.", _search_kpi_id.kpi_id.uuid) - # else: - # LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) - response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiId) - - - # 2. Telemetry Collector Creation - sub_parameters = create_basic_sub_request_parameters() - LOGGER.info("Subscription parameters: %s", sub_parameters) - - collector = GNMIOpenConfigCollector( - address = sub_parameters.get('host', ''), - port = sub_parameters.get('port', -1), - username = sub_parameters.get('username', None), - password = sub_parameters.get('password', None), - insecure = sub_parameters.get('insecure', None), - skip_verify = sub_parameters.get('skip_verify', True), - ) - if not collector.Connect(): - LOGGER.error("Failed to connect to the collector") - return - - LOGGER.info("----- Testing State Subscription -----") - - sub_data = [( - "x123", - { - "kpi" : sub_parameters['kpi'], - "endpoint" : sub_parameters['endpoint'], - "resource" : sub_parameters['resource'], - }, - sub_parameters['duration'], - sub_parameters['sample_interval'], - ),] - - response = collector.SubscribeState(sub_data) - if response is None: - LOGGER.error("Subscription failed.") - return - - LOGGER.info("Subscription started: Status: %s, Data: %s", response, sub_data) - - test_get_state_updates(collector, sub_data) - - LOGGER.info("Sleeping...") - time.sleep(600) - LOGGER.info("Done sleeping.") - LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") - - -def test_get_state_updates(collector, subscription_data): - """Test getting state updates.""" - LOGGER.info("----- Testing State Updates -----") - collector.SubscribeState(subscription_data) - - LOGGER.info("Requesting state updates for 300 seconds ...") - updates_received = [] - for samples in collector.GetState(duration=300, blocking=True): - LOGGER.info("Received state update: %s", samples) - updates_received.append(samples) - - assert len(updates_received) > 0 - - -if __name__ == "__main__": - test_Complete_MGON_Integration(kpi_manager_client) - - -- GitLab From 9dfff1bea83bfb3adf67a5aee0d26e85fe8d9915 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Thu, 26 Feb 2026 17:19:21 +0200 Subject: [PATCH 337/371] feat: upgraded SD-Fabric library with 5G UPF support --- .../p4_fabric_tna_acl_service_handler.py | 8 +- .../p4_fabric_tna_commons.py | 209 ++++++++++++++---- .../p4_fabric_tna_int_config.py | 2 +- .../p4_fabric_tna_int_service_handler.py | 46 ++-- .../p4_fabric_tna_l2_simple_config.py | 62 ------ ...p4_fabric_tna_l2_simple_service_handler.py | 52 +++-- .../p4_fabric_tna_l3_service_handler.py | 79 ++++++- .../p4_fabric_tna_upf_config.py | 66 +++++- .../p4_fabric_tna_upf_service_handler.py | 42 ++-- .../collectors/int_collector/INTCollector.py | 2 - 10 files changed, 406 insertions(+), 162 deletions(-) delete mode 100644 src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py diff --git a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py index 0b09825da..466f37601 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_acl/p4_fabric_tna_acl_service_handler.py @@ -448,7 +448,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if IPV4_SRC in acl_entry: try: rules += rules_set_up_acl_filter_host( - ingress_port=port_id, + port_id=port_id, ip_address=acl_entry[IPV4_SRC], prefix_len=acl_entry[IPV4_PREFIX_LEN], ip_direction="src", @@ -461,7 +461,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if IPV4_DST in acl_entry: try: rules += rules_set_up_acl_filter_host( - ingress_port=port_id, + port_id=port_id, ip_address=acl_entry[IPV4_DST], prefix_len=acl_entry[IPV4_PREFIX_LEN], ip_direction="dst", @@ -474,7 +474,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if TRN_PORT_SRC in acl_entry: try: rules += rules_set_up_acl_filter_port( - ingress_port=port_id, + port_id=port_id, transport_port=acl_entry[TRN_PORT_SRC], transport_direction="src", action=action @@ -486,7 +486,7 @@ class P4FabricACLServiceHandler(_ServiceHandler): if TRN_PORT_DST in acl_entry: try: rules += rules_set_up_acl_filter_port( - ingress_port=port_id, + port_id=port_id, transport_port=acl_entry[TRN_PORT_DST], transport_direction="dst", action=action diff --git a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py index 08f0536c2..b03cfc908 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py +++ b/src/service/service/service_handlers/p4_fabric_tna_commons/p4_fabric_tna_commons.py @@ -210,11 +210,11 @@ def find_port_id_in_endpoint_list(endpoint_list : List, target_endpoint_uuid : s ################################### def rules_set_up_port_ingress( - ingress_port : int, + port_id : int, port_type : str, vlan_id: int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ingress port" + assert port_id >= 0, "Invalid port ID to configure ingress port" assert port_type.lower() in PORT_TYPES_STR_VALID, "Invalid port type to configure ingress port" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure ingress port" @@ -226,6 +226,12 @@ def rules_set_up_port_ingress( port_type_int = PORT_TYPE_MAP[port_type.lower()] assert port_type_int in PORT_TYPES_INT_VALID, "Invalid port type to configure ingress filtering" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure ingress port") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== VLAN is valid {vlan_is_valid}") + LOGGER.info(f"================== Port type {port_type_int}") + rules_filtering_vlan_ingress = [] rules_filtering_vlan_ingress.append( json_config_rule( @@ -236,7 +242,7 @@ def rules_set_up_port_ingress( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': 'vlan_is_valid', @@ -268,6 +274,11 @@ def rules_set_up_port_egress( assert egress_port >= 0, "Invalid egress port to configure egress vlan" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure egress vlan" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure egress port") + LOGGER.info(f"================== Port ID {egress_port}") + LOGGER.info(f"================== VLAN ID {vlan_id}") + rule_no = cache_rule(TABLE_EGRESS_VLAN, action) rules_vlan_egress = [] @@ -296,13 +307,19 @@ def rules_set_up_port_egress( return rules_vlan_egress def rules_set_up_fwd_classifier( - ingress_port : int, + port_id : int, fwd_type : int, eth_type: str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure forwarding classifier" + assert port_id >= 0, "Invalid port ID to configure forwarding classifier" assert fwd_type in FORWARDING_TYPES_VALID, "Invalid forwarding type to configure forwarding classifier" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure FWD classifier") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Ethernet type {eth_type}") + LOGGER.info(f"================== FWD type {fwd_type}") + rule_no = cache_rule(TABLE_FWD_CLASSIFIER, action) rules_filtering_fwd_classifier = [] @@ -315,7 +332,7 @@ def rules_set_up_fwd_classifier( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': 'ip_eth_type', @@ -337,7 +354,7 @@ def rules_set_up_fwd_classifier( return rules_filtering_fwd_classifier def rules_set_up_port( - port : int, + port_id : int, port_type : str, fwd_type : int, vlan_id : int, @@ -347,7 +364,7 @@ def rules_set_up_port( rules_list.extend( rules_set_up_port_ingress( - ingress_port=port, + port_id=port_id, port_type=port_type, vlan_id=vlan_id, action=action @@ -355,7 +372,7 @@ def rules_set_up_port( ) rules_list.extend( rules_set_up_fwd_classifier( - ingress_port=port, + port_id=port_id, fwd_type=fwd_type, eth_type=eth_type, action=action @@ -363,15 +380,51 @@ def rules_set_up_port( ) rules_list.extend( rules_set_up_port_egress( - egress_port=port, + egress_port=port_id, vlan_id=vlan_id, action=action ) ) - LOGGER.debug(f"Port configured:{port}") + LOGGER.debug(f"Port configured:{port_id}") return rules_list +def rules_set_up_port_host( + port : int, + vlan_id : int, + action : ConfigActionEnum, # type: ignore + fwd_type=FORWARDING_TYPE_BRIDGING, + eth_type=ETHER_TYPE_IPV4): + # This is a host facing port + port_type = PORT_TYPE_HOST + + return rules_set_up_port( + port_id=port, + port_type=port_type, + fwd_type=fwd_type, + vlan_id=vlan_id, + action=action, + eth_type=eth_type + ) + +def rules_set_up_port_switch( + port : int, + vlan_id : int, + action : ConfigActionEnum, # type: ignore + fwd_type=FORWARDING_TYPE_BRIDGING, + eth_type=ETHER_TYPE_IPV4): + # This is a switch facing port + port_type = PORT_TYPE_SWITCH + + return rules_set_up_port( + port_id=port, + port_type=port_type, + fwd_type=fwd_type, + vlan_id=vlan_id, + action=action, + eth_type=eth_type + ) + ################################### ### A. End of port setup ################################### @@ -382,13 +435,22 @@ def rules_set_up_port( ################################### def rules_set_up_fwd_bridging( + port_id : int, vlan_id: int, eth_dst : str, - egress_port : int, + next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure bridging" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure bridging" assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure bridging" - assert egress_port >= 0, "Invalid outport to configure bridging" + assert next_id >= 0, "Invalid next ID to configure bridging" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure bridging") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== VLAN ID {vlan_id}") + LOGGER.info(f"================== Ethernet Dst {eth_dst}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(TABLE_BRIDGING, action) @@ -413,7 +475,7 @@ def rules_set_up_fwd_bridging( 'action-params': [ { 'action-param': 'next_id', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ], 'priority': 1 @@ -424,12 +486,20 @@ def rules_set_up_fwd_bridging( return rules_fwd_bridging def rules_set_up_pre_next_vlan( + port_id : int, next_id : int, vlan_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure pre-next VLAN" assert next_id >= 0, "Invalid next ID to configure pre-next VLAN" assert chk_vlan_id(vlan_id), "Invalid VLAN ID to configure pre-next VLAN" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure pre-next VLAN") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== VLAN ID {vlan_id}") + rule_no = cache_rule(TABLE_PRE_NEXT_VLAN, action) rules_pre_next_vlan = [] @@ -460,12 +530,17 @@ def rules_set_up_pre_next_vlan( return rules_pre_next_vlan def rules_set_up_next_profile_hashed_output( - egress_port : int, + port_id : int, next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next profile for hashed output" + assert port_id >= 0, "Invalid port ID to configure next profile for hashed output" assert next_id >=0, "Invalid next ID to configure next profile for hashed output" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next hashed profile for output") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) rules_next_profile_hashed_out = [] @@ -480,7 +555,7 @@ def rules_set_up_next_profile_hashed_output( 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ] } @@ -490,9 +565,16 @@ def rules_set_up_next_profile_hashed_output( return rules_next_profile_hashed_out def rules_set_up_next_output_simple( - egress_port : int, + port_id : int, + next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next output simple" + assert port_id >= 0, "Invalid port ID to configure next output simple" + assert next_id >=0, "Invalid next ID to configure next output simple" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next output - simple") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) @@ -506,14 +588,14 @@ def rules_set_up_next_output_simple( 'match-fields': [ { 'match-field': 'next_id', - 'match-value': str(egress_port) + 'match-value': str(next_id) } ], 'action-name': 'FabricIngress.next.output_simple', 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ] } @@ -523,12 +605,17 @@ def rules_set_up_next_output_simple( return rules_next_output_simple def rules_set_up_next_hashed( - egress_port : int, + port_id : int, next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next routing hashed" + assert port_id >= 0, "Invalid port ID to configure next routing hashed" assert next_id >=0, "Invalid next ID to configure next routing hashed" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next output - hashed routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + rule_no = cache_rule(TABLE_NEXT_HASHED, action) rules_next_hashed = [] @@ -561,16 +648,23 @@ def rules_set_up_next_hashed( ################################### def rules_set_up_next_profile_hashed_routing( - egress_port : int, + port_id : int, next_id : int, eth_src : str, eth_dst : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next profile for hashed routing" + assert port_id >= 0, "Invalid port ID to configure next profile for hashed routing" assert next_id >=0, "Invalid next ID to configure next profile for hashed routing" assert chk_address_mac(eth_src), "Invalid source Ethernet address to configure next profile for hashed routing" assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure next profile for hashed routing" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next hashed profile for routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== Ethernet Src {eth_src}") + LOGGER.info(f"================== Ethernet Dst {eth_dst}") + rule_no = cache_rule(ACTION_PROFILE_NEXT_HASHED, action) rules_next_profile_hashed_rt = [] @@ -585,7 +679,7 @@ def rules_set_up_next_profile_hashed_routing( 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) }, { 'action-param': 'smac', @@ -603,13 +697,21 @@ def rules_set_up_next_profile_hashed_routing( return rules_next_profile_hashed_rt def rules_set_up_routing( + port_id : int, ipv4_dst : str, ipv4_prefix_len : int, - egress_port : int, + next_id : int, action : ConfigActionEnum) -> List [Tuple]: # type: ignore + assert port_id >= 0, "Invalid port ID to configure routing" assert chk_address_ipv4(ipv4_dst), "Invalid destination IPv4 address to configure routing" assert chk_prefix_len_ipv4(ipv4_prefix_len), "Invalid IPv4 prefix length to configure routing" - assert egress_port >= 0, "Invalid outport to configure routing" + assert next_id >= 0, "Invalid next ID to configure routing" + + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure routing") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IPv4 dst {ipv4_dst}/{ipv4_prefix_len}") + LOGGER.info(f"================== Next ID {next_id}") rule_no = cache_rule(TABLE_ROUTING_V4, action) @@ -630,7 +732,7 @@ def rules_set_up_routing( 'action-params': [ { 'action-param': 'next_id', - 'action-value': str(egress_port) + 'action-value': str(next_id) } ] } @@ -640,14 +742,23 @@ def rules_set_up_routing( return rules_routing def rules_set_up_next_routing_simple( - egress_port : int, + port_id : int, + next_id : int, eth_src : str, eth_dst : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert egress_port >= 0, "Invalid outport to configure next routing simple" + assert port_id >= 0, "Invalid port ID to configure next routing simple" + assert next_id >=0, "Invalid next ID to configure next routing simple" assert chk_address_mac(eth_src), "Invalid source Ethernet address to configure next routing simple" assert chk_address_mac(eth_dst), "Invalid destination Ethernet address to configure next routing simple" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure next routing - simple") + LOGGER.info(f"================== Port {port_id}") + LOGGER.info(f"================== Next ID {next_id}") + LOGGER.info(f"================== MAC src {eth_src}") + LOGGER.info(f"================== MAC dst {eth_dst}") + rule_no = cache_rule(TABLE_NEXT_SIMPLE, action) rules_next_routing_simple = [] @@ -660,14 +771,14 @@ def rules_set_up_next_routing_simple( 'match-fields': [ { 'match-field': 'next_id', - 'match-value': str(egress_port) + 'match-value': str(next_id) } ], 'action-name': 'FabricIngress.next.routing_simple', 'action-params': [ { 'action-param': 'port_num', - 'action-value': str(egress_port) + 'action-value': str(next_id) }, { 'action-param': 'smac', @@ -721,6 +832,12 @@ def rules_set_up_clone_session( assert egress_port >= 0, "Invalid egress port number to configure clone session" assert instance >= 0, "Invalid instance number to configure clone session" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure clone session") + LOGGER.info(f"================== Session ID {session_id}") + LOGGER.info(f"================== Egress port {egress_port}") + LOGGER.info(f"================== Instance {instance}") + rule_no = cache_rule(CLONE_SESSION, action) #TODO: For TNA pass also: packet_length_bytes = 128 @@ -756,21 +873,27 @@ def rules_set_up_clone_session( ################################### def rules_set_up_acl_filter_host( - ingress_port : int, + port_id : int, ip_address : str, prefix_len : int, ip_direction : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ACL" + assert port_id >= 0, "Invalid port ID to configure ACL" assert chk_address_ipv4(ip_address), "Invalid IP address to configure ACL" assert 0 < prefix_len <= 32, "Invalid IP address prefix length to configure ACL" ip_match = "ipv4_src" if ip_direction == "src" else "ipv4_dst" - prefix_len_hex = prefix_to_hex_mask(prefix_len) rule_no = cache_rule(TABLE_ACL, action) + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure host ACL rule") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IP address {ip_address}") + LOGGER.info(f"================== IP address type {ip_match}") + LOGGER.info(f"================== IP prefix length {prefix_len}") + rules_acl = [] rules_acl.append( json_config_rule( @@ -781,7 +904,7 @@ def rules_set_up_acl_filter_host( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': ip_match, @@ -798,17 +921,23 @@ def rules_set_up_acl_filter_host( return rules_acl def rules_set_up_acl_filter_port( - ingress_port : int, + port_id : int, transport_port : int, transport_direction : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore - assert ingress_port >= 0, "Invalid ingress port to configure ACL" + assert port_id >= 0, "Invalid port ID to configure ACL" assert chk_transport_port(transport_port), "Invalid transport port to configure ACL" trn_match = "l4_sport" if transport_direction == "src" else "l4_dport" rule_no = cache_rule(TABLE_ACL, action) + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure port ACL rule") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Transport port {transport_port}") + LOGGER.info(f"================== Transport port type {transport_direction}") + rules_acl = [] rules_acl.append( json_config_rule( @@ -819,7 +948,7 @@ def rules_set_up_acl_filter_port( 'match-fields': [ { 'match-field': 'ig_port', - 'match-value': str(ingress_port) + 'match-value': str(port_id) }, { 'match-field': trn_match, diff --git a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py index da5d6db07..dc7b6e6ba 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py +++ b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_config.py @@ -124,7 +124,7 @@ def rules_set_up_int_recirculation_ports( for port in recirculation_port_list: rules_list.extend( rules_set_up_port( - port=port, + port_id=port, port_type=port_type, fwd_type=fwd_type, vlan_id=vlan_id, diff --git a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py index 5cc6e24c8..f3d38d593 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_int/p4_fabric_tna_int_service_handler.py @@ -410,6 +410,13 @@ class P4FabricINTServiceHandler(_ServiceHandler): dev_name = device_obj.name rules = [] + port_id = self.__switch_info[dev_name][PORT_INT][PORT_ID] + next_id = port_id + mac_src = self.__switch_info[dev_name][MAC] + collector_mac_dst = self.__int_collector_mac + collector_ip_dst = self.__int_collector_ip + vlan_id = self.__int_vlan_id + ### INT reporting rules try: rules += rules_set_up_int_watchlist(action=action) @@ -422,7 +429,7 @@ class P4FabricINTServiceHandler(_ServiceHandler): recirculation_port_list=self.__switch_info[dev_name][RECIRCULATION_PORT_LIST], port_type=PORT_TYPE_INT, fwd_type=FORWARDING_TYPE_UNICAST_IPV4, - vlan_id=self.__int_vlan_id, + vlan_id=vlan_id, action=action ) except Exception as ex: @@ -463,10 +470,10 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT port setup rules try: rules += rules_set_up_port( - port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + port_id=port_id, port_type=PORT_TYPE_HOST, fwd_type=FORWARDING_TYPE_BRIDGING, - vlan_id=self.__int_vlan_id, + vlan_id=vlan_id, action=action ) except Exception as ex: @@ -476,13 +483,17 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT port forwarding rules try: rules += rules_set_up_fwd_bridging( - vlan_id=self.__int_vlan_id, - eth_dst=self.__int_collector_mac, - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + port_id=port_id, + vlan_id=vlan_id, + eth_dst=collector_mac_dst, + next_id=next_id, action=action ) - rules += rules_set_up_next_output_simple( - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=mac_src, + eth_dst=collector_mac_dst, action=action ) except Exception as ex: @@ -491,16 +502,16 @@ class P4FabricINTServiceHandler(_ServiceHandler): ### INT packet routing rules try: - rules += rules_set_up_next_routing_simple( - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], - eth_src=self.__switch_info[dev_name][MAC], - eth_dst=self.__int_collector_mac, + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, action=action ) rules += rules_set_up_routing( - ipv4_dst=self.__int_collector_ip, + port_id=port_id, + ipv4_dst=collector_ip_dst, ipv4_prefix_len=32, - egress_port=self.__switch_info[dev_name][PORT_INT][PORT_ID], + next_id=next_id, action=action ) except Exception as ex: @@ -587,13 +598,14 @@ class P4FabricINTServiceHandler(_ServiceHandler): return # Start the INT collector - c_id = None + c_uuid = None try: telemetry_frontend_client = TelemetryFrontendClient() c_id: CollectorId = telemetry_frontend_client.StartCollector(collect_int) # type: ignore - assert c_id.collector_id.uuid, "INT collector failed to start" + c_uuid = c_id.collector_id.uuid + assert c_uuid, "INT collector failed to start" except Exception as ex: LOGGER.error(f"INT collector cannot be initialized: Failed to start the collector {ex}") return - LOGGER.info(f"INT collector with ID {c_id.collector_id.uuid} is successfully invoked") + LOGGER.info(f"INT collector with ID {c_uuid} is successfully invoked") diff --git a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py deleted file mode 100644 index d2a13ef03..000000000 --- a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_config.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Common objects and methods for L2 forwarding based on the SD-Fabric dataplane model. -This dataplane covers both software based and hardware-based Stratum-enabled P4 switches, -such as the BMv2 software switch and Intel's Tofino/Tofino-2 switches. - -SD-Fabric repo: https://github.com/stratum/fabric-tna -SD-Fabric docs: https://docs.sd-fabric.org/master/index.html -""" - -from common.proto.context_pb2 import ConfigActionEnum - -from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * - -def rules_set_up_port_host( - port : int, - vlan_id : int, - action : ConfigActionEnum, # type: ignore - fwd_type=FORWARDING_TYPE_BRIDGING, - eth_type=ETHER_TYPE_IPV4): - # This is a host facing port - port_type = PORT_TYPE_HOST - - return rules_set_up_port( - port=port, - port_type=port_type, - fwd_type=fwd_type, - vlan_id=vlan_id, - action=action, - eth_type=eth_type - ) - -def rules_set_up_port_switch( - port : int, - vlan_id : int, - action : ConfigActionEnum, # type: ignore - fwd_type=FORWARDING_TYPE_BRIDGING, - eth_type=ETHER_TYPE_IPV4): - # This is a switch facing port - port_type = PORT_TYPE_SWITCH - - return rules_set_up_port( - port=port, - port_type=port_type, - fwd_type=fwd_type, - vlan_id=vlan_id, - action=action, - eth_type=eth_type - ) diff --git a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py index aa8bd6209..1c1818e56 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_l2_simple/p4_fabric_tna_l2_simple_service_handler.py @@ -28,8 +28,6 @@ from service.service.service_handler_api.SettingsHandler import SettingsHandler from service.service.service_handlers.p4_fabric_tna_commons.p4_fabric_tna_commons import * from service.service.task_scheduler.TaskExecutor import TaskExecutor -from .p4_fabric_tna_l2_simple_config import * - LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'p4_fabric_tna_l2_simple'}) @@ -411,6 +409,9 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): def _create_rules(self, device_obj : Device, port_id : int, action : ConfigActionEnum): # type: ignore dev_name = device_obj.name + # TODO: Fix + next_id = 2 if port_id == 1 else 1 + host_facing_port = self._is_host_facing_port(dev_name, port_id) LOGGER.info(f"\t | Service endpoint is host facing: {"True" if host_facing_port else "False"}") @@ -434,29 +435,46 @@ class P4FabricL2SimpleServiceHandler(_ServiceHandler): LOGGER.error("Error while creating port setup rules") raise Exception(ex) - fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) - for mac in fwd_list: - LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for host MAC: {mac}") + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) + for mac_dst in fwd_list: + LOGGER.info(f"Switch {dev_name} - Port {port_id} - Creating rule for destination MAC: {mac_dst}") try: ### Bridging rules rules += rules_set_up_fwd_bridging( + port_id=port_id, vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), - eth_dst=mac, - egress_port=port_id, + eth_dst=mac_dst, + next_id=next_id, action=action ) except Exception as ex: - LOGGER.error("Error while creating bridging rules") + LOGGER.error("Error while creating rule for bridging") raise Exception(ex) - try: - ### Next output rule - rules += rules_set_up_next_output_simple( - egress_port=port_id, - action=action - ) - except Exception as ex: - LOGGER.error("Error while creating next output L2 rules") - raise Exception(ex) + src_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + for mac_src in src_list: + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, + eth_src=mac_src, + eth_dst=mac_dst, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed profile") + raise Exception(ex) + + try: + ### Next hashed port + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed port") + raise Exception(ex) return rules diff --git a/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py index 4f6927829..730c7c790 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_l3/p4_fabric_tna_l3_service_handler.py @@ -341,6 +341,8 @@ class P4FabricL3ServiceHandler(_ServiceHandler): assert port_id >= 0, f"Switch {switch_name} - Invalid P4 switch port ID" port_type = port[PORT_TYPE] assert port_type in PORT_TYPES_STR_VALID, f"Switch {switch_name} - Valid P4 switch port types are: {','.join(PORT_TYPES_STR_VALID)}" + vlan_id = port[VLAN_ID] + assert chk_vlan_id(vlan_id), f"Switch {switch_name} - Invalid VLAN ID for port {port_id}" if switch_name not in self.__port_map: self.__port_map[switch_name] = {} @@ -349,6 +351,7 @@ class P4FabricL3ServiceHandler(_ServiceHandler): self.__port_map[switch_name][port_key] = {} self.__port_map[switch_name][port_key][PORT_ID] = port_id self.__port_map[switch_name][port_key][PORT_TYPE] = port_type + self.__port_map[switch_name][port_key][VLAN_ID] = vlan_id self.__port_map[switch_name][port_key][ROUTING_LIST] = [] # Routing list @@ -401,29 +404,97 @@ class P4FabricL3ServiceHandler(_ServiceHandler): return switch_entry[port_key] + def _get_port_type_of_switch_port(self, switch_name : str, port_id : int) -> str: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[PORT_TYPE] + + def _get_vlan_id_of_switch_port(self, switch_name : str, port_id : int) -> int: + switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) + return switch_port_entry[VLAN_ID] + def _get_routing_list_of_switch_port(self, switch_name : str, port_id : int) -> List [Tuple]: switch_port_entry = self._get_switch_port_in_port_map(switch_name, port_id) return switch_port_entry[ROUTING_LIST] + def _is_host_facing_port(self, switch_name : str, port_id : int) -> bool: + return self._get_port_type_of_switch_port(switch_name, port_id) == PORT_TYPE_HOST + def _create_rules(self, device_obj : Device, port_id : int, action : ConfigActionEnum): # type: ignore dev_name = device_obj.name + # TODO: Fix + next_id = 2 if port_id ==1 else 1 + + host_facing_port = self._is_host_facing_port(dev_name, port_id) + LOGGER.info(f"\t | Service endpoint is host facing: {"True" if host_facing_port else "False"}") + rules = [] + try: + ### Port setup rules + if host_facing_port: + rules += rules_set_up_port_host( + port=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + action=action + ) + else: + rules += rules_set_up_port_switch( + port=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating port setup rules") + raise Exception(ex) + ### Static routing rules - routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=port_id) + routing_list = self._get_routing_list_of_switch_port(switch_name=dev_name, port_id=next_id) for rt_entry in routing_list: try: - rules += rules_set_up_next_routing_simple( - egress_port=port_id, + ### Bridging rules + rules += rules_set_up_fwd_bridging( + port_id=port_id, + vlan_id=self._get_vlan_id_of_switch_port(switch_name=dev_name, port_id=port_id), + eth_dst=rt_entry[MAC_DST], + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for bridging") + raise Exception(ex) + + try: + ### Next profile for hashed routing + rules += rules_set_up_next_profile_hashed_routing( + port_id=port_id, + next_id=next_id, eth_src=rt_entry[MAC_SRC], eth_dst=rt_entry[MAC_DST], action=action ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed profile") + raise Exception(ex) + + try: + ### Next hashed port + rules += rules_set_up_next_hashed( + port_id=port_id, + next_id=next_id, + action=action + ) + except Exception as ex: + LOGGER.error("Error while creating rule for next hashed port") + raise Exception(ex) + + try: + # Routing destination rules += rules_set_up_routing( + port_id=port_id, ipv4_dst=rt_entry[IPV4_DST], ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py index feda2e79c..faea1d3d6 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_config.py @@ -120,7 +120,8 @@ QOS_TYPE_TO_DESC_MAP = { } -def rules_set_up_upf_interfaces( +def rules_set_up_upf_interface( + port_id : int, ipv4_dst : str, ipv4_prefix_len : int, gtpu_value : int, @@ -138,6 +139,15 @@ def rules_set_up_upf_interfaces( else: # Packet does not carry a GTP header (DL packet) action_name = "FabricIngress.upf.iface_core" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UPF interface") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IPv4 dst {ipv4_dst}") + LOGGER.info(f"================== IPv4 prefix {ipv4_prefix_len}") + LOGGER.info(f"================== GTP-U value {gtpu_value}") + LOGGER.info(f"================== Slice ID {slice_id}") + LOGGER.info(f"================== Action {action_name}") + rule_no = cache_rule(TABLE_UPF_INTERFACES, action) rules_upf_interfaces = [] @@ -176,6 +186,7 @@ def rules_set_up_upf_interfaces( ################################### def rules_set_up_upf_uplink_sessions( + port_id : int, tun_ip_address : str, teid : int, session_meter_id : int, @@ -184,6 +195,13 @@ def rules_set_up_upf_uplink_sessions( assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF uplink session" assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF uplink session" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UL session") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel IP {tun_ip_address}") + LOGGER.info(f"================== TEID {teid}") + LOGGER.info(f"================== Session meter ID {session_meter_id}") + rule_no = cache_rule(TABLE_UPF_UL_SESSIONS, action) rules_upf_ul_session = [] @@ -218,6 +236,7 @@ def rules_set_up_upf_uplink_sessions( return rules_upf_ul_session def rules_set_up_upf_uplink_terminations( + port_id : int, ue_session_id : str, app_id : int, ctr_id : int, @@ -230,6 +249,15 @@ def rules_set_up_upf_uplink_terminations( assert app_meter_id >= 0, "Invalid app meter identifier to configure UPF uplink termination" assert tc_id >= 0, "Invalid tc identifier to configure UPF uplink termination" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure UL termination") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== UE session ID {ue_session_id}") + LOGGER.info(f"================== App ID {app_id}") + LOGGER.info(f"================== Ctr ID {ctr_id}") + LOGGER.info(f"================== App meter ID {app_meter_id}") + LOGGER.info(f"================== TC ID {tc_id}") + rule_no = cache_rule(TABLE_UPF_UL_TERM, action) rules_upf_ul_termination = [] @@ -280,6 +308,7 @@ def rules_set_up_upf_uplink_terminations( ################################### def rules_set_up_upf_downlink_sessions( + port_id : int, ipv4_dst : str, session_meter_id : int, tun_peer_id : int, @@ -288,6 +317,13 @@ def rules_set_up_upf_downlink_sessions( assert session_meter_id >= 0, "Invalid session meter identifier to configure UPF downlink session" assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink session" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure DL session") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== IP dst {ipv4_dst}") + LOGGER.info(f"================== Session meter ID {session_meter_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + rule_no = cache_rule(TABLE_UPF_DL_SESSIONS, action) rules_upf_dl_session = [] @@ -322,6 +358,7 @@ def rules_set_up_upf_downlink_sessions( return rules_upf_dl_session def rules_set_up_upf_downlink_terminations( + port_id : int, ue_session_id : str, app_id : int, ctr_id : int, @@ -338,6 +375,17 @@ def rules_set_up_upf_downlink_terminations( assert teid >= 0, "Invalid tunnel endpoint identifier (TEID) to configure UPF downlink termination" assert qfi >= 0, "Invalid QoS flow identifier (QFI) to configure UPF downlink termination" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure DL termination") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== UE session ID {ue_session_id}") + LOGGER.info(f"================== App ID {app_id}") + LOGGER.info(f"================== Ctr ID {ctr_id}") + LOGGER.info(f"================== App meter ID {app_meter_id}") + LOGGER.info(f"================== TC ID {tc_id}") + LOGGER.info(f"================== TEID {teid}") + LOGGER.info(f"================== QFI {qfi}") + rule_no = cache_rule(TABLE_UPF_DL_TERM, action) rules_upf_dl_termination = [] @@ -388,12 +436,19 @@ def rules_set_up_upf_downlink_terminations( return rules_upf_dl_termination def rules_set_up_upf_downlink_ig_tunnel_peers( + port_id : int, tun_peer_id : int, tun_dst_addr : str, action : ConfigActionEnum) -> List [Tuple]: # type: ignore assert tun_peer_id >= 0, "Invalid tunnel peer identifier to configure UPF downlink ingress tunnel peers" assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink ingress tunnel peers" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure IG tunnel peer") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + LOGGER.info(f"================== Tunnel IP dst {tun_dst_addr}") + rule_no = cache_rule(TABLE_UPF_DL_IG_TUN_PEERS, action) rules_upf_dl_ig_tun_peers = [] @@ -424,6 +479,7 @@ def rules_set_up_upf_downlink_ig_tunnel_peers( return rules_upf_dl_ig_tun_peers def rules_set_up_upf_downlink_eg_tunnel_peers( + port_id : int, tun_peer_id : int, tun_src_addr : str, tun_dst_addr : str, @@ -434,6 +490,14 @@ def rules_set_up_upf_downlink_eg_tunnel_peers( assert chk_address_ipv4(tun_dst_addr), "Invalid tunnel destination IPv4 address to configure UPF downlink egress tunnel peers" assert chk_transport_port(tun_src_port), "Invalid tunnel source transport port to configure UPF downlink egress tunnel peers" + LOGGER.info("==================================================================================") + LOGGER.info("================== About to configure EG tunnel peer") + LOGGER.info(f"================== Port ID {port_id}") + LOGGER.info(f"================== Tunnel peer ID {tun_peer_id}") + LOGGER.info(f"================== Tunnel IP src {tun_src_addr}") + LOGGER.info(f"================== Tunnel IP dst {tun_dst_addr}") + LOGGER.info(f"================== Tunnel Port src {tun_src_port}") + rule_no = cache_rule(TABLE_UPF_DL_EG_TUN_PEERS, action) rules_upf_dl_eg_tun_peers = [] diff --git a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py index c378a0738..f9d4ca20f 100644 --- a/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py +++ b/src/service/service/service_handlers/p4_fabric_tna_upf/p4_fabric_tna_upf_service_handler.py @@ -661,7 +661,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): # Port setup rules try: rules += rules_set_up_port( - port=port_id, + port_id=port_id, port_type=PORT_TYPE_HOST, fwd_type=FORWARDING_TYPE_BRIDGING, vlan_id=vlan_id, @@ -673,7 +673,8 @@ class P4FabricUPFServiceHandler(_ServiceHandler): ### UPF rules try: - rules += rules_set_up_upf_interfaces( + rules += rules_set_up_upf_interface( + port_id=port_id, ipv4_dst=self.__upf[UPLINK_IP], # UPF's N3 interface ipv4_prefix_len=32, gtpu_value=GTPU_VALID, @@ -686,6 +687,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: rules += rules_set_up_upf_uplink_sessions( + port_id=port_id, tun_ip_address=self.__upf[UPLINK_IP], # UPF's N3 interface teid=self.__upf[TEID], session_meter_id=DEF_SESSION_METER_ID, @@ -699,6 +701,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): for _, ue_info in self.__ue_map.items(): try: rules += rules_set_up_upf_uplink_terminations( + port_id=port_id, ue_session_id=ue_info[UE_IP], # UE's IPv4 address app_id=self.__upf[APP_ID], ctr_id=self.__upf[CTR_ID], @@ -711,7 +714,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): raise Exception(ex) # L2 Forwarding rules - fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) for host_map in fwd_list: mac_dst = host_map[HOST_MAC] label = host_map[HOST_LABEL] @@ -719,9 +722,10 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Bridging rules rules += rules_set_up_fwd_bridging( + port_id=port_id, vlan_id=vlan_id, eth_dst=mac_dst, - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: @@ -731,6 +735,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Pre-next VLAN rule rules += rules_set_up_pre_next_vlan( + port_id=port_id, next_id=next_id, vlan_id=vlan_id, action=action @@ -747,7 +752,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Next profile for hashed routing rules += rules_set_up_next_profile_hashed_routing( - egress_port=port_id, + port_id=port_id, next_id=next_id, eth_src=rt_entry[MAC_SRC], # UPF's N6 interface (self.__upf[DOWNLINK_MAC]) eth_dst=rt_entry[MAC_DST], # Data network's N6 interface @@ -760,15 +765,16 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Next hashed for routing rules += rules_set_up_next_hashed( - egress_port=port_id, + port_id=port_id, next_id=next_id, action=action ) ### Route towards destination rules += rules_set_up_routing( + port_id=port_id, ipv4_dst=rt_entry[IPV4_DST], ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: @@ -791,7 +797,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): # Port setup try: rules += rules_set_up_port( - port=port_id, + port_id=port_id, port_type=PORT_TYPE_HOST, fwd_type=FORWARDING_TYPE_BRIDGING, vlan_id=vlan_id, @@ -804,7 +810,8 @@ class P4FabricUPFServiceHandler(_ServiceHandler): ### UPF for _, ue_info in self.__ue_map.items(): try: - rules += rules_set_up_upf_interfaces( + rules += rules_set_up_upf_interface( + port_id=port_id, ipv4_dst=ue_info[UE_IP], ipv4_prefix_len=32, gtpu_value=GTPU_INVALID, @@ -817,6 +824,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: rules += rules_set_up_upf_downlink_sessions( + port_id=port_id, ipv4_dst=ue_info[UE_IP], session_meter_id=ue_info[PDU_LIST][0][PDU_SESSION_ID], # Should match DEF_SESSION_METER_ID tun_peer_id=self.__upf[TUNNEL_PEER_ID], @@ -828,6 +836,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: rules += rules_set_up_upf_downlink_terminations( + port_id=port_id, ue_session_id=ue_info[UE_IP], # UE's IPv4 address app_id=self.__upf[APP_ID], ctr_id=self.__upf[CTR_ID], @@ -843,6 +852,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: rules += rules_set_up_upf_downlink_ig_tunnel_peers( + port_id=port_id, tun_peer_id=self.__upf[TUNNEL_PEER_ID], tun_dst_addr=self.__upf[UPLINK_IP], # UPF's N3 interface action=action @@ -853,6 +863,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: rules += rules_set_up_upf_downlink_eg_tunnel_peers( + port_id=port_id, tun_peer_id=self.__upf[TUNNEL_PEER_ID], tun_src_addr=self.__upf[UPLINK_IP], # UPF's N3 interface tun_dst_addr=self.__gnb[IP], # gNB's N3 interface @@ -864,7 +875,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): raise Exception(ex) # L2 Forwarding - fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=port_id) + fwd_list = self._get_fwd_list_of_switch_port(switch_name=dev_name, port_id=next_id) for host_map in fwd_list: mac_dst = host_map[HOST_MAC] label = host_map[HOST_LABEL] @@ -872,9 +883,10 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Bridging rules += rules_set_up_fwd_bridging( + port_id=port_id, vlan_id=vlan_id, eth_dst=mac_dst, - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: @@ -884,6 +896,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Pre-next VLAN rules += rules_set_up_pre_next_vlan( + port_id=port_id, next_id=next_id, vlan_id=vlan_id, action=action @@ -900,7 +913,7 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Next profile for hashed routing rules += rules_set_up_next_profile_hashed_routing( - egress_port=port_id, + port_id=port_id, next_id=next_id, eth_src=rt_entry[MAC_SRC], # UPF's N3 interface (self.__upf[UPLINK_MAC]) eth_dst=rt_entry[MAC_DST], # gNB's N3 interface (self.__gnb[MAC]) @@ -913,15 +926,16 @@ class P4FabricUPFServiceHandler(_ServiceHandler): try: ### Next hashed for routing rules += rules_set_up_next_hashed( - egress_port=port_id, + port_id=port_id, next_id=next_id, action=action ) ### Route towards destination rules += rules_set_up_routing( + port_id=port_id, ipv4_dst=rt_entry[IPV4_DST], ipv4_prefix_len=rt_entry[IPV4_PREFIX_LEN], - egress_port=port_id, + next_id=next_id, action=action ) except Exception as ex: diff --git a/src/telemetry/backend/service/collectors/int_collector/INTCollector.py b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py index 0f35882f0..84352f417 100644 --- a/src/telemetry/backend/service/collectors/int_collector/INTCollector.py +++ b/src/telemetry/backend/service/collectors/int_collector/INTCollector.py @@ -23,8 +23,6 @@ from datetime import datetime from telemetry.backend.service.collector_api._Collector import _Collector from scapy.all import * -import struct -import socket import ipaddress from .INTCollectorCommon import IntDropReport, IntLocalReport, IntFixedReport, FlowInfo, IPPacket, UDPPacket -- GitLab From 4a1869a2ce90caf49ff8a004c796f13e47e531b3 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Thu, 26 Feb 2026 17:43:46 +0200 Subject: [PATCH 338/371] feat: upgraded testing suite for P4 services --- .../run_test_04a_service_provision_l3.sh | 17 - .../run_test_04b_service_deprovision_l3.sh | 17 - .../run_test_05a_service_provision_acl.sh | 17 - .../run_test_05b_service_deprovision_acl.sh | 17 - .../run_test_06a_service_provision_int.sh | 17 - .../run_test_06b_service_deprovision_int.sh | 17 - .../p4-sd-fabric-sbi-connectivity/README.md | 185 + .../__init__.py | 0 .../descriptors/grafana-latency.json | 175 + .../descriptors/sbi-rules-insert-acl.json | 4 +- .../descriptors/sbi-rules-insert-int-b1.json | 4 +- .../descriptors/sbi-rules-insert-int-b2.json | 4 +- .../descriptors/sbi-rules-insert-int-b3.json | 4 +- .../sbi-rules-insert-routing-east.json | 4 +- .../sbi-rules-insert-routing-west.json | 4 +- .../descriptors/sbi-rules-remove.json | 4 +- .../descriptors/topology.json | 30 +- .../p4src/README.md | 0 .../p4src/_pp.p4 | 0 .../p4src/bmv2.json | 0 .../p4src/p4info.txt | 0 .../run_grafana_dashboard.sh | 79 + .../run_grafana_datasources.sh | 44 + .../run_test_01_bootstrap.sh | 2 +- .../run_test_02_sbi_provision.sh} | 2 +- .../run_test_03_sbi_deprovision.sh} | 2 +- .../run_test_04_cleanup.sh} | 2 +- .../run_test_05_purge.sh} | 2 +- .../setup.sh | 4 +- .../test_functional_bootstrap.py | 7 +- .../test_functional_cleanup.py | 5 +- .../test_functional_common.py | 78 + .../test_functional_purge.py | 0 .../test_functional_sbi_rules_deprovision.py | 17 +- .../test_functional_sbi_rules_provision.py | 22 +- .../README.md | 136 +- .../p4-sd-fabric-svc-connectivity/__init__.py | 13 + .../descriptors/grafana-latency.json | 175 + .../descriptors/service-p4-acl.json | 0 .../descriptors/service-p4-int.json | 4 +- .../descriptors/service-p4-l2.json} | 4 +- .../descriptors/service-p4-l3.json | 10 +- .../descriptors/topology.json | 113 + .../p4src/README.md | 24 + .../p4src/_pp.p4 | 2452 ++ .../p4src/bmv2.json | 28235 ++++++++++++++++ .../p4src/p4info.txt | 2482 ++ .../run_grafana_dashboard.sh | 79 + .../run_grafana_datasources.sh | 44 + .../run_test_01_bootstrap.sh | 21 + .../run_test_02_service_provision_int.sh | 17 + .../run_test_03_service_provision_l2.sh | 17 + .../run_test_04_service_provision_l3.sh | 17 + .../run_test_05_service_provision_acl.sh | 17 + .../run_test_06_service_deprovision_int.sh | 17 + .../run_test_07_service_deprovision_l2.sh | 17 + .../run_test_08_service_deprovision_l3.sh | 17 + .../run_test_09_service_deprovision_acl.sh | 17 + .../run_test_10_cleanup.sh} | 4 +- .../run_test_11_purge.sh | 17 + .../p4-sd-fabric-svc-connectivity/setup.sh | 22 + ...test_functional_service_deprovision_acl.py | 17 +- ...test_functional_service_deprovision_int.py | 17 +- .../test_functional_service_deprovision_l2.py | 17 +- .../test_functional_service_deprovision_l3.py | 17 +- .../test_functional_service_provision_acl.py | 31 +- .../test_functional_service_provision_int.py | 29 +- .../test_functional_service_provision_l2.py | 33 +- .../test_functional_service_provision_l3.py | 31 +- .../tests-setup/test_functional_bootstrap.py | 80 + .../tests-setup/test_functional_cleanup.py | 49 + .../tests-setup/test_functional_purge.py | 83 + src/tests/p4-sd-fabric-svc-upf/README.md | 158 + src/tests/p4-sd-fabric-svc-upf/__init__.py | 13 + .../p4-sd-fabric-svc-upf/descriptors/all.json | 134 + .../descriptors/context.json | 5 + .../descriptors/devices.json | 89 + .../descriptors/links.json | 40 + .../descriptors/send_descriptors_service.sh | 11 + .../descriptors/send_descriptors_topo.sh | 26 + .../descriptors/service-upf-ui.json | 144 + .../descriptors/service-upf.json | 140 + .../descriptors/topologies.json | 6 + .../p4-sd-fabric-svc-upf/p4src/README.md | 24 + src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 | 2452 ++ .../p4-sd-fabric-svc-upf/p4src/bmv2.json | 28235 ++++++++++++++++ .../p4-sd-fabric-svc-upf/p4src/p4info.txt | 2482 ++ .../run_test_01_bootstrap.sh | 21 + .../run_test_02_service_provision_upf.sh} | 4 +- .../run_test_03_service_deprovision_upf.sh | 17 + .../run_test_04_cleanup.sh | 17 + .../p4-sd-fabric-svc-upf/run_test_05_purge.sh | 17 + src/tests/p4-sd-fabric-svc-upf/setup.sh | 22 + ...test_functional_service_deprovision_upf.py | 88 + .../test_functional_service_provision_upf.py | 94 + .../tests-setup/test_functional_bootstrap.py | 80 + .../tests-setup/test_functional_cleanup.py | 48 + .../tests-setup/test_functional_purge.py | 83 + .../p4-sd-fabric-svc-upf/topology/README.md | 135 + .../topology/p4-switch-conf-common.sh | 19 + .../topology/p4-switch-setup.sh | 23 + .../topology/p4-switch-tear-down.sh | 17 + ...witch-three-port-chassis-config-phy.pb.txt | 46 + .../topology/pipeline_config.pb.txt | 2490 ++ .../topology/run-stratum.sh | 37 + src/tests/p4-topologies/README.md | 45 + .../topo-linux-ns}/README.md | 38 +- .../topo-linux-ns}/p4-switch-conf-common.sh | 6 +- .../topo-linux-ns}/p4-switch-setup.sh | 20 +- .../topo-linux-ns}/p4-switch-tear-down.sh | 4 +- ...witch-three-port-chassis-config-phy.pb.txt | 0 .../topo-linux-ns}/run-stratum.sh | 0 .../topo-mininet/1switch1path-int.py | 78 + .../topo-mininet/1switch1path.py | 65 + .../topo-mininet/3switch1path-int.py | 89 + .../topo-mininet/5switch3path-int.py | 102 + 116 files changed, 72442 insertions(+), 383 deletions(-) delete mode 100755 src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh delete mode 100755 src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh delete mode 100755 src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh delete mode 100755 src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh delete mode 100755 src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh delete mode 100755 src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/README.md rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/__init__.py (100%) create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-acl.json (94%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-int-b1.json (98%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-int-b2.json (99%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-int-b3.json (99%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-routing-east.json (99%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-insert-routing-west.json (99%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/sbi-rules-remove.json (99%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/descriptors/topology.json (78%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/p4src/README.md (100%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/p4src/_pp.p4 (100%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/p4src/bmv2.json (100%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/p4src/p4info.txt (100%) create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/run_test_01_bootstrap.sh (88%) rename src/tests/{p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh => p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh} (86%) rename src/tests/{p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh => p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh} (85%) rename src/tests/{p4-fabric-tna/run_test_08_purge.sh => p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh} (87%) rename src/tests/{p4-fabric-tna/run_test_07_cleanup.sh => p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh} (87%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-sbi-connectivity}/setup.sh (79%) rename src/tests/{p4-fabric-tna/tests-setup => p4-sd-fabric-sbi-connectivity}/test_functional_bootstrap.py (91%) rename src/tests/{p4-fabric-tna/tests-setup => p4-sd-fabric-sbi-connectivity}/test_functional_cleanup.py (88%) create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py rename src/tests/{p4-fabric-tna/tests-setup => p4-sd-fabric-sbi-connectivity}/test_functional_purge.py (100%) rename src/tests/{p4-fabric-tna/tests-sbi => p4-sd-fabric-sbi-connectivity}/test_functional_sbi_rules_deprovision.py (91%) rename src/tests/{p4-fabric-tna/tests-sbi => p4-sd-fabric-sbi-connectivity}/test_functional_sbi_rules_provision.py (94%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/README.md (61%) create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/__init__.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/descriptors/service-p4-acl.json (100%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/descriptors/service-p4-int.json (94%) rename src/tests/{p4-fabric-tna/descriptors/service-p4-l2-simple.json => p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json} (95%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/descriptors/service-p4-l3.json (93%) create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh rename src/tests/{p4-fabric-tna/run_test_03a_service_provision_l2.sh => p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh} (77%) create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh create mode 100755 src/tests/p4-sd-fabric-svc-connectivity/setup.sh rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_deprovision_acl.py (92%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_deprovision_int.py (92%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_deprovision_l2.py (92%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_deprovision_l3.py (92%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_provision_acl.py (84%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_provision_int.py (85%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_provision_l2.py (82%) rename src/tests/{p4-fabric-tna => p4-sd-fabric-svc-connectivity}/tests-service/test_functional_service_provision_l3.py (84%) create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/README.md create mode 100644 src/tests/p4-sd-fabric-svc-upf/__init__.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/all.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/context.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/links.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/p4src/README.md create mode 100644 src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 create mode 100644 src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json create mode 100644 src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt create mode 100755 src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh rename src/tests/{p4-fabric-tna/run_test_03b_service_deprovision_l2.sh => p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh} (77%) create mode 100755 src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh create mode 100755 src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh create mode 100755 src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh create mode 100755 src/tests/p4-sd-fabric-svc-upf/setup.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/README.md create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt create mode 100644 src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh create mode 100644 src/tests/p4-topologies/README.md rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/README.md (86%) rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/p4-switch-conf-common.sh (84%) rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/p4-switch-setup.sh (83%) rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/p4-switch-tear-down.sh (96%) rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/p4-switch-three-port-chassis-config-phy.pb.txt (100%) rename src/tests/{p4-fabric-tna/topology => p4-topologies/topo-linux-ns}/run-stratum.sh (100%) create mode 100755 src/tests/p4-topologies/topo-mininet/1switch1path-int.py create mode 100755 src/tests/p4-topologies/topo-mininet/1switch1path.py create mode 100755 src/tests/p4-topologies/topo-mininet/3switch1path-int.py create mode 100755 src/tests/p4-topologies/topo-mininet/5switch3path-int.py diff --git a/src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh b/src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh deleted file mode 100755 index 6bec4a892..000000000 --- a/src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py diff --git a/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh b/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh deleted file mode 100755 index eeb64cdd2..000000000 --- a/src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py diff --git a/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh b/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh deleted file mode 100755 index cbc0d3a25..000000000 --- a/src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh b/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh deleted file mode 100755 index 253b51622..000000000 --- a/src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh b/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh deleted file mode 100755 index c3e1b2855..000000000 --- a/src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py diff --git a/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh b/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh deleted file mode 100755 index 5e3b1a5ff..000000000 --- a/src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/README.md b/src/tests/p4-sd-fabric-sbi-connectivity/README.md new file mode 100644 index 000000000..0ff0ee6ed --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/README.md @@ -0,0 +1,185 @@ +# Tests for P4 routing, ACL, and In-Band Network Telemetry functions via TFS SBI + +This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 whitebox that performs a set of network functions, including forwarding (L2), routing (L3), L3/L4 access control list (ACL), and In-Band Network Telemetry (INT). +The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) + +## Prerequisites + +You need Python3, which should already be installed while preparing for a TFS build. +Additionally, `pytest` is also mandatory as it is used by our tests below. +Aliasing python with python3 will also help bridging issues between older and newer python versions. + +```shell +alias python='python3' +pip3 install pytest +pip3 install grpclib protobuf +pip3 install grpcio-tools +``` + +The versions used for this test are: + +- `protobuf` 3.20.3 +- `grpclib` 0.4.4 +- `grpcio` 1.47.5 +- `grpcio-tools` 1.47.5 + +After the installation of `grpclib`, protoc-gen-grpclib_python binary is in /home/$USER/.local/bin/ +First we copy it to /usr/local/bin/: + +```shell + sudo cp /home/$USER/.local/bin/protoc-gen-grpclib_python /usr/local/bin/ +``` + +Then, we include this path to the PYTHONPATH: + +```shell +export PYTHONPATH="${PYTHONPATH}:/usr/local/bin/protoc-gen-grpclib_python" +``` + +You need to build and deploy a software-based Stratum switch, before being able to use TFS to control it. +To do so, follow the instructions in the `./topology` folder. + +## Steps to setup and run a TFS program atop Stratum + +To conduct this test, follow the steps below. + +### Deploy TFS + +Go to the TFS parent folder. + +```shell +cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service kpi_manager kpi_value_writer kpi_value_api telemetry nbi webui"` +``` + +```shell +source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell +./deploy/all.sh +``` + +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + +### Path setup + +Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". + +Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src" + +## Topology setup + +Go to `src/tests/p4-topologies/` and follow the instructions on how to install Mininet in your machine. +After Mininet is installed, run the following command to deploy a single switch P4 topology on Mininet. + +```bash +cd ~/tfs-ctrl/src/tests/p4-topologies/topo-mininet/ +sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 +``` + +You may need to change the `host-int-iface` to a network interface that suits your setup. +This is the interface through which Mininet sends in-band network telemetry packets to TFS. + +## P4 artifacts + +In the `./p4src/` directory there are compiled P4 artifacts of the pipeline that will be pushed to the P4 switch, along with the P4-runtime definitions. +The `./setup.sh` script copies from this directory. If you need to change the P4 program, make sure to put the compiled artifacts there. + +## Tests + +A set of tests is implemented, each focusing on different aspects of TFS. +For each of these tests, an auxiliary bash script allows to run it with less typing. + +| Bash Runner | Purpose | +| -------------------------------------------- | --------------------------------------------------------------------------- | +| setup.sh | Copy P4 artifacts into the SBI pod | +| run_test_01_bootstrap.sh | Connect TFS to the P4 switch | +| run_test_02_sbi_provision_int_l2_l3_acl.sh | Install L2, L3, INT, and ACL rules on the P4 switch via the SBI service | +| run_test_03_sbi_deprovision_int_l2_l3_acl.sh | Uninstall L2, L3, INT, and ACL rules from the P4 switch via the SBI service | +| run_test_04_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | + +Each of the tests above is described in detail below. + +### Step 0: Copy the necessary P4 artifacts into the TFS SBI service pod + +The setup script copies the necessary artifacts to the SBI service pod. +It should be run just once, after a fresh install of TFS. +If you `deploy/all.sh` again, you need to repeat this step. + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +bash src/tests/p4-sd-fabric-sbi-connectivity/setup.sh +``` + +### Step 1: Bootstrap topology + +The bootstrap script registers the context, topology, links, and devices to TFS. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh +``` + +### Step 2: Provision L2, L3, ACL, and INT via the SBI API + +Implement forwarding, routing, ACL, and INT network functions by installing P4 rules to the Stratum switch via the TFS SBI API. +In this test, these rules are installed in batches, as the switch cannot digest all these rules at once. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision_int_l2_l3_acl.sh +``` + +To observe the telemetry coming from Mininet, you may configure Prometheus and Grafana as follows. +First, connect TFS Grafana with the Prometheus data source, after you modify `TFS_IP` variable in the following script: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh +``` + +Then, publish a dashboard showing the switch latency, after you ensure that the `DASHBOARD_FILE` variable in the following script points to the correct file in your filesystem. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh +``` + +### Step 3: Deprovision L2, L3, ACL, and INT via the SBI API + +Deprovision forwarding, routing, ACL, and INT network functions by removing the previously installed P4 rules (via the TFS SBI API) from the Stratum switch. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision_int_l2_l3_acl.sh +``` + +### Step 4: Deprovision topology + +Delete all the objects (context, topology, links, devices) from TFS: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh +``` + +Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh +``` diff --git a/src/tests/p4-fabric-tna/__init__.py b/src/tests/p4-sd-fabric-sbi-connectivity/__init__.py similarity index 100% rename from src/tests/p4-fabric-tna/__init__.py rename to src/tests/p4-sd-fabric-sbi-connectivity/__init__.py diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json new file mode 100644 index 000000000..e02d1cc26 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json @@ -0,0 +1,175 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.22" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "Latency", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 17, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 20, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 17, + "w": 23, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg(KPISAMPLETYPE_INT_HOP_LAT_SW01)", + "refId": "A" + } + ], + "title": "P4 switch latency", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Latency", + "uid": "VefdTgZvk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json similarity index 94% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json index 97a548983..9fd750539 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-acl.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-acl.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json similarity index 98% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json index 3fc9a7173..b260c5a4c 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b1.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json similarity index 99% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json index e6b5a8ea8..1ddf941cb 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b2.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json similarity index 99% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json index f8d2c7183..d4d8a92fd 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-int-b3.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json similarity index 99% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json index 0fe8b5036..f0c438568 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-east.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json similarity index 99% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json index c48d9d31e..2d5b9e080 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-insert-routing-west.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json similarity index 99% rename from src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json index 68132e9e6..b2b3b429f 100644 --- a/src/tests/p4-fabric-tna/descriptors/sbi-rules-remove.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json @@ -3,10 +3,10 @@ { "device_id": { "device_uuid": { - "uuid": "p4-sw1" + "uuid": "sw1" } }, - "name": "p4-sw1", + "name": "sw1", "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", "device_config": { "config_rules": [ diff --git a/src/tests/p4-fabric-tna/descriptors/topology.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json similarity index 78% rename from src/tests/p4-fabric-tna/descriptors/topology.json rename to src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json index a8cc72ae2..420cc8f0f 100644 --- a/src/tests/p4-fabric-tna/descriptors/topology.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/topology.json @@ -10,8 +10,8 @@ { "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "name": "tfs-sdn-controller", - "device_type": "ietf-slice", - "device_drivers": ["DEVICEDRIVER_IETF_SLICE"], + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", "device_config": {"config_rules": [ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, @@ -22,8 +22,8 @@ ]} }, { - "device_id": {"device_uuid": {"uuid": "west-net"}}, - "device_type": "network", + "device_id": {"device_uuid": {"uuid": "h1"}}, + "device_type": "emu-client", "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_config": { "config_rules": [ @@ -36,8 +36,8 @@ } }, { - "device_id": {"device_uuid": {"uuid": "east-net"}}, - "device_type": "network", + "device_id": {"device_uuid": {"uuid": "h2"}}, + "device_type": "emu-client", "device_drivers": ["DEVICEDRIVER_UNDEFINED"], "device_config": { "config_rules": [ @@ -80,31 +80,31 @@ ], "links": [ { - "link_id": {"link_uuid": {"uuid": "sw1/1==west-net/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + "link_id": {"link_uuid": {"uuid": "sw1/1==h1/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}}, - {"device_id": {"device_uuid": {"uuid": "west-net"}}, "endpoint_uuid": {"uuid": "eth1"}} + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "west-net/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "west-net"}}, "endpoint_uuid": {"uuid": "eth1"}}, + "link_id": {"link_uuid": {"uuid": "h1/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}}, {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "sw1/2==east-net/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + "link_id": {"link_uuid": {"uuid": "sw1/2==h2/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}}, - {"device_id": {"device_uuid": {"uuid": "east-net"}}, "endpoint_uuid": {"uuid": "eth1"}} + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}} ] }, { - "link_id": {"link_uuid": {"uuid": "east-net/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "east-net"}}, "endpoint_uuid": {"uuid": "eth1"}}, + "link_id": {"link_uuid": {"uuid": "h2/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}}, {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}} ] }, { - "link_id": {"link_uuid": {"uuid": "sw1/3==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_VIRTUAL", "link_endpoint_ids": [ + "link_id": {"link_uuid": {"uuid": "sw1/3==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "3"}}, {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} ] diff --git a/src/tests/p4-fabric-tna/p4src/README.md b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/README.md similarity index 100% rename from src/tests/p4-fabric-tna/p4src/README.md rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/README.md diff --git a/src/tests/p4-fabric-tna/p4src/_pp.p4 b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/_pp.p4 similarity index 100% rename from src/tests/p4-fabric-tna/p4src/_pp.p4 rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/_pp.p4 diff --git a/src/tests/p4-fabric-tna/p4src/bmv2.json b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json similarity index 100% rename from src/tests/p4-fabric-tna/p4src/bmv2.json rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json diff --git a/src/tests/p4-fabric-tna/p4src/p4info.txt b/src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt similarity index 100% rename from src/tests/p4-fabric-tna/p4src/p4info.txt rename to src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh new file mode 100644 index 000000000..0664cc6cd --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_dashboard.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# ----------------------------------- +# CONFIGURATION +# ----------------------------------- + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +DASHBOARD_FILE="/home/ubuntu/tfs-ctrl/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/grafana-latency.json" # Path to your dashboard JSON + +# ----------------------------------- +# READ DASHBOARD JSON +# ----------------------------------- +if [ ! -f "$DASHBOARD_FILE" ]; then + echo "[ERROR] Dashboard file not found: $DASHBOARD_FILE" + exit 1 +fi + +DASHBOARD_JSON=$(cat "$DASHBOARD_FILE") + +# --------------------------------------- +# 1. Get the datasource UID +# --------------------------------------- + +PROM_UID=$(curl -s \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + "${GRAFANA_URL}/api/datasources/name/${DATASOURCE_NAME}" \ + | jq -r '.uid') + +if [ -z "$PROM_UID" ] || [ "$PROM_UID" == "null" ]; then + echo "ERROR: Could not retrieve datasource UID. Check datasource name/auth." + exit 1 +fi + +echo "Found datasource UID: $PROM_UID" + +# --------------------------------------- +# 2. Inject the UID into dashboard JSON +# --------------------------------------- + +DASHBOARD_JSON=$(jq --arg uid "$PROM_UID" ' + walk( + if type == "object" and has("datasource") then + .datasource |= + (if type == "object" then .uid = $uid else $uid end) + else . + end + ) +' "$DASHBOARD_FILE") + +# --------------------------------------- +# 3. Wrap in Grafana API import format +# --------------------------------------- + +read -r -d '' IMPORT_JSON << EOF +{ + "dashboard": ${DASHBOARD_JSON}, + "overwrite": true, + "folderId": 0, + "message": "Imported via API" +} +EOF + +# ----------------------------------- +# 4. Import dashboard using API +# ----------------------------------- + +echo "Importing dashboard into Grafana..." + +curl -X POST "${GRAFANA_URL}/api/dashboards/db" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${IMPORT_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh new file mode 100644 index 000000000..2e82eebe5 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_grafana_datasources.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# --------------------------- +# CONFIGURATION +# --------------------------- + +TFS_IP="192.168.5.137" + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +PROMETHEUS_URL="http://${TFS_IP}:30090/" # URL of your Prometheus server + +# --------------------------- +# CREATE DATA SOURCE PAYLOAD +# --------------------------- + +read -r -d '' DATA_SOURCE_JSON << EOF +{ + "name": "${DATASOURCE_NAME}", + "type": "prometheus", + "access": "proxy", + "url": "${PROMETHEUS_URL}", + "basicAuth": false, + "isDefault": true, + "editable": true +} +EOF + +# --------------------------- +# SEND REQUEST (with username/password) +# --------------------------- + +echo "Creating Prometheus datasource in Grafana..." + +curl -X POST "${GRAFANA_URL}/api/datasources" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${DATA_SOURCE_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-fabric-tna/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh similarity index 88% rename from src/tests/p4-fabric-tna/run_test_01_bootstrap.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh index 7bef3a448..d2a119b19 100755 --- a/src/tests/p4-fabric-tna/run_test_01_bootstrap.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_01_bootstrap.sh @@ -18,4 +18,4 @@ # - tfs_runtime_env_vars.sh source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py diff --git a/src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh similarity index 86% rename from src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh index 4ddb1e41d..a325682e4 100755 --- a/src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_02_sbi_provision.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py diff --git a/src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh similarity index 85% rename from src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh index af54c2cae..570f73d27 100755 --- a/src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_03_sbi_deprovision.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py diff --git a/src/tests/p4-fabric-tna/run_test_08_purge.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh similarity index 87% rename from src/tests/p4-fabric-tna/run_test_08_purge.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh index 159133530..bf0aaddee 100755 --- a/src/tests/p4-fabric-tna/run_test_08_purge.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_04_cleanup.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py diff --git a/src/tests/p4-fabric-tna/run_test_07_cleanup.sh b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh similarity index 87% rename from src/tests/p4-fabric-tna/run_test_07_cleanup.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh index 74db934a8..e9a221fa9 100755 --- a/src/tests/p4-fabric-tna/run_test_07_cleanup.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/run_test_05_purge.sh @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py diff --git a/src/tests/p4-fabric-tna/setup.sh b/src/tests/p4-sd-fabric-sbi-connectivity/setup.sh similarity index 79% rename from src/tests/p4-fabric-tna/setup.sh rename to src/tests/p4-sd-fabric-sbi-connectivity/setup.sh index d5f080e6d..a8b1a881e 100755 --- a/src/tests/p4-fabric-tna/setup.sh +++ b/src/tests/p4-sd-fabric-sbi-connectivity/setup.sh @@ -18,5 +18,5 @@ export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 -kubectl cp src/tests/p4-fabric-tna/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server -kubectl cp src/tests/p4-fabric-tna/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-sbi-connectivity/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-sbi-connectivity/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py similarity index 91% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py index 7c4a6c7a0..eedcb9951 100644 --- a/src/tests/p4-fabric-tna/tests-setup/test_functional_bootstrap.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py @@ -19,7 +19,8 @@ from common.tools.descriptor.Loader import DescriptorLoader, \ from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID, DESC_TOPO +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -36,8 +37,10 @@ def test_scenario_bootstrap( """ validate_empty_scenario(context_client) + LOGGER.info(f"------> TOPOLOGY: {DESC_TOPOLOGY}") + descriptor_loader = DescriptorLoader( - descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client) + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) descriptor_loader.validate() diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py similarity index 88% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py index fe197de54..41897fb0a 100644 --- a/src/tests/p4-fabric-tna/tests-setup/test_functional_cleanup.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py @@ -17,7 +17,8 @@ from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scen from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID, DESC_TOPO +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -33,7 +34,7 @@ def test_scenario_cleanup( # Unload topology and validate empty scenario descriptor_loader = DescriptorLoader( - descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client) + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) descriptor_loader.validate() descriptor_loader.unload() validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py new file mode 100644 index 000000000..8e1b761a5 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_common.py @@ -0,0 +1,78 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +DEV_NB = 4 +CONNECTION_RULES = 3 +ENDPOINT_RULES = 3 + +INT_RULES = 19 +L2_RULES = 10 +L3_RULES = 4 +ACL_RULES = 1 + +DATAPLANE_RULES_NB_INT_B1 = 5 +DATAPLANE_RULES_NB_INT_B2 = 6 +DATAPLANE_RULES_NB_INT_B3 = 8 +DATAPLANE_RULES_NB_RT_WEST = 7 +DATAPLANE_RULES_NB_RT_EAST = 7 +DATAPLANE_RULES_NB_ACL = 1 +DATAPLANE_RULES_NB_TOT = \ + DATAPLANE_RULES_NB_INT_B1 +\ + DATAPLANE_RULES_NB_INT_B2 +\ + DATAPLANE_RULES_NB_INT_B3 +\ + DATAPLANE_RULES_NB_RT_WEST +\ + DATAPLANE_RULES_NB_RT_EAST +\ + DATAPLANE_RULES_NB_ACL + +TEST_PATH = os.path.join( + os.path.dirname(os.path.abspath(__file__)) + + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to P4 SD-Fabric tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the SD-Fabric topology descriptor" + +# SBI descriptors for Rule INSERTION +# The switch cannot digest all rules at once, hence we insert in batches +DESC_FILE_RULES_INSERT_INT_B1 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b1.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B1),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #1)" + +DESC_FILE_RULES_INSERT_INT_B2 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b2.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B2),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #2)" + +DESC_FILE_RULES_INSERT_INT_B3 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b3.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B3),\ + "Invalid path to the SD-Fabric INT SBI descriptor (batch #3)" + +DESC_FILE_RULES_INSERT_ROUTING_WEST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-west.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_WEST),\ + "Invalid path to the SD-Fabric routing SBI descriptor (domain1-side)" + +DESC_FILE_RULES_INSERT_ROUTING_EAST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-east.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_EAST),\ + "Invalid path to the SD-Fabric routing SBI descriptor (domain2-side)" + +DESC_FILE_RULES_INSERT_ACL = os.path.join(TEST_PATH, 'sbi-rules-insert-acl.json') +assert os.path.exists(DESC_FILE_RULES_INSERT_ACL),\ + "Invalid path to the SD-Fabric ACL SBI descriptor" + +# SBI descriptors for Rule DELETION +DESC_FILE_RULES_DELETE_ALL = os.path.join(TEST_PATH, 'sbi-rules-remove.json') +assert os.path.exists(DESC_FILE_RULES_DELETE_ALL),\ + "Invalid path to the SD-Fabric rule removal SBI descriptor" diff --git a/src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py similarity index 100% rename from src/tests/p4-fabric-tna/tests-setup/test_functional_purge.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py diff --git a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py similarity index 91% rename from src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py index 4fbf182c5..8bf3b8c90 100644 --- a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_deprovision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py @@ -18,21 +18,8 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_RULES_DELETE_ALL, - DEV_NB, - CONNECTION_RULES, - ENDPOINT_RULES, - DATAPLANE_RULES_NB_INT_B1, - DATAPLANE_RULES_NB_INT_B2, - DATAPLANE_RULES_NB_INT_B3, - DATAPLANE_RULES_NB_RT_WEST, - DATAPLANE_RULES_NB_RT_EAST, - DATAPLANE_RULES_NB_ACL, - DATAPLANE_RULES_NB_TOT, - verify_number_of_rules -) +from tests.tools.test_tools_p4 import * +from test_functional_common import * LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py similarity index 94% rename from src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py rename to src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py index 08b9e2f5e..ba45ad8bc 100644 --- a/src/tests/p4-fabric-tna/tests-sbi/test_functional_sbi_rules_provision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py @@ -18,26 +18,8 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from tests.Fixtures import context_client, device_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_RULES_INSERT_INT_B1, - DESC_FILE_RULES_INSERT_INT_B2, - DESC_FILE_RULES_INSERT_INT_B3, - DESC_FILE_RULES_INSERT_ROUTING_WEST, - DESC_FILE_RULES_INSERT_ROUTING_EAST, - DESC_FILE_RULES_INSERT_ACL, - DEV_NB, - CONNECTION_RULES, - ENDPOINT_RULES, - DATAPLANE_RULES_NB_INT_B1, - DATAPLANE_RULES_NB_INT_B2, - DATAPLANE_RULES_NB_INT_B3, - DATAPLANE_RULES_NB_RT_WEST, - DATAPLANE_RULES_NB_RT_EAST, - DATAPLANE_RULES_NB_ACL, - DATAPLANE_RULES_NB_TOT, - verify_number_of_rules -) +from tests.tools.test_tools_p4 import * +from test_functional_common import * LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/README.md b/src/tests/p4-sd-fabric-svc-connectivity/README.md similarity index 61% rename from src/tests/p4-fabric-tna/README.md rename to src/tests/p4-sd-fabric-svc-connectivity/README.md index e8ae8fde9..e828cb11f 100644 --- a/src/tests/p4-fabric-tna/README.md +++ b/src/tests/p4-sd-fabric-svc-connectivity/README.md @@ -1,4 +1,4 @@ -# Tests for P4 routing, ACL, and In-Band Network Telemetry functions +# Tests for P4 routing, ACL, and In-Band Network Telemetry functions via TFS Service API This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 whitebox that performs a set of network functions, including forwarding (L2), routing (L3), L3/L4 access control list (ACL), and In-Band Network Telemetry (INT). The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) @@ -45,12 +45,35 @@ To conduct this test, follow the steps below. ### Deploy TFS +Go to the TFS parent folder. + ```shell cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service kpi_manager kpi_value_writer kpi_value_api telemetry nbi webui"` +``` + +```shell source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell ./deploy/all.sh ``` +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + ### Path setup Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". @@ -59,8 +82,16 @@ Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g ## Topology setup -In the `./topology/` directory there are scripts that allow to build Stratum on a target machine (e.g., a VM) and then deploy a P4 switch atop this machine. -This test assumes a Stratum P4 switch with 2 network interfaces used as a data plane (routing traffic from one to another) as well as another network interface used to send telemetry information to an external telemetry collector. +Go to `src/tests/p4-topologies/` and follow the instructions on how to install Mininet in your machine. +After Mininet is installed, run the following command to deploy a single switch P4 topology on Mininet. + +```bash +cd ~/tfs-ctrl/src/tests/p4-topologies/topo-mininet/ +sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 +``` + +You may need to change the `host-int-iface` to a network interface that suits your setup. +This is the interface through which Mininet sends in-band network telemetry packets to TFS. ## P4 artifacts @@ -76,17 +107,15 @@ For each of these tests, an auxiliary bash script allows to run it with less typ | --------------------------------------------- | --------------------------------------------------------------------------- | | setup.sh | Copy P4 artifacts into the SBI pod | | run_test_01_bootstrap.sh | Connect TFS to the P4 switch | -| run_test_02a_sbi_provision_int_l2_l3_acl.sh | Install L2, L3, INT, and ACL rules on the P4 switch via the SBI service | -| run_test_02b_sbi_deprovision_int_l2_l3_acl.sh | Uninstall L2, L3, INT, and ACL rules from the P4 switch via the SBI service | -| run_test_03a_service_provision_l2.sh | Install L2 forwarding rules via a dedicated P4 L2 service handler | -| run_test_03b_service_deprovision_l2.sh | Uninstall L2 forwarding rules via a dedicated P4 L2 service handler | -| run_test_04a_service_provision_l3.sh | Install L3 routing rules via a dedicated P4 L3 service handler | -| run_test_04b_service_deprovision_l3.sh | Uninstall L3 routing rules via a dedicated P4 L3 service handler | -| run_test_05a_service_provision_acl.sh | Install ACL rules via a dedicated P4 ACL service handler | -| run_test_05b_service_deprovision_acl.sh | Uninstall ACL rules via a dedicated P4 ACL service handler | -| run_test_06a_service_provision_int.sh | Install INT rules via a dedicated P4 INT service handler | -| run_test_06b_service_deprovision_int.sh | Uninstall INT rules via a dedicated P4 INT service handler | -| run_test_07_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | +| run_test_02_service_provision_int.sh | Install INT rules via a dedicated P4 INT service handler | +| run_test_03_service_provision_l2.sh | Install L2 forwarding rules via a dedicated P4 L2 service handler | +| run_test_04_service_provision_l3.sh | Install L3 routing rules via a dedicated P4 L3 service handler | +| run_test_05_service_provision_acl.sh | Install ACL rules via a dedicated P4 ACL service handler | +| run_test_06_service_deprovision_int.sh | Uninstall INT rules via a dedicated P4 INT service handler | +| run_test_07_service_deprovision_l2.sh | Uninstall L2 forwarding rules via a dedicated P4 L2 service handler | +| run_test_08_service_deprovision_l3.sh | Uninstall L3 routing rules via a dedicated P4 L3 service handler | +| run_test_09_service_deprovision_acl.sh | Uninstall ACL rules via a dedicated P4 ACL service handler | +| run_test_10_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | Each of the tests above is described in detail below. @@ -99,7 +128,7 @@ If you `deploy/all.sh` again, you need to repeat this step. ```shell cd ~/tfs-ctrl/ source my_deploy.sh && source tfs_runtime_env_vars.sh -bash src/tests/p4-fabric-tna/setup.sh +bash src/tests/p4-sd-fabric-svc-connectivity/setup.sh ``` ### Step 1: Bootstrap topology @@ -108,85 +137,50 @@ The bootstrap script registers the context, topology, links, and devices to TFS. ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_01_bootstrap.sh -``` - -### Step 2: Manage L2, L3, ACL, and INT via the SBI API (rules) - -Implement forwarding, routing, ACL, and INT network functions by installing P4 rules to the Stratum switch via the TFS SBI API. -In this test, these rules are installed in batches, as the switch cannot digest all these rules at once. - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_02a_sbi_provision_int_l2_l3_acl.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh ``` -Deprovision forwarding, routing, ACL, and INT network functions by removing the previously installed P4 rules (via the TFS SBI API) from the Stratum switch. - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_02b_sbi_deprovision_int_l2_l3_acl.sh -``` - -### Step 3: Manage L2, L3, ACL, and INT via the Service API +### Step 2: Manage L2, L3, ACL, and INT via the Service API To avoid interacting with the switch using low-level P4 rules (via the SBI), we created modular network services, which allow users to easily provision L2, L3, ACL, and INT network functions. These services require users to define the service endpoints as well as some high-level service configuration, while leaving the rest of complexity to tailored service handlers that interact with the SBI on behalf of the user. -#### Provision L2 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh -``` - -#### Deprovision L2 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh -``` - -#### Provision L3 network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_04a_service_provision_l3.sh -``` - -#### Deprovision L3 network service via the Service API +#### Provision L2 + INT + ACL network services via the Service API ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_04b_service_deprovision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh ``` -#### Provision ACL network service via the Service API - -```shell -cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_05a_service_provision_acl.sh -``` +#### Provision L3 + INT + ACL network services via the Service API -#### Deprovision ACL network service via the Service API +Alternatively, you can replace L2 with L3 connectivity as follows: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_05b_service_deprovision_acl.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh ``` -#### Provision INT service via the Service API +#### Deprovision L2 + INT + ACL network services via the Service API ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_06a_service_provision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh ``` -#### Deprovision INT service via the Service API +And for the corresponding L3 service: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_06b_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh ``` ### Step 4: Deprovision topology @@ -195,12 +189,12 @@ Delete all the objects (context, topology, links, devices) from TFS: ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_07_cleanup.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh ``` Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. ```shell cd ~/tfs-ctrl/ -bash src/tests/p4-fabric-tna/run_test_08_purge.sh +bash src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh ``` diff --git a/src/tests/p4-sd-fabric-svc-connectivity/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/__init__.py new file mode 100644 index 000000000..7363515f0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json new file mode 100644 index 000000000..e02d1cc26 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json @@ -0,0 +1,175 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.22" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "Latency", + "axisPlacement": "left", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 17, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 20, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 4, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ns" + }, + "overrides": [] + }, + "gridPos": { + "h": 17, + "w": 23, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "expr": "avg(KPISAMPLETYPE_INT_HOP_LAT_SW01)", + "refId": "A" + } + ], + "title": "P4 switch latency", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Latency", + "uid": "VefdTgZvk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-acl.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-acl.json similarity index 100% rename from src/tests/p4-fabric-tna/descriptors/service-p4-acl.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-acl.json diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-int.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json similarity index 94% rename from src/tests/p4-fabric-tna/descriptors/service-p4-int.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json index 1a55179ad..1538f29d1 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-int.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-int.json @@ -40,8 +40,8 @@ ], "int_collector_info": { "iface": "eth0", - "mac": "3e:87:de:3d:6d:33", - "ip": "192.168.5.131", + "mac": "46:e4:58:c6:74:53", + "ip": "192.168.5.137", "port": 12345, "vlan_id": 4094, "duration_sec": 2000, diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json similarity index 95% rename from src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json index 8ecc2df96..d943dfb6b 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-l2-simple.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l2.json @@ -2,11 +2,11 @@ "services": [ { "service_id": { - "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "p4-service-l2"} + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-l2"} }, "name": "p4-service-l2", "service_type": "SERVICETYPE_L2NM", - "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, "service_endpoint_ids": [ { "device_id": {"device_uuid": {"uuid": "sw1"}}, diff --git a/src/tests/p4-fabric-tna/descriptors/service-p4-l3.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json similarity index 93% rename from src/tests/p4-fabric-tna/descriptors/service-p4-l3.json rename to src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json index 6fda23e80..1e2c0e84f 100644 --- a/src/tests/p4-fabric-tna/descriptors/service-p4-l3.json +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/service-p4-l3.json @@ -2,11 +2,11 @@ "services": [ { "service_id": { - "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "p4-service-l3"} + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-l3"} }, "name": "p4-service-l3", "service_type": "SERVICETYPE_L3NM", - "service_status": {"service_status": "SERVICESTATUS_PLANNED"}, "service_endpoint_ids": [ { "device_id": {"device_uuid": {"uuid": "sw1"}}, @@ -32,11 +32,13 @@ "port_list": [ { "port_id": 1, - "port_type": "host" + "port_type": "host", + "vlan_id": 4094 }, { "port_id": 2, - "port_type": "host" + "port_type": "host", + "vlan_id": 4094 } ], "routing_list": [ diff --git a/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json new file mode 100644 index 000000000..420cc8f0f --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/descriptors/topology.json @@ -0,0 +1,113 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "h1"}}, + "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "h2"}}, + "device_type": "emu-client", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.5.139"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "1", "name": "1", "type": "port-dataplane"}, + {"uuid": "2", "name": "2", "type": "port-dataplane"}, + {"uuid": "3", "name": "3", "type": "port-int"} + ] + }}} + ] + } + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "sw1/1==h1/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "h1/eth1==sw1/1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h1"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1/2==h2/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}}, + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "h2/eth1==sw1/2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "h2"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1/3==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1"}}, "endpoint_uuid": {"uuid": "3"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md b/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md new file mode 100644 index 000000000..e17d044fb --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/README.md @@ -0,0 +1,24 @@ +# P4 Sources + +We employ the P4 sources from the [fabric-tna](https://github.com/stratum/fabric-tna/tree/main) project. + +To compile a relevant P4 target binary and P4 info file, do: + +```shell +git clone https://github.com/stratum/fabric-tna.git + +cd ./fabric-tna + +make fabric-upf-int-v1model +``` + +At this point, a relevant `build.sh` script is being run and a P4 program is being compiled. + +After a successful compilation, some artifacts (p4info.txt, bmv2.json) will be generated and placed into `build` sub-folder. + +```shell +ls build/fabric-int/bmv2 +_pp.p4 bmv2.json p4info.txt +``` + +These artefacts are now moved into this repository. diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 b/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 new file mode 100644 index 000000000..870509db7 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/_pp.p4 @@ -0,0 +1,2452 @@ +error { + PacketRejectedByParser +} +#include +#define V1MODEL_VERSION 20180101 +#include + +typedef bit<9> PortId_t; +typedef bit<16> MulticastGroupId_t; +typedef bit<5> QueueId_t; +typedef bit<10> MirrorId_t; +typedef bit<16> ReplicationId_t; +enum bit<2> MeterColor_t { + GREEN = 0, + YELLOW = 1, + RED = 2 +} + +typedef bit<1> BOOL; +typedef bit<8> FieldListIndex_t; +const PortId_t BMV2_DROP_PORT = 511; +const PortId_t FAKE_V1MODEL_RECIRC_PORT = 510; +const FieldListIndex_t PRESERVE_INT_MD = 241; +const FieldListIndex_t PRESERVE_INGRESS_PORT = 231; +const FieldListIndex_t NO_PRESERVATION = 0; +typedef bit<3> fwd_type_t; +typedef bit<32> next_id_t; +typedef bit<20> mpls_label_t; +typedef bit<48> mac_addr_t; +typedef bit<12> vlan_id_t; +typedef bit<32> ipv4_addr_t; +typedef bit<16> l4_port_t; +typedef bit<32> flow_hash_t; +typedef bit<4> slice_id_t; +typedef bit<2> tc_t; +typedef bit<(4 + 2)> slice_tc_t; +type bit<9> FabricPortId_t; +const bit<8> DEFAULT_APP_ID = 0; +const slice_id_t DEFAULT_SLICE_ID = 0; +const tc_t DEFAULT_TC = 0; +const QueueId_t QUEUE_ID_BEST_EFFORT = 0; +typedef bit<32> teid_t; +typedef bit<12> upf_ctr_idx_t; +typedef bit<8> tun_peer_id_t; +typedef bit<32> ue_session_id_t; +typedef bit<15> session_meter_idx_t; +typedef bit<15> app_meter_idx_t; +const session_meter_idx_t DEFAULT_SESSION_METER_IDX = 0; +const app_meter_idx_t DEFAULT_APP_METER_IDX = 0; +enum bit<2> EncapPresence { + NONE = 0x0, + GTPU_ONLY = 0x1, + GTPU_WITH_PSC = 0x2, + VXLAN = 0x3 +} + +const bit<16> GTPU_UDP_PORT = 2152; +const bit<3> GTP_V1 = 3w1; +const bit<8> GTPU_GPDU = 0xff; +const bit<1> GTP_PROTOCOL_TYPE_GTP = 1w1; +const bit<8> GTPU_NEXT_EXT_NONE = 0x0; +const bit<8> GTPU_NEXT_EXT_PSC = 0x85; +const bit<4> GTPU_EXT_PSC_TYPE_DL = 4w0; +const bit<4> GTPU_EXT_PSC_TYPE_UL = 4w1; +const bit<8> GTPU_EXT_PSC_LEN = 8w1; +enum bit<2> PortType_t { + UNKNOWN = 0x0, + EDGE = 0x1, + INFRA = 0x2, + INTERNAL = 0x3 +} + +const bit<16> ETHERTYPE_QINQ = 0x88a8; +const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100; +const bit<16> ETHERTYPE_VLAN = 0x8100; +const bit<16> ETHERTYPE_MPLS = 0x8847; +const bit<16> ETHERTYPE_MPLS_MULTICAST = 0x8848; +const bit<16> ETHERTYPE_IPV4 = 0x800; +const bit<16> ETHERTYPE_IPV6 = 0x86dd; +const bit<16> ETHERTYPE_ARP = 0x806; +const bit<16> ETHERTYPE_PPPOED = 0x8863; +const bit<16> ETHERTYPE_PPPOES = 0x8864; +const bit<16> ETHERTYPE_PACKET_OUT = 0xbf01; +const bit<16> ETHERTYPE_CPU_LOOPBACK_INGRESS = 0xbf02; +const bit<16> ETHERTYPE_CPU_LOOPBACK_EGRESS = 0xbf03; +const bit<16> ETHERTYPE_INT_WIP_IPV4 = 0xbf04; +const bit<16> ETHERTYPE_INT_WIP_MPLS = 0xbf05; +const bit<16> PPPOE_PROTOCOL_IP4 = 0x21; +const bit<16> PPPOE_PROTOCOL_IP6 = 0x57; +const bit<16> PPPOE_PROTOCOL_MPLS = 0x281; +const bit<8> PROTO_ICMP = 1; +const bit<8> PROTO_TCP = 6; +const bit<8> PROTO_UDP = 17; +const bit<8> PROTO_ICMPV6 = 58; +const bit<4> IPV4_MIN_IHL = 5; +const fwd_type_t FWD_BRIDGING = 0; +const fwd_type_t FWD_MPLS = 1; +const fwd_type_t FWD_IPV4_UNICAST = 2; +const fwd_type_t FWD_IPV4_MULTICAST = 3; +const fwd_type_t FWD_IPV6_UNICAST = 4; +const fwd_type_t FWD_IPV6_MULTICAST = 5; +const fwd_type_t FWD_UNKNOWN = 7; +const vlan_id_t DEFAULT_VLAN_ID = 12w4094; +const bit<8> DEFAULT_MPLS_TTL = 64; +const bit<8> DEFAULT_IPV4_TTL = 64; +const bit<16> VXLAN_UDP_PORT = 4789; +const bit<7> RECIRC_PORT_NUMBER = 7w68; +action nop() { + NoAction(); +} +enum bit<8> BridgedMdType_t { + INVALID = 0, + INGRESS_TO_EGRESS = 1, + EGRESS_MIRROR = 2, + INGRESS_MIRROR = 3, + INT_INGRESS_DROP = 4, + DEFLECTED = 5 +} + +enum bit<3> FabricMirrorType_t { + INVALID = 0, + INT_REPORT = 1, + PACKET_IN = 2 +} + +const MirrorId_t PACKET_IN_MIRROR_SESSION_ID = 0x1ff; +enum bit<2> CpuLoopbackMode_t { + DISABLED = 0, + DIRECT = 1, + INGRESS = 2 +} + +const bit<4> NPROTO_ETHERNET = 0; +const bit<4> NPROTO_TELEMETRY_DROP_HEADER = 1; +const bit<4> NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER = 2; +const bit<16> REPORT_FIXED_HEADER_BYTES = 12; +const bit<16> DROP_REPORT_HEADER_BYTES = 12; +const bit<16> LOCAL_REPORT_HEADER_BYTES = 16; +const bit<8> INT_MIRROR_SESSION_BASE = 0x80; +const bit<10> V1MODEL_INT_MIRROR_SESSION = 0x1fa; +typedef bit<16> flow_report_filter_index_t; +typedef bit<16> drop_report_filter_index_t; +typedef bit<12> queue_report_filter_index_t; +typedef bit<16> queue_report_quota_t; +typedef bit<3> IntReportType_t; +const IntReportType_t INT_REPORT_TYPE_NO_REPORT = 0; +const IntReportType_t INT_REPORT_TYPE_DROP = 4; +const IntReportType_t INT_REPORT_TYPE_QUEUE = 2; +const IntReportType_t INT_REPORT_TYPE_FLOW = 1; +typedef bit<8> IntWipType_t; +const IntWipType_t INT_IS_NOT_WIP = 0; +const IntWipType_t INT_IS_WIP = 1; +const IntWipType_t INT_IS_WIP_WITH_MPLS = 2; +const bit<16> INT_WIP_ADJUST_IP_BYTES = 14 - 1 ^ 0xffff; +const bit<16> INT_WIP_ADJUST_UDP_BYTES = INT_WIP_ADJUST_IP_BYTES - 20; +const bit<16> INT_WIP_ADJUST_IP_MPLS_BYTES = INT_WIP_ADJUST_IP_BYTES - 4; +const bit<16> INT_WIP_ADJUST_UDP_MPLS_BYTES = INT_WIP_ADJUST_UDP_BYTES - 4; +enum bit<8> IntDropReason_t { + DROP_REASON_UNKNOWN = 0, + DROP_REASON_IP_TTL_ZERO = 26, + DROP_REASON_ROUTING_V4_MISS = 29, + DROP_REASON_ROUTING_V6_MISS = 29, + DROP_REASON_PORT_VLAN_MAPPING_MISS = 55, + DROP_REASON_TRAFFIC_MANAGER = 71, + DROP_REASON_ACL_DENY = 80, + DROP_REASON_BRIDGING_MISS = 89, + DROP_REASON_NEXT_ID_MISS = 128, + DROP_REASON_MPLS_MISS = 129, + DROP_REASON_EGRESS_NEXT_MISS = 130, + DROP_REASON_MPLS_TTL_ZERO = 131, + DROP_REASON_UPF_DL_SESSION_MISS = 132, + DROP_REASON_UPF_DL_SESSION_DROP = 133, + DROP_REASON_UPF_UL_SESSION_MISS = 134, + DROP_REASON_UPF_UL_SESSION_DROP = 135, + DROP_REASON_UPF_DL_SESSION_DROP_BUFF = 136, + DROP_REASON_UPF_DL_TERMINATION_MISS = 137, + DROP_REASON_UPF_DL_TERMINATION_DROP = 138, + DROP_REASON_UPF_UL_TERMINATION_MISS = 139, + DROP_REASON_UPF_UL_TERMINATION_DROP = 140, + DROP_REASON_UPF_UPLINK_RECIRC_DENY = 150, + DROP_REASON_INGRESS_QOS_METER = 160, + DROP_REASON_ROUTING_V4_DROP = 170, + DROP_REASON_ROUTING_V6_DROP = 171 +} + +@controller_header("packet_in") header packet_in_header_t { + FabricPortId_t ingress_port; + bit<7> _pad0; +} + +@controller_header("packet_out") header packet_out_header_t { + @padding + bit<7> pad0; + FabricPortId_t egress_port; + @padding + bit<3> pad1; + QueueId_t queue_id; + @padding + bit<5> pad2; + CpuLoopbackMode_t cpu_loopback_mode; + bit<1> do_forwarding; + @padding + bit<16> pad3; + @padding + bit<48> pad4; + bit<16> ether_type; +} + +header ethernet_t { + mac_addr_t dst_addr; + mac_addr_t src_addr; +} + +header eth_type_t { + bit<16> value; +} + +header vlan_tag_t { + bit<16> eth_type; + bit<3> pri; + bit<1> cfi; + vlan_id_t vlan_id; +} + +header mpls_t { + mpls_label_t label; + bit<3> tc; + bit<1> bos; + bit<8> ttl; +} + +header pppoe_t { + bit<4> version; + bit<4> type_id; + bit<8> code; + bit<16> session_id; + bit<16> length; + bit<16> protocol; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<6> dscp; + bit<2> ecn; + bit<16> total_len; + bit<16> identification; + bit<3> flags; + bit<13> frag_offset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdr_checksum; + bit<32> src_addr; + bit<32> dst_addr; +} + +header ipv6_t { + bit<4> version; + bit<8> traffic_class; + bit<20> flow_label; + bit<16> payload_len; + bit<8> next_hdr; + bit<8> hop_limit; + bit<128> src_addr; + bit<128> dst_addr; +} + +header tcp_t { + bit<16> sport; + bit<16> dport; +} + +@pa_container_size("egress" , "hdr.outer_udp.sport" , 16) @pa_container_size("egress" , "hdr.outer_udp.dport" , 16) header udp_t { + bit<16> sport; + bit<16> dport; + bit<16> len; + bit<16> checksum; +} + +header icmp_t { + bit<8> icmp_type; + bit<8> icmp_code; +} + +header vxlan_t { + bit<8> flags; + bit<24> reserved; + bit<24> vni; + bit<8> reserved_2; +} + +header gtpu_t { + bit<3> version; + bit<1> pt; + bit<1> spare; + bit<1> ex_flag; + bit<1> seq_flag; + bit<1> npdu_flag; + bit<8> msgtype; + bit<16> msglen; + teid_t teid; +} + +header gtpu_options_t { + bit<16> seq_num; + bit<8> n_pdu_num; + bit<8> next_ext; +} + +header gtpu_ext_psc_t { + bit<8> len; + bit<4> type; + bit<4> spare0; + bit<1> ppp; + bit<1> rqi; + bit<6> qfi; + bit<8> next_ext; +} + +@flexible struct upf_bridged_metadata_t { + tun_peer_id_t tun_peer_id; + upf_ctr_idx_t upf_ctr_id; + bit<6> qfi; + bool needs_gtpu_encap; + bool skip_upf; + bool skip_egress_upf_ctr; + teid_t teid; + bit<4> _pad; +} + +@pa_no_overlay("egress" , "hdr.report_fixed_header.rsvd") header report_fixed_header_t { + bit<4> ver; + bit<4> nproto; + bit<3> dqf; + bit<15> rsvd; + bit<6> hw_id; + bit<32> seq_no; + bit<32> ig_tstamp; +} + +@pa_container_size("egress" , "hdr.common_report_header.queue_id" , 8) @pa_container_size("egress" , "hdr.common_report_header.ig_port" , 16) @pa_container_size("egress" , "hdr.common_report_header.eg_port" , 16) @pa_no_overlay("egress" , "hdr.common_report_header.queue_id") @pa_no_overlay("egress" , "hdr.common_report_header.eg_port") header common_report_header_t { + bit<32> switch_id; + bit<7> pad1; + bit<9> ig_port; + bit<7> pad2; + bit<9> eg_port; + bit<3> pad3; + bit<5> queue_id; +} + +header drop_report_header_t { + bit<8> drop_reason; + @padding + bit<16> pad; +} + +header local_report_header_t { + bit<5> pad1; + bit<19> queue_occupancy; + bit<32> eg_tstamp; +} + +@pa_no_overlay("egress" , "fabric_md.int_report_md.bmd_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.mirror_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_id") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_occupancy") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.drop_reason") @pa_no_overlay("egress" , "fabric_md.int_report_md.ip_eth_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.report_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.flow_hash") @pa_no_overlay("egress" , "fabric_md.int_report_md.encap_presence") header int_report_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + bit<9> ig_port; + @padding + bit<7> _pad2; + bit<9> eg_port; + @padding + bit<3> _pad3; + bit<5> queue_id; + @padding + bit<5> _pad4; + bit<19> queue_occupancy; + bit<32> ig_tstamp; + bit<32> eg_tstamp; + bit<8> drop_reason; + bit<16> ip_eth_type; + @padding + bit<6> _pad5; + EncapPresence encap_presence; + bit<3> report_type; + @padding + bit<5> _pad6; + flow_hash_t flow_hash; +} + +@flexible struct int_bridged_metadata_t { + bit<3> report_type; + MirrorId_t mirror_session_id; + IntDropReason_t drop_reason; + QueueId_t queue_id; + PortId_t egress_port; + IntWipType_t wip_type; +} + +struct int_metadata_t { + bit<32> hop_latency; + bit<48> timestamp; + bool vlan_stripped; + bool queue_report; +} + +@flexible struct bridged_metadata_base_t { + flow_hash_t inner_hash; + mpls_label_t mpls_label; + PortId_t ig_port; + bool is_multicast; + fwd_type_t fwd_type; + vlan_id_t vlan_id; + EncapPresence encap_presence; + bit<8> mpls_ttl; + bit<48> ig_tstamp; + bit<16> ip_eth_type; + bit<10> stats_flow_id; + slice_tc_t slice_tc; +} + +header bridged_metadata_t { + BridgedMdType_t bmd_type; + bridged_metadata_base_t base; + upf_bridged_metadata_t upf; + int_bridged_metadata_t int_bmd; + bit<1> _pad0; + bit<7> _pad1; + bit<5> _pad2; +} + +struct lookup_metadata_t { + mac_addr_t eth_dst; + mac_addr_t eth_src; + bit<16> eth_type; + vlan_id_t vlan_id; + bool is_ipv4; + bit<32> ipv4_src; + bit<32> ipv4_dst; + bit<8> ip_proto; + l4_port_t l4_sport; + l4_port_t l4_dport; + bit<8> icmp_type; + bit<8> icmp_code; +} + +struct common_mirror_metadata_t { + MirrorId_t mirror_session_id; + BridgedMdType_t bmd_type; +} + +@pa_auto_init_metadata struct fabric_ingress_metadata_t { + bridged_metadata_t bridged; + flow_hash_t ecmp_hash; + lookup_metadata_t lkp; + bit<32> routing_ipv4_dst; + bool skip_forwarding; + bool skip_next; + next_id_t next_id; + bool egress_port_set; + bool punt_to_cpu; + bool ipv4_checksum_err; + bool inner_ipv4_checksum_err; + slice_id_t slice_id; + tc_t tc; + bool tc_unknown; + bool is_upf_hit; + slice_id_t upf_slice_id; + tc_t upf_tc; + MeterColor_t upf_meter_color; + PortType_t ig_port_type; + common_mirror_metadata_t mirror; +} + +header common_egress_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad; + FabricMirrorType_t mirror_type; +} + +header packet_in_mirror_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + PortId_t ingress_port; +} + +@pa_auto_init_metadata struct fabric_egress_metadata_t { + bridged_metadata_t bridged; + PortId_t cpu_port; + bool inner_ipv4_checksum_err; + int_report_metadata_t int_report_md; + int_metadata_t int_md; + bit<16> int_ipv4_len; + bool is_int_recirc; + bit<16> pkt_length; +} + +header fake_ethernet_t { + @padding + bit<48> _pad0; + @padding + bit<48> _pad1; + bit<16> ether_type; +} + +struct ingress_headers_t { + packet_out_header_t packet_out; + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t ipv4; + ipv6_t ipv6; + tcp_t tcp; + udp_t udp; + icmp_t icmp; + gtpu_t gtpu; + gtpu_options_t gtpu_options; + gtpu_ext_psc_t gtpu_ext_psc; + vxlan_t vxlan; + ethernet_t inner_ethernet; + eth_type_t inner_eth_type; + ipv4_t inner_ipv4; + tcp_t inner_tcp; + udp_t inner_udp; + icmp_t inner_icmp; +} + +struct egress_headers_t { + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t report_ethernet; + eth_type_t report_eth_type; + mpls_t report_mpls; + ipv4_t report_ipv4; + udp_t report_udp; + report_fixed_header_t report_fixed_header; + common_report_header_t common_report_header; + local_report_header_t local_report_header; + drop_report_header_t drop_report_header; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t outer_ipv4; + udp_t outer_udp; + gtpu_t outer_gtpu; + gtpu_options_t outer_gtpu_options; + gtpu_ext_psc_t outer_gtpu_ext_psc; + ipv4_t ipv4; + ipv6_t ipv6; + udp_t udp; +} + +struct fabric_v1model_metadata_t { + bool skip_egress; + bool do_upf_uplink_recirc; + bit<1> drop_ctl; + IntReportType_t int_mirror_type; + fabric_ingress_metadata_t ingress; + fabric_egress_metadata_t egress; + @field_list(PRESERVE_INT_MD) + IntReportType_t recirc_preserved_report_type; + @field_list(PRESERVE_INT_MD) + FabricPortId_t recirc_preserved_egress_port; + @field_list(PRESERVE_INT_MD) + IntDropReason_t recirc_preserved_drop_reason; + @field_list(PRESERVE_INGRESS_PORT) + FabricPortId_t recirc_preserved_ingress_port; +} + +struct v1model_header_t { + ingress_headers_t ingress; + egress_headers_t egress; +} + +parser FabricParser(packet_in packet, out v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + state start { + fabric_md.egress.pkt_length = (bit<16>)standard_md.packet_length; + fabric_md.ingress.bridged.setValid(); + fabric_md.ingress.bridged.bmd_type = BridgedMdType_t.INGRESS_TO_EGRESS; + fabric_md.ingress.bridged.base.ig_port = standard_md.ingress_port; + fabric_md.recirc_preserved_ingress_port = (FabricPortId_t)standard_md.ingress_port; + fabric_md.ingress.bridged.base.ig_tstamp = standard_md.ingress_global_timestamp; + fabric_md.ingress.egress_port_set = false; + fabric_md.ingress.punt_to_cpu = false; + fabric_md.ingress.bridged.base.ip_eth_type = 0; + fabric_md.ingress.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UNKNOWN; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_NOT_WIP; + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.NONE; + fabric_md.ingress.upf_meter_color = MeterColor_t.GREEN; + transition check_ethernet; + } + state check_ethernet { + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_CPU_LOOPBACK_INGRESS: parse_fake_ethernet; + ETHERTYPE_CPU_LOOPBACK_EGRESS: parse_fake_ethernet_and_accept; + ETHERTYPE_PACKET_OUT: check_packet_out; + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state check_packet_out { + packet_out_header_t tmp = packet.lookahead(); + transition select(tmp.do_forwarding) { + 0: parse_packet_out_and_accept; + default: strip_packet_out; + } + } + state parse_int_wip_ipv4 { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_IPV4; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP; + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + packet.advance(14 * 8); + transition parse_ipv4; + } + state parse_int_wip_mpls { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_MPLS; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP_WITH_MPLS; + packet.advance(14 * 8); + transition parse_mpls; + } + state parse_packet_out_and_accept { + packet.extract(hdr.ingress.packet_out); + transition accept; + } + state strip_packet_out { + packet.advance(14 * 8); + transition parse_ethernet; + } + state parse_fake_ethernet { + packet.extract(hdr.ingress.fake_ethernet); + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state parse_fake_ethernet_and_accept { + packet.extract(hdr.ingress.fake_ethernet); + transition accept; + } + state parse_ethernet { + packet.extract(hdr.ingress.ethernet); + transition select(packet.lookahead>()) { + ETHERTYPE_QINQ: parse_vlan_tag; + ETHERTYPE_VLAN &&& 0xefff: parse_vlan_tag; + default: parse_untagged; + } + } + state parse_vlan_tag { + packet.extract(hdr.ingress.vlan_tag); + fabric_md.ingress.bridged.base.vlan_id = hdr.ingress.vlan_tag.vlan_id; + transition select(packet.lookahead>()) { + default: parse_eth_type; + } + } + state parse_untagged { + fabric_md.ingress.bridged.base.vlan_id = DEFAULT_VLAN_ID; + transition parse_eth_type; + } + state parse_eth_type { + packet.extract(hdr.ingress.eth_type); + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_MPLS: parse_mpls; + ETHERTYPE_IPV4: parse_non_mpls; + ETHERTYPE_IPV6: parse_non_mpls; + default: accept; + } + } + state parse_mpls { + packet.extract(hdr.ingress.mpls); + fabric_md.ingress.bridged.base.mpls_label = hdr.ingress.mpls.label; + fabric_md.ingress.bridged.base.mpls_ttl = hdr.ingress.mpls.ttl; + transition select(packet.lookahead>()) { + 4: parse_ipv4; + 6: parse_ipv6; + default: reject_packet; + } + } + state reject_packet { + verify(false, error.PacketRejectedByParser); + transition accept; + } + state parse_non_mpls { + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_IPV4: parse_ipv4; + ETHERTYPE_IPV6: parse_ipv6; + default: accept; + } + } + state parse_ipv4 { + packet.extract(hdr.ingress.ipv4); + fabric_md.ingress.routing_ipv4_dst = hdr.ingress.ipv4.dst_addr; + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + transition select(hdr.ingress.ipv4.protocol) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMP: parse_icmp; + default: accept; + } + } + state parse_ipv6 { + packet.extract(hdr.ingress.ipv6); + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV6; + transition select(hdr.ingress.ipv6.next_hdr) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMPV6: parse_icmp; + default: accept; + } + } + state parse_icmp { + packet.extract(hdr.ingress.icmp); + transition accept; + } + state parse_tcp { + packet.extract(hdr.ingress.tcp); + transition accept; + } + state parse_udp { + packet.extract(hdr.ingress.udp); + gtpu_t gtpu = packet.lookahead(); + transition select(hdr.ingress.udp.dport, gtpu.version, gtpu.msgtype) { + (GTPU_UDP_PORT, GTP_V1, GTPU_GPDU): parse_gtpu; + (VXLAN_UDP_PORT, default, default): parse_vxlan; + default: accept; + } + } + state parse_gtpu { + packet.extract(hdr.ingress.gtpu); + transition select(hdr.ingress.gtpu.ex_flag, hdr.ingress.gtpu.seq_flag, hdr.ingress.gtpu.npdu_flag) { + (0, 0, 0): set_gtpu_only; + default: parse_gtpu_options; + } + } + state set_gtpu_only { + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_ONLY; + transition parse_inner_ipv4; + } + state parse_gtpu_options { + packet.extract(hdr.ingress.gtpu_options); + bit<8> gtpu_ext_len = packet.lookahead>(); + transition select(hdr.ingress.gtpu_options.next_ext, gtpu_ext_len) { + (GTPU_NEXT_EXT_PSC, GTPU_EXT_PSC_LEN): parse_gtpu_ext_psc; + default: accept; + } + } + state parse_gtpu_ext_psc { + packet.extract(hdr.ingress.gtpu_ext_psc); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_WITH_PSC; + transition select(hdr.ingress.gtpu_ext_psc.next_ext) { + GTPU_NEXT_EXT_NONE: parse_inner_ipv4; + default: accept; + } + } + state parse_vxlan { + packet.extract(hdr.ingress.vxlan); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.VXLAN; + transition parse_inner_ethernet; + } + state parse_inner_ethernet { + packet.extract(hdr.ingress.inner_ethernet); + packet.extract(hdr.ingress.inner_eth_type); + transition select(hdr.ingress.inner_eth_type.value) { + ETHERTYPE_IPV4: parse_inner_ipv4; + default: accept; + } + } + state parse_inner_ipv4 { + packet.extract(hdr.ingress.inner_ipv4); + transition select(hdr.ingress.inner_ipv4.protocol) { + PROTO_TCP: parse_inner_tcp; + PROTO_UDP: parse_inner_udp; + PROTO_ICMP: parse_inner_icmp; + default: accept; + } + } + state parse_inner_tcp { + packet.extract(hdr.ingress.inner_tcp); + transition accept; + } + state parse_inner_udp { + packet.extract(hdr.ingress.inner_udp); + transition accept; + } + state parse_inner_icmp { + packet.extract(hdr.ingress.inner_icmp); + transition accept; + } +} + +control FabricDeparser(packet_out packet, in v1model_header_t hdr) { + apply { + packet.emit(hdr.ingress.fake_ethernet); + packet.emit(hdr.ingress.packet_in); + packet.emit(hdr.egress.report_ethernet); + packet.emit(hdr.egress.report_eth_type); + packet.emit(hdr.egress.report_mpls); + packet.emit(hdr.egress.report_ipv4); + packet.emit(hdr.egress.report_udp); + packet.emit(hdr.egress.report_fixed_header); + packet.emit(hdr.egress.common_report_header); + packet.emit(hdr.egress.local_report_header); + packet.emit(hdr.egress.drop_report_header); + packet.emit(hdr.ingress.ethernet); + packet.emit(hdr.ingress.vlan_tag); + packet.emit(hdr.ingress.eth_type); + packet.emit(hdr.ingress.mpls); + packet.emit(hdr.ingress.ipv4); + packet.emit(hdr.ingress.ipv6); + packet.emit(hdr.ingress.tcp); + packet.emit(hdr.ingress.udp); + packet.emit(hdr.ingress.icmp); + packet.emit(hdr.ingress.gtpu); + packet.emit(hdr.ingress.gtpu_options); + packet.emit(hdr.ingress.gtpu_ext_psc); + packet.emit(hdr.ingress.vxlan); + packet.emit(hdr.ingress.inner_ethernet); + packet.emit(hdr.ingress.inner_eth_type); + packet.emit(hdr.ingress.inner_ipv4); + packet.emit(hdr.ingress.inner_tcp); + packet.emit(hdr.ingress.inner_udp); + packet.emit(hdr.ingress.inner_icmp); + } +} + +control Acl(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) acl_counter; + action set_next_id_acl(next_id_t next_id) { + fabric_md.next_id = next_id; + acl_counter.count(); + fabric_md.skip_next = false; + drop_ctl = 0; + } + action copy_to_cpu() { + clone_preserving_field_list(CloneType.I2E, (bit<32>)PACKET_IN_MIRROR_SESSION_ID, PRESERVE_INGRESS_PORT); + acl_counter.count(); + } + action punt_to_cpu() { + copy_to_cpu(); + fabric_md.skip_next = true; + fabric_md.punt_to_cpu = true; + drop_ctl = 1; + } + action drop() { + drop_ctl = 1; + fabric_md.skip_next = true; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_ACL_DENY; + acl_counter.count(); + } + action set_output_port(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + fabric_md.skip_next = true; + drop_ctl = 0; + acl_counter.count(); + } + action nop_acl() { + acl_counter.count(); + } + table acl { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_src : ternary @name("eth_src") ; + fabric_md.lkp.vlan_id : ternary @name("vlan_id") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.icmp_type : ternary @name("icmp_type") ; + fabric_md.lkp.icmp_code : ternary @name("icmp_code") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + fabric_md.ig_port_type : ternary @name("ig_port_type") ; + } + actions = { + set_next_id_acl; + punt_to_cpu; + copy_to_cpu; + drop; + set_output_port; + nop_acl; + } + const default_action = nop_acl(); + size = 1024; + counters = acl_counter; + } + apply { + acl.apply(); + } +} + +control Next(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action output(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + } + @hidden action rewrite_smac(mac_addr_t smac) { + hdr.ethernet.src_addr = smac; + } + @hidden action rewrite_dmac(mac_addr_t dmac) { + hdr.ethernet.dst_addr = dmac; + } + @hidden action routing(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + rewrite_smac(smac); + rewrite_dmac(dmac); + output(port_num); + } + @max_group_size(32w16) action_selector(HashAlgorithm.crc16, 32w16, 32w16) hashed_profile; + direct_counter(CounterType.packets_and_bytes) hashed_counter; + action output_hashed(FabricPortId_t port_num) { + output(port_num); + hashed_counter.count(); + } + action routing_hashed(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + routing(port_num, smac, dmac); + hashed_counter.count(); + } + table hashed { + key = { + fabric_md.next_id : exact @name("next_id") ; + fabric_md.ecmp_hash: selector; + } + actions = { + output_hashed; + routing_hashed; + @defaultonly nop; + } + implementation = hashed_profile; + counters = hashed_counter; + const default_action = nop(); + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) multicast_counter; + action set_mcast_group_id(MulticastGroupId_t group_id) { + standard_md.mcast_grp = group_id; + fabric_md.bridged.base.is_multicast = true; + multicast_counter.count(); + } + action reset_mcast_group_id() { + standard_md.mcast_grp = 0; + fabric_md.bridged.base.is_multicast = false; + } + table multicast { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mcast_group_id; + @defaultonly reset_mcast_group_id; + } + counters = multicast_counter; + const default_action = reset_mcast_group_id(); + size = 1024; + } + apply { + hashed.apply(); + multicast.apply(); + } +} + +control EgressNextControl(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntDropReason_t recirc_preserved_drop_reason, inout bit<1> drop_ctl) { + @hidden action pop_mpls_if_present() { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + } + @hidden action set_mpls() { + hdr.mpls.setValid(); + hdr.mpls.label = fabric_md.bridged.base.mpls_label; + hdr.mpls.tc = 3w0; + hdr.mpls.bos = 1w1; + hdr.mpls.ttl = fabric_md.bridged.base.mpls_ttl; + hdr.eth_type.value = ETHERTYPE_MPLS; + } + @hidden action push_outer_vlan() { + hdr.vlan_tag.setValid(); + hdr.vlan_tag.eth_type = ETHERTYPE_VLAN; + hdr.vlan_tag.vlan_id = fabric_md.bridged.base.vlan_id; + } + direct_counter(CounterType.packets_and_bytes) egress_vlan_counter; + action push_vlan() { + push_outer_vlan(); + egress_vlan_counter.count(); + } + action pop_vlan() { + hdr.vlan_tag.setInvalid(); + egress_vlan_counter.count(); + } + action drop() { + drop_ctl = 1; + egress_vlan_counter.count(); + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_EGRESS_NEXT_MISS; + } + table egress_vlan { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + standard_md.egress_port : exact @name("eg_port") ; + } + actions = { + push_vlan; + pop_vlan; + @defaultonly drop; + } + const default_action = drop(); + counters = egress_vlan_counter; + size = 1024; + } + apply { + if (fabric_md.bridged.base.is_multicast && fabric_md.bridged.base.ig_port == standard_md.egress_port) { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + drop_ctl = 1; + } + if (fabric_md.bridged.base.mpls_label == 0) { + if (hdr.mpls.isValid()) { + pop_mpls_if_present(); + } + } else { + set_mpls(); + } + if (!fabric_md.is_int_recirc) { + egress_vlan.apply(); + } + bool regular_packet = true; + regular_packet = !(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP || fabric_md.bridged.bmd_type == BridgedMdType_t.EGRESS_MIRROR); + if (hdr.mpls.isValid()) { + hdr.mpls.ttl = hdr.mpls.ttl - 1; + if (hdr.mpls.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_MPLS_TTL_ZERO; + } + } else { + if (hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv4.ttl = hdr.ipv4.ttl - 1; + } + if (hdr.ipv4.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1; + } + if (hdr.ipv6.hop_limit == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } + } + } +} + +const bit<10> UNSET_FLOW_ID = 0; +control StatsIngress(in lookup_metadata_t lkp, in PortId_t ig_port, out bit<10> stats_flow_id) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count(bit<10> flow_id) { + stats_flow_id = flow_id; + flow_counter.count(); + } + table flows { + key = { + lkp.ipv4_src: ternary @name("ipv4_src") ; + lkp.ipv4_dst: ternary @name("ipv4_dst") ; + lkp.ip_proto: ternary @name("ip_proto") ; + lkp.l4_sport: ternary @name("l4_sport") ; + lkp.l4_dport: ternary @name("l4_dport") ; + ig_port : exact @name("ig_port") ; + } + actions = { + count; + } + const default_action = count(UNSET_FLOW_ID); + const size = 1 << 10; + counters = flow_counter; + } + apply { + flows.apply(); + } +} + +control StatsEgress(in bit<10> stats_flow_id, in PortId_t eg_port, in BridgedMdType_t bmd_type) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count() { + flow_counter.count(); + } + table flows { + key = { + stats_flow_id: exact @name("stats_flow_id") ; + eg_port : exact @name("eg_port") ; + } + actions = { + count; + } + const default_action = count; + const size = 1 << 10; + counters = flow_counter; + } + apply { + if (bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS) { + flows.apply(); + } + } +} + +control Hasher(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + flow_hash_t max = 0xffffffff; + flow_hash_t base = 0; + apply { + hash(fabric_md.bridged.base.inner_hash, HashAlgorithm.crc32, base, { fabric_md.lkp.ipv4_src, fabric_md.lkp.ipv4_dst, fabric_md.lkp.ip_proto, fabric_md.lkp.l4_sport, fabric_md.lkp.l4_dport }, max); + if (fabric_md.bridged.upf.needs_gtpu_encap) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { fabric_md.bridged.upf.tun_peer_id, fabric_md.bridged.upf.teid }, max); + } else if (hdr.gtpu.isValid()) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ipv4.src_addr, hdr.ipv4.dst_addr, hdr.gtpu.teid }, max); + } else if (fabric_md.lkp.is_ipv4) { + fabric_md.ecmp_hash = fabric_md.bridged.base.inner_hash; + } else { + fabric_md.bridged.base.inner_hash = 0; + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ethernet.dst_addr, hdr.ethernet.src_addr, hdr.eth_type.value }, max); + } + } +} + +control IngressSliceTcClassifier(inout ingress_headers_t hdr, inout standard_metadata_t standard_md, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets) classifier_stats; + action set_slice_id_tc(slice_id_t slice_id, tc_t tc) { + fabric_md.slice_id = slice_id; + fabric_md.tc = tc; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + action no_classification() { + set_slice_id_tc(DEFAULT_SLICE_ID, DEFAULT_TC); + fabric_md.tc_unknown = true; + } + action trust_dscp() { + fabric_md.slice_id = hdr.ipv4.dscp[4 + 2 - 1:2]; + fabric_md.tc = hdr.ipv4.dscp[2 - 1:0]; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + table classifier { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + } + actions = { + set_slice_id_tc; + trust_dscp; + @defaultonly no_classification; + } + const default_action = no_classification(); + counters = classifier_stats; + size = 512; + } + apply { + classifier.apply(); + } +} + +control IngressQos(inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + bit<2> packet_color = 2w0; + @hidden action use_upf() { + fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id ++ fabric_md.upf_tc; + } + @hidden action use_default() { + fabric_md.bridged.base.slice_tc = fabric_md.slice_id ++ fabric_md.tc; + } + @hidden table set_slice_tc { + key = { + fabric_md.is_upf_hit: exact; + } + actions = { + use_upf; + use_default; + } + const size = 2; + const entries = { + true : use_upf; + false : use_default; + } + } + meter(1 << 4 + 2, MeterType.bytes) slice_tc_meter; + direct_counter(CounterType.packets) queues_stats; + action set_queue(QueueId_t qid) { + queues_stats.count(); + } + action meter_drop() { + drop_ctl = 1; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_INGRESS_QOS_METER; + queues_stats.count(); + } + table queues { + key = { + fabric_md.bridged.base.slice_tc: exact @name("slice_tc") ; + packet_color : ternary @name("color") ; + } + actions = { + set_queue; + meter_drop; + } + const default_action = set_queue(QUEUE_ID_BEST_EFFORT); + counters = queues_stats; + size = 1 << 4 + 2 + 1; + } + action set_default_tc(tc_t tc) { + fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 + 2 - 1:2] ++ tc; + } + table default_tc { + key = { + fabric_md.bridged.base.slice_tc: ternary @name("slice_tc") ; + fabric_md.tc_unknown : exact @name("tc_unknown") ; + } + actions = { + set_default_tc; + @defaultonly nop; + } + const default_action = nop; + size = 1 << 4; + } + apply { + set_slice_tc.apply(); + default_tc.apply(); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + slice_tc_meter.execute_meter((bit<32>)fabric_md.bridged.base.slice_tc, packet_color); + } else { + packet_color = MeterColor_t.RED; + } + queues.apply(); + } +} + +control EgressDscpRewriter(inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout ingress_headers_t hdr) { + bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; + action rewrite() { + } + action clear() { + tmp_dscp = 0; + } + table rewriter { + key = { + standard_md.egress_port: exact @name("eg_port") ; + } + actions = { + rewrite; + clear; + @defaultonly nop; + } + const default_action = nop; + size = 512; + } + apply { + if (rewriter.apply().hit) { + if (hdr.ipv4.isValid()) { + hdr.ipv4.dscp = tmp_dscp; + } + } + } +} + +control FabricVerifyChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t meta) { + apply { + verify_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + verify_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control FabricComputeChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md) { + apply { + update_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.egress.report_ipv4.isValid(), { hdr.egress.report_ipv4.version, hdr.egress.report_ipv4.ihl, hdr.egress.report_ipv4.dscp, hdr.egress.report_ipv4.ecn, hdr.egress.report_ipv4.total_len, hdr.egress.report_ipv4.identification, hdr.egress.report_ipv4.flags, hdr.egress.report_ipv4.frag_offset, hdr.egress.report_ipv4.ttl, hdr.egress.report_ipv4.protocol, hdr.egress.report_ipv4.src_addr, hdr.egress.report_ipv4.dst_addr }, hdr.egress.report_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control PacketIoIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout bool skip_egress, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action do_packet_out() { + standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port; + recirc_preserved_egress_port = hdr.packet_out.egress_port; + fabric_md.egress_port_set = true; + hdr.packet_out.setInvalid(); + skip_egress = true; + fabric_md.bridged.setInvalid(); + exit; + } + apply { + if (hdr.packet_out.isValid()) { + do_packet_out(); + } + } +} + +control PacketIoEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, in FabricPortId_t preserved_ig_port) { + action set_switch_info(FabricPortId_t cpu_port) { + fabric_md.cpu_port = (PortId_t)cpu_port; + } + table switch_info { + actions = { + set_switch_info; + @defaultonly nop; + } + default_action = nop; + const size = 1; + } + apply { + switch_info.apply(); + if (standard_md.egress_port == fabric_md.cpu_port) { + hdr.packet_in.setValid(); + hdr.packet_in.ingress_port = preserved_ig_port; + hdr.fake_ethernet.setInvalid(); + exit; + } + if (hdr.fake_ethernet.isValid() && hdr.fake_ethernet.ether_type == ETHERTYPE_CPU_LOOPBACK_EGRESS) { + fabric_md.pkt_length = (bit<16>)standard_md.packet_length - 14; + } + } +} + +control PreNext(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets_and_bytes) next_mpls_counter; + action set_mpls_label(mpls_label_t label) { + fabric_md.bridged.base.mpls_label = label; + next_mpls_counter.count(); + } + table next_mpls { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mpls_label; + @defaultonly nop; + } + const default_action = nop(); + counters = next_mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) next_vlan_counter; + action set_vlan(vlan_id_t vlan_id) { + fabric_md.bridged.base.vlan_id = vlan_id; + next_vlan_counter.count(); + } + table next_vlan { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_vlan; + @defaultonly nop; + } + const default_action = nop(); + counters = next_vlan_counter; + size = 1024; + } + apply { + next_mpls.apply(); + next_vlan.apply(); + } +} + +control Filtering(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter; + action deny() { + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + fabric_md.ig_port_type = PortType_t.UNKNOWN; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_PORT_VLAN_MAPPING_MISS; + ingress_port_vlan_counter.count(); + } + action permit(PortType_t port_type) { + fabric_md.ig_port_type = port_type; + ingress_port_vlan_counter.count(); + } + action permit_with_internal_vlan(vlan_id_t vlan_id, PortType_t port_type) { + fabric_md.bridged.base.vlan_id = vlan_id; + permit(port_type); + } + table ingress_port_vlan { + key = { + fabric_md.bridged.base.ig_port: exact @name("ig_port") ; + hdr.vlan_tag.isValid() : exact @name("vlan_is_valid") ; + hdr.vlan_tag.vlan_id : ternary @name("vlan_id") ; + } + actions = { + deny(); + permit(); + permit_with_internal_vlan(); + } + const default_action = deny(); + counters = ingress_port_vlan_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter; + action set_forwarding_type(fwd_type_t fwd_type) { + fabric_md.bridged.base.fwd_type = fwd_type; + fwd_classifier_counter.count(); + } + counter(8, CounterType.packets_and_bytes) fwd_type_counter; + table fwd_classifier { + key = { + fabric_md.bridged.base.ig_port : exact @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.bridged.base.ip_eth_type: exact @name("ip_eth_type") ; + } + actions = { + set_forwarding_type; + } + const default_action = set_forwarding_type(FWD_BRIDGING); + counters = fwd_classifier_counter; + size = 1024; + } + apply { + ingress_port_vlan.apply(); + fwd_classifier.apply(); + fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type); + } +} + +control Forwarding(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + action set_int_drop_reason(bit<8> drop_reason) { + fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason; + } + @hidden action set_next_id(next_id_t next_id) { + fabric_md.next_id = next_id; + } + direct_counter(CounterType.packets_and_bytes) bridging_counter; + action set_next_id_bridging(next_id_t next_id) { + set_next_id(next_id); + bridging_counter.count(); + } + table bridging { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + hdr.ethernet.dst_addr : ternary @name("eth_dst") ; + } + actions = { + set_next_id_bridging; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_BRIDGING_MISS); + counters = bridging_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) mpls_counter; + action pop_mpls_and_next(next_id_t next_id) { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + fabric_md.bridged.base.mpls_label = 0; + set_next_id(next_id); + mpls_counter.count(); + } + table mpls { + key = { + fabric_md.bridged.base.mpls_label: exact @name("mpls_label") ; + } + actions = { + pop_mpls_and_next; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_MPLS_MISS); + counters = mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v4_counter; + action set_next_id_routing_v4(next_id_t next_id) { + set_next_id(next_id); + routing_v4_counter.count(); + } + action nop_routing_v4() { + routing_v4_counter.count(); + } + action drop_routing_v4() { + fabric_md.skip_next = true; + routing_v4_counter.count(); + drop_ctl = 1; + } + table routing_v4 { + key = { + fabric_md.routing_ipv4_dst: lpm @name("ipv4_dst") ; + } + actions = { + set_next_id_routing_v4; + nop_routing_v4; + drop_routing_v4; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V4_MISS); + counters = routing_v4_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v6_counter; + action set_next_id_routing_v6(next_id_t next_id) { + set_next_id(next_id); + routing_v6_counter.count(); + } + action drop_routing_v6() { + fabric_md.skip_next = true; + routing_v6_counter.count(); + drop_ctl = 1; + } + table routing_v6 { + key = { + hdr.ipv6.dst_addr: lpm @name("ipv6_dst") ; + } + actions = { + set_next_id_routing_v6; + drop_routing_v6; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V6_MISS); + counters = routing_v6_counter; + size = 1024; + } + apply { + if (hdr.ethernet.isValid() && fabric_md.bridged.base.fwd_type == FWD_BRIDGING) { + bridging.apply(); + } else if (hdr.mpls.isValid() && fabric_md.bridged.base.fwd_type == FWD_MPLS) { + mpls.apply(); + } else if (fabric_md.lkp.is_ipv4 && (fabric_md.bridged.base.fwd_type == FWD_IPV4_UNICAST || fabric_md.bridged.base.fwd_type == FWD_IPV4_MULTICAST)) { + routing_v4.apply(); + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type == FWD_IPV6_UNICAST) { + routing_v6.apply(); + } + } +} + +control LookupMdInit(in ingress_headers_t hdr, out lookup_metadata_t lkp_md) { + apply { + lkp_md.eth_dst = hdr.ethernet.dst_addr; + lkp_md.eth_src = hdr.ethernet.src_addr; + lkp_md.eth_type = hdr.eth_type.value; + lkp_md.vlan_id = 0; + if (hdr.vlan_tag.isValid()) { + lkp_md.vlan_id = hdr.vlan_tag.vlan_id; + } + lkp_md.is_ipv4 = false; + lkp_md.ipv4_src = 0; + lkp_md.ipv4_dst = 0; + lkp_md.ip_proto = 0; + lkp_md.l4_sport = 0; + lkp_md.l4_dport = 0; + lkp_md.icmp_type = 0; + lkp_md.icmp_code = 0; + if (hdr.inner_ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.inner_ipv4.src_addr; + lkp_md.ipv4_dst = hdr.inner_ipv4.dst_addr; + lkp_md.ip_proto = hdr.inner_ipv4.protocol; + if (hdr.inner_tcp.isValid()) { + lkp_md.l4_sport = hdr.inner_tcp.sport; + lkp_md.l4_dport = hdr.inner_tcp.dport; + } else if (hdr.inner_udp.isValid()) { + lkp_md.l4_sport = hdr.inner_udp.sport; + lkp_md.l4_dport = hdr.inner_udp.dport; + } else if (hdr.inner_icmp.isValid()) { + lkp_md.icmp_type = hdr.inner_icmp.icmp_type; + lkp_md.icmp_code = hdr.inner_icmp.icmp_code; + } + } else if (hdr.ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.ipv4.src_addr; + lkp_md.ipv4_dst = hdr.ipv4.dst_addr; + lkp_md.ip_proto = hdr.ipv4.protocol; + if (hdr.tcp.isValid()) { + lkp_md.l4_sport = hdr.tcp.sport; + lkp_md.l4_dport = hdr.tcp.dport; + } else if (hdr.udp.isValid()) { + lkp_md.l4_sport = hdr.udp.sport; + lkp_md.l4_dport = hdr.udp.dport; + } else if (hdr.icmp.isValid()) { + lkp_md.icmp_type = hdr.icmp.icmp_type; + lkp_md.icmp_code = hdr.icmp.icmp_code; + } + } + } +} + +control UpfIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bool do_upf_uplink_recirc, inout bit<1> drop_ctl) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + meter(20000, MeterType.bytes) session_meter; + meter(20000, MeterType.bytes) app_meter; + bool is_uplink = false; + bool term_hit = false; + bool sess_hit = false; + bit<32> app_ipv4_addr = 0; + l4_port_t app_l4_port = 0; + bit<8> app_ip_proto = 0; + bit<8> internal_app_id = DEFAULT_APP_ID; + ue_session_id_t ue_session_id = 0; + session_meter_idx_t session_meter_idx_internal = DEFAULT_SESSION_METER_IDX; + app_meter_idx_t app_meter_idx_internal = DEFAULT_APP_METER_IDX; + @hidden action _drop_common() { + drop_ctl = 1; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + } + @hidden action _term_hit(upf_ctr_idx_t ctr_id) { + fabric_md.bridged.upf.upf_ctr_id = ctr_id; + term_hit = true; + } + @hidden action _set_field_encap(teid_t teid, bit<6> qfi) { + fabric_md.bridged.upf.needs_gtpu_encap = true; + fabric_md.bridged.upf.teid = teid; + fabric_md.bridged.upf.qfi = qfi; + } + @hidden action _gtpu_decap() { + fabric_md.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.routing_ipv4_dst = hdr.inner_ipv4.dst_addr; + hdr.ipv4 = hdr.inner_ipv4; + hdr.inner_ipv4.setInvalid(); + hdr.udp = hdr.inner_udp; + hdr.inner_udp.setInvalid(); + hdr.tcp = hdr.inner_tcp; + hdr.inner_tcp.setInvalid(); + hdr.icmp = hdr.inner_icmp; + hdr.inner_icmp.setInvalid(); + hdr.gtpu.setInvalid(); + hdr.gtpu_options.setInvalid(); + hdr.gtpu_ext_psc.setInvalid(); + fabric_md.bridged.base.encap_presence = EncapPresence.NONE; + } + @hidden action _iface_common(slice_id_t slice_id) { + fabric_md.bridged.upf.skip_upf = false; + fabric_md.is_upf_hit = true; + fabric_md.upf_slice_id = slice_id; + } + action iface_access(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_core(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_dbuf(slice_id_t slice_id) { + _iface_common(slice_id); + _gtpu_decap(); + } + action iface_miss() { + fabric_md.bridged.upf.skip_upf = true; + } + table interfaces { + key = { + hdr.ipv4.dst_addr : lpm @name("ipv4_dst_addr") ; + hdr.gtpu.isValid(): exact @name("gtpu_is_valid") ; + } + actions = { + iface_access; + iface_core; + iface_dbuf; + @defaultonly iface_miss; + } + const default_action = iface_miss(); + const size = 64; + } + action set_uplink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_MISS; + } + action set_uplink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_DROP; + } + action set_downlink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_MISS; + } + action set_downlink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP; + } + action set_downlink_session(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + } + action set_downlink_session_buf(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + action set_downlink_session_buf_drop() { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP_BUFF; + } + action set_uplink_session(session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.lkp.ipv4_src; + session_meter_idx_internal = session_meter_idx; + _gtpu_decap(); + } + table downlink_sessions { + key = { + fabric_md.routing_ipv4_dst: exact @name("ue_addr") ; + } + actions = { + set_downlink_session; + set_downlink_session_buf; + set_downlink_session_buf_drop; + set_downlink_session_drop; + @defaultonly set_downlink_session_miss; + } + size = 100000; + const default_action = set_downlink_session_miss(); + } + table uplink_sessions { + key = { + hdr.ipv4.dst_addr: exact @name("tunnel_ipv4_dst") ; + hdr.gtpu.teid : exact @name("teid") ; + } + actions = { + set_uplink_session; + set_uplink_session_drop; + @defaultonly set_uplink_session_miss; + } + size = 100000 * 1; + const default_action = set_uplink_session_miss(); + } + action uplink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_MISS; + } + action downlink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_MISS; + } + action uplink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_DROP; + } + action downlink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_DROP; + } + action app_fwd(upf_ctr_idx_t ctr_id, tc_t tc, app_meter_idx_t app_meter_idx) { + _term_hit(ctr_id); + fabric_md.upf_tc = tc; + app_meter_idx_internal = app_meter_idx; + fabric_md.tc_unknown = false; + } + action downlink_fwd_encap(upf_ctr_idx_t ctr_id, tc_t tc, teid_t teid, bit<6> qfi, app_meter_idx_t app_meter_idx) { + app_fwd(ctr_id, tc, app_meter_idx); + _set_field_encap(teid, qfi); + } + table uplink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + app_fwd; + uplink_drop; + @defaultonly uplink_drop_miss; + } + const default_action = uplink_drop_miss(); + const size = 100000; + } + table downlink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + downlink_fwd_encap; + downlink_drop; + @defaultonly downlink_drop_miss; + } + const default_action = downlink_drop_miss(); + const size = 100000; + } + action set_routing_ipv4_dst(ipv4_addr_t tun_dst_addr) { + fabric_md.routing_ipv4_dst = tun_dst_addr; + } + table ig_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + set_routing_ipv4_dst; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + action set_app_id(bit<8> app_id) { + internal_app_id = app_id; + } + table applications { + key = { + fabric_md.upf_slice_id: exact @name("slice_id") ; + app_ipv4_addr : lpm @name("app_ipv4_addr") ; + app_l4_port : range @name("app_l4_port") ; + app_ip_proto : ternary @name("app_ip_proto") ; + } + actions = { + set_app_id; + @defaultonly nop; + } + const default_action = nop(); + size = 5 * 1; + } + direct_counter(CounterType.packets) recirc_stats; + action recirc_allow() { + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + do_upf_uplink_recirc = true; + fabric_md.egress_port_set = true; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_deny() { + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UPLINK_RECIRC_DENY; + do_upf_uplink_recirc = false; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_miss() { + recirc_stats.count(); + } + table uplink_recirc_rules { + key = { + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + } + actions = { + recirc_allow; + recirc_deny; + @defaultonly recirc_miss; + } + const default_action = recirc_miss; + size = 64; + counters = recirc_stats; + } + apply { + if (hdr.ipv4.isValid()) { + switch (interfaces.apply().action_run) { + iface_access: { + is_uplink = true; + app_ipv4_addr = fabric_md.lkp.ipv4_dst; + app_l4_port = fabric_md.lkp.l4_dport; + app_ip_proto = fabric_md.lkp.ip_proto; + if (fabric_md.bridged.base.encap_presence != EncapPresence.NONE) { + uplink_sessions.apply(); + } + } + iface_core: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + iface_dbuf: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + } + applications.apply(); + if (sess_hit) { + if (is_uplink) { + uplink_terminations.apply(); + uplink_recirc_rules.apply(); + } else { + downlink_terminations.apply(); + } + } else { + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + app_meter.execute_meter((bit<32>)app_meter_idx_internal, fabric_md.upf_meter_color); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + session_meter.execute_meter((bit<32>)session_meter_idx_internal, fabric_md.upf_meter_color); + } + ig_tunnel_peers.apply(); + if (term_hit) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control UpfEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + action load_tunnel_params(l4_port_t tunnel_src_port, ipv4_addr_t tunnel_src_addr, ipv4_addr_t tunnel_dst_addr) { + hdr.ipv4.src_addr = tunnel_src_addr; + hdr.ipv4.dst_addr = tunnel_dst_addr; + hdr.udp.sport = tunnel_src_port; + } + table eg_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + load_tunnel_params; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + @hidden action _encap_initialize() { + hdr.ipv4.version = 4w4; + hdr.ipv4.ihl = 4w5; + hdr.ipv4.dscp = 0; + hdr.ipv4.ecn = 0; + hdr.ipv4.identification = 0x1513; + hdr.ipv4.flags = 0; + hdr.ipv4.frag_offset = 0; + hdr.ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.ipv4.protocol = PROTO_UDP; + hdr.udp.dport = GTPU_UDP_PORT; + hdr.gtpu.version = GTP_V1; + hdr.gtpu.pt = GTP_PROTOCOL_TYPE_GTP; + hdr.gtpu.spare = 0; + hdr.gtpu.seq_flag = 0; + hdr.gtpu.npdu_flag = 0; + hdr.gtpu.msgtype = GTPU_GPDU; + hdr.gtpu.teid = fabric_md.bridged.upf.teid; + hdr.gtpu_options.seq_num = 0; + hdr.gtpu_options.n_pdu_num = 0; + hdr.gtpu_options.next_ext = GTPU_NEXT_EXT_PSC; + hdr.gtpu_ext_psc.len = GTPU_EXT_PSC_LEN; + hdr.gtpu_ext_psc.type = GTPU_EXT_PSC_TYPE_DL; + hdr.gtpu_ext_psc.spare0 = 0; + hdr.gtpu_ext_psc.ppp = 0; + hdr.gtpu_ext_psc.rqi = 0; + hdr.gtpu_ext_psc.next_ext = GTPU_NEXT_EXT_NONE; + } + @hidden action _encap_common() { + hdr.inner_ipv4.setValid(); + hdr.inner_ipv4 = hdr.ipv4; + hdr.udp.setValid(); + hdr.gtpu.setValid(); + _encap_initialize(); + } + action gtpu_only() { + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = hdr.inner_ipv4.total_len; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_ONLY; + } + action gtpu_with_psc() { + hdr.gtpu_options.setValid(); + hdr.gtpu_ext_psc.setValid(); + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.ex_flag = 1; + hdr.gtpu_ext_psc.qfi = fabric_md.bridged.upf.qfi; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_WITH_PSC; + } + table gtpu_encap { + actions = { + gtpu_only; + gtpu_with_psc; + } + default_action = gtpu_only(); + const size = 1; + } + apply { + if (!fabric_md.bridged.upf.skip_upf) { + if (fabric_md.bridged.upf.needs_gtpu_encap) { + if (hdr.udp.isValid()) { + hdr.inner_udp.setValid(); + hdr.inner_udp = hdr.udp; + hdr.udp.setInvalid(); + } + if (hdr.tcp.isValid()) { + hdr.inner_tcp.setValid(); + hdr.inner_tcp = hdr.tcp; + hdr.tcp.setInvalid(); + } + if (hdr.icmp.isValid()) { + hdr.inner_icmp.setValid(); + hdr.inner_icmp = hdr.icmp; + hdr.icmp.setInvalid(); + } + gtpu_encap.apply(); + eg_tunnel_peers.apply(); + } + if (!fabric_md.bridged.upf.skip_egress_upf_ctr) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control IntWatchlist(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntReportType_t recirc_preserved_report_type) { + direct_counter(CounterType.packets_and_bytes) watchlist_counter; + action mark_to_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_FLOW; + recirc_preserved_report_type = INT_REPORT_TYPE_FLOW; + watchlist_counter.count(); + } + action no_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + recirc_preserved_report_type = INT_REPORT_TYPE_NO_REPORT; + } + action no_report_collector() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + } + table watchlist { + key = { + fabric_md.lkp.is_ipv4 : exact @name("ipv4_valid") ; + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto: ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport: range @name("l4_sport") ; + fabric_md.lkp.l4_dport: range @name("l4_dport") ; + } + actions = { + mark_to_report; + no_report_collector; + @defaultonly no_report(); + } + const default_action = no_report(); + const size = 64; + counters = watchlist_counter; + } + apply { + watchlist.apply(); + } +} + +control IntIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) drop_report_counter; + @hidden action report_drop() { + fabric_md.bridged.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_DROP; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + drop_ctl = 0; + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + drop_report_counter.count(); + } + @hidden table drop_report { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + drop_ctl : exact @name("drop_ctl") ; + fabric_md.punt_to_cpu : exact @name("punt_to_cpu") ; + fabric_md.egress_port_set : exact @name("egress_port_set") ; + standard_md.mcast_grp : ternary @name("mcast_group_id") ; + } + actions = { + report_drop; + @defaultonly nop; + } + const entries = { + (INT_REPORT_TYPE_FLOW, 1, false, false, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 1, false, true, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 0, false, false, 0) : report_drop(); + } + const default_action = nop(); + counters = drop_report_counter; + } + apply { + fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec; + fabric_md.bridged.int_bmd.queue_id = 0; + drop_report.apply(); + } +} + +control IntEgress(inout v1model_header_t hdr_v1model, inout fabric_v1model_metadata_t fabric_v1model, inout standard_metadata_t standard_md) { + const bit<48> DEFAULT_TIMESTAMP_MASK = 0xffffc0000000; + const bit<32> DEFAULT_HOP_LATENCY_MASK = 0xffffff00; + egress_headers_t hdr = hdr_v1model.egress; + fabric_egress_metadata_t fabric_md = fabric_v1model.egress; + direct_counter(CounterType.packets_and_bytes) report_counter; + direct_counter(CounterType.packets_and_bytes) int_metadata_counter; + QueueId_t egress_qid = 0; + @hidden register>(1024) seq_number; + @hidden action get_seq_number(in bit<32> seq_number_idx, out bit<32> result) { + bit<32> reg = 0; + seq_number.read(reg, seq_number_idx); + reg = reg + 1; + result = reg; + seq_number.write(seq_number_idx, reg); + } + action check_quota() { + } + action reset_quota() { + } + table queue_latency_thresholds { + key = { + egress_qid : exact @name("egress_qid") ; + fabric_md.int_md.hop_latency[31:16]: range @name("hop_latency_upper") ; + fabric_md.int_md.hop_latency[15:0] : range @name("hop_latency_lower") ; + } + actions = { + check_quota; + reset_quota; + @defaultonly nop; + } + default_action = nop(); + const size = 32 * 4; + } + action set_config(bit<32> hop_latency_mask, bit<48> timestamp_mask) { + fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask; + fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask; + } + table config { + actions = { + @defaultonly set_config; + } + default_action = set_config(DEFAULT_HOP_LATENCY_MASK, DEFAULT_TIMESTAMP_MASK); + const size = 1; + } + @hidden action _report_encap_common(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + random(hdr.report_ipv4.identification, 0, 0xffff); + hdr.report_ipv4.src_addr = src_ip; + hdr.report_ipv4.dst_addr = mon_ip; + hdr.report_udp.dport = mon_port; + get_seq_number((bit<32>)hdr.report_fixed_header.hw_id, hdr.report_fixed_header.seq_no); + hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type; + hdr.common_report_header.switch_id = switch_id; + hdr.common_report_header.pad1 = 0; + hdr.common_report_header.pad2 = 0; + hdr.common_report_header.pad3 = 0; + hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type; + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INVALID; + report_counter.count(); + } + action do_local_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.local_report_header.setValid(); + } + action do_local_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_local_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + } + action do_drop_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_DROP_HEADER; + hdr.drop_report_header.setValid(); + hdr.local_report_header.setInvalid(); + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + } + action do_drop_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_drop_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + hdr.report_mpls.label = mon_label; + } + table report { + key = { + fabric_md.int_report_md.bmd_type : exact @name("bmd_type") ; + fabric_md.int_report_md.mirror_type: exact @name("mirror_type") ; + fabric_md.int_report_md.report_type: exact @name("int_report_type") ; + } + actions = { + do_local_report_encap; + do_local_report_encap_mpls; + do_drop_report_encap; + do_drop_report_encap_mpls; + @defaultonly nop(); + } + default_action = nop; + const size = 6; + counters = report_counter; + } + @hidden action init_int_metadata(bit<3> report_type) { + fabric_md.bridged.int_bmd.mirror_session_id = V1MODEL_INT_MIRROR_SESSION; + fabric_md.int_report_md.setValid(); + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.bmd_type = BridgedMdType_t.EGRESS_MIRROR; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.report_type = fabric_md.bridged.int_bmd.report_type; + fabric_md.int_report_md.ig_port = fabric_md.bridged.base.ig_port; + fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port; + fabric_md.int_report_md.queue_id = egress_qid; + fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth; + fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]; + fabric_md.int_report_md.ip_eth_type = fabric_md.bridged.base.ip_eth_type; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + fabric_md.int_report_md.report_type = report_type; + int_metadata_counter.count(); + } + @hidden table int_metadata { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + fabric_v1model.drop_ctl : exact @name("drop_ctl") ; + fabric_md.int_md.queue_report : exact @name("queue_report") ; + } + actions = { + init_int_metadata; + @defaultonly nop(); + } + const default_action = nop(); + const entries = { + (INT_REPORT_TYPE_FLOW, 0, false) : init_int_metadata(INT_REPORT_TYPE_FLOW); + (INT_REPORT_TYPE_FLOW, 1, false) : init_int_metadata(INT_REPORT_TYPE_DROP); + } + counters = int_metadata_counter; + } + @hidden action adjust_ip_udp_len(bit<16> adjust_ip, bit<16> adjust_udp) { + hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip; + hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp; + } + @hidden table adjust_int_report_hdr_length { + key = { + fabric_md.bridged.int_bmd.wip_type: exact @name("is_int_wip") ; + } + actions = { + @defaultonly nop(); + adjust_ip_udp_len; + } + const default_action = nop(); + const entries = { + INT_IS_WIP : adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES); + INT_IS_WIP_WITH_MPLS : adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES); + } + } + apply { + fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_md.timestamp = standard_md.egress_global_timestamp; + queue_latency_thresholds.apply(); + config.apply(); + hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]; + if (fabric_md.int_report_md.isValid()) { + report.apply(); + } else { + if (int_metadata.apply().hit) { + clone_preserving_field_list(CloneType.E2E, (bit<32>)fabric_md.bridged.int_bmd.mirror_session_id, PRESERVE_INT_MD); + } + } + adjust_int_report_hdr_length.apply(); + fabric_v1model.egress = fabric_md; + hdr_v1model.egress = hdr; + } +} + +control IntTnaEgressParserEmulator(inout v1model_header_t hdr_v1model, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + egress_headers_t hdr = hdr_v1model.egress; + @hidden action set_common_int_headers() { + hdr.report_ethernet.setValid(); + hdr.report_eth_type.setValid(); + hdr.report_ipv4.setValid(); + hdr.report_ipv4.version = 4w4; + hdr.report_ipv4.ihl = 4w5; + hdr.report_ipv4.dscp = 0; + hdr.report_ipv4.ecn = 2w0; + hdr.report_ipv4.flags = 0; + hdr.report_ipv4.frag_offset = 0; + hdr.report_ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.report_ipv4.protocol = PROTO_UDP; + hdr.report_udp.setValid(); + hdr.report_udp.sport = 0; + hdr.report_fixed_header.setValid(); + hdr.report_fixed_header.ver = 0; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.report_fixed_header.rsvd = 0; + hdr.common_report_header.setValid(); + } + @hidden action set_common_int_drop_headers() { + set_common_int_headers(); + fabric_md.int_report_md.setValid(); + fabric_md.int_report_md.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.int_report_md.report_type = INT_REPORT_TYPE_DROP; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INVALID; + hdr.drop_report_header.setValid(); + } + @hidden action parse_int_ingress_drop() { + set_common_int_drop_headers(); + fabric_md.int_report_md.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.int_report_md.encap_presence = fabric_md.bridged.base.encap_presence; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + hdr.common_report_header.ig_port = fabric_md.bridged.base.ig_port; + hdr.common_report_header.eg_port = 0; + hdr.common_report_header.queue_id = 0; + } + @hidden action parse_int_report_mirror() { + set_common_int_headers(); + fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp; + hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port; + hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port; + hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id; + hdr.local_report_header.setValid(); + hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy; + hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp; + } + apply { + fabric_md.is_int_recirc = true; + hdr_v1model.ingress.vlan_tag.setInvalid(); + if (hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()) { + hdr_v1model.ingress.ipv4.setInvalid(); + hdr_v1model.ingress.tcp.setInvalid(); + hdr_v1model.ingress.udp.setInvalid(); + hdr_v1model.ingress.icmp.setInvalid(); + hdr_v1model.ingress.vxlan.setInvalid(); + hdr_v1model.ingress.inner_ethernet.setInvalid(); + hdr_v1model.ingress.inner_eth_type.setInvalid(); + hdr_v1model.ingress.gtpu.setInvalid(); + hdr_v1model.ingress.gtpu_options.setInvalid(); + hdr_v1model.ingress.gtpu_ext_psc.setInvalid(); + } + if ((bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parse_int_ingress_drop(); + recirculate_preserving_field_list(NO_PRESERVATION); + } else { + parse_int_report_mirror(); + recirculate_preserving_field_list(PRESERVE_INT_MD); + } + hdr_v1model.egress = hdr; + } +} + +control FabricIngress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + LookupMdInit() lkp_md_init; + StatsIngress() stats; + PacketIoIngress() pkt_io; + Filtering() filtering; + Forwarding() forwarding; + PreNext() pre_next; + Acl() acl; + Next() next; + Hasher() hasher; + IngressSliceTcClassifier() slice_tc_classifier; + IngressQos() qos; + UpfIngress() upf; + IntWatchlist() int_watchlist; + IntIngress() int_ingress; + apply { + mark_to_drop(standard_md); + if (standard_md.parser_error == error.PacketRejectedByParser) { + exit; + } + if (standard_md.instance_type == 4) { + fabric_md.ingress.bridged.base.ig_port = FAKE_V1MODEL_RECIRC_PORT; + } + lkp_md_init.apply(hdr.ingress, fabric_md.ingress.lkp); + pkt_io.apply(hdr.ingress, fabric_md.ingress, fabric_md.skip_egress, standard_md, fabric_md.recirc_preserved_egress_port); + int_watchlist.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_report_type); + stats.apply(fabric_md.ingress.lkp, fabric_md.ingress.bridged.base.ig_port, fabric_md.ingress.bridged.base.stats_flow_id); + slice_tc_classifier.apply(hdr.ingress, standard_md, fabric_md.ingress); + filtering.apply(hdr.ingress, fabric_md.ingress, standard_md); + if (!fabric_md.ingress.skip_forwarding) { + upf.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.do_upf_uplink_recirc, fabric_md.drop_ctl); + } + if (!fabric_md.ingress.skip_forwarding) { + forwarding.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + } + hasher.apply(hdr.ingress, fabric_md.ingress); + if (!fabric_md.ingress.skip_next) { + pre_next.apply(hdr.ingress, fabric_md.ingress); + } + acl.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port, fabric_md.drop_ctl); + if (!fabric_md.ingress.skip_next) { + next.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port); + } + qos.apply(fabric_md.ingress, standard_md, fabric_md.drop_ctl); + int_ingress.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + fabric_md.egress.bridged = fabric_md.ingress.bridged; + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +control FabricEgress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + StatsEgress() stats; + PacketIoEgress() pkt_io_egress; + EgressNextControl() egress_next; + EgressDscpRewriter() dscp_rewriter; + UpfEgress() upf; + IntTnaEgressParserEmulator() parser_emulator; + IntEgress() int_egress; + apply { + fabric_md.egress.cpu_port = 0; + if (fabric_md.skip_egress) { + exit; + } + if (standard_md.instance_type == 2) { + fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md.recirc_preserved_drop_reason; + fabric_md.egress.bridged.int_bmd.report_type = fabric_md.recirc_preserved_report_type; + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + if ((bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + pkt_io_egress.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_ingress_port); + stats.apply(fabric_md.egress.bridged.base.stats_flow_id, standard_md.egress_port, fabric_md.egress.bridged.bmd_type); + egress_next.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_drop_reason, fabric_md.drop_ctl); + upf.apply(hdr.ingress, fabric_md.egress); + int_egress.apply(hdr, fabric_md, standard_md); + dscp_rewriter.apply(fabric_md.egress, standard_md, hdr.ingress); + if (fabric_md.do_upf_uplink_recirc) { + recirculate_preserving_field_list(NO_PRESERVATION); + } + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +V1Switch(FabricParser(), FabricVerifyChecksum(), FabricIngress(), FabricEgress(), FabricComputeChecksum(), FabricDeparser()) main; + diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json b/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json new file mode 100644 index 000000000..fe66f93e4 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json @@ -0,0 +1,28235 @@ +{ + "header_types" : [ + { + "name" : "scalars_0", + "id" : 0, + "fields" : [ + ["tmp_2", 16, false], + ["tmp_4", 1, false], + ["tmp_6", 16, false], + ["tmp_12", 3, false], + ["tmp_13", 8, false], + ["gtpu_ext_len_0", 8, false], + ["tmp_3", 16, false], + ["tmp_5", 16, false], + ["tmp_7", 4, false], + ["tmp_8", 112, false], + ["tmp_9", 112, false], + ["tmp_10", 112, false], + ["tmp_11", 64, false], + ["tmp_14", 32, false], + ["tmp_15", 32, false], + ["tmp_16", 32, false], + ["tmp_17", 32, false], + ["tmp_18", 8, false], + ["tmp_19", 32, false], + ["tmp_20", 32, false], + ["tmp_21", 32, false], + ["tmp_22", 32, false], + ["tmp_23", 48, false], + ["tmp_24", 48, false], + ["tmp_25", 16, false], + ["tmp_26", 32, false], + ["tmp_27", 32, false], + ["tmp_28", 8, false], + ["tmp_29", 16, false], + ["tmp_30", 16, false], + ["tmp_31", 32, false], + ["qos_packet_color", 2, false], + ["upf_is_uplink", 1, false], + ["upf_term_hit", 1, false], + ["upf_sess_hit", 1, false], + ["upf_app_ipv4_addr", 32, false], + ["upf_app_l4_port", 16, false], + ["upf_app_ip_proto", 8, false], + ["upf_internal_app_id", 8, false], + ["upf_ue_session_id", 32, false], + ["upf_session_meter_idx_internal", 15, false], + ["upf_app_meter_idx_internal", 15, false], + ["tmp_32", 32, false], + ["tmp_33", 32, false], + ["tmp_34", 32, false], + ["tmp_35", 32, false], + ["tmp_36", 32, false], + ["tmp_37", 32, false], + ["tmp_38", 32, false], + ["tmp_39", 32, false], + ["tmp_40", 32, false], + ["tmp_41", 32, false], + ["dscp_rewriter_tmp_dscp", 6, false], + ["int_egress_fabric_md_pkt_length", 16, false], + ["int_egress_egress_qid", 5, false], + ["int_egress_reg", 32, false], + ["key_0", 16, false], + ["key_1", 16, false], + ["userMetadata._skip_egress0", 1, false], + ["userMetadata._do_upf_uplink_recirc1", 1, false], + ["userMetadata._drop_ctl2", 1, false], + ["userMetadata._int_mirror_type3", 3, false], + ["userMetadata._ingress_ecmp_hash5", 32, false], + ["userMetadata._ingress_lkp_eth_dst6", 48, false], + ["userMetadata._ingress_lkp_eth_src7", 48, false], + ["userMetadata._ingress_lkp_eth_type8", 16, false], + ["userMetadata._ingress_lkp_vlan_id9", 12, false], + ["userMetadata._ingress_lkp_is_ipv410", 1, false], + ["userMetadata._ingress_lkp_ipv4_src11", 32, false], + ["userMetadata._ingress_lkp_ipv4_dst12", 32, false], + ["userMetadata._ingress_lkp_ip_proto13", 8, false], + ["userMetadata._ingress_lkp_l4_sport14", 16, false], + ["userMetadata._ingress_lkp_l4_dport15", 16, false], + ["userMetadata._ingress_lkp_icmp_type16", 8, false], + ["userMetadata._ingress_lkp_icmp_code17", 8, false], + ["userMetadata._ingress_routing_ipv4_dst18", 32, false], + ["userMetadata._ingress_skip_forwarding19", 1, false], + ["userMetadata._ingress_skip_next20", 1, false], + ["userMetadata._ingress_next_id21", 32, false], + ["userMetadata._ingress_egress_port_set22", 1, false], + ["userMetadata._ingress_punt_to_cpu23", 1, false], + ["userMetadata._ingress_ipv4_checksum_err24", 1, false], + ["userMetadata._ingress_inner_ipv4_checksum_err25", 1, false], + ["userMetadata._ingress_slice_id26", 4, false], + ["userMetadata._ingress_tc27", 2, false], + ["userMetadata._ingress_tc_unknown28", 1, false], + ["userMetadata._ingress_is_upf_hit29", 1, false], + ["userMetadata._ingress_upf_slice_id30", 4, false], + ["userMetadata._ingress_upf_tc31", 2, false], + ["userMetadata._ingress_upf_meter_color32", 2, false], + ["userMetadata._ingress_ig_port_type33", 2, false], + ["userMetadata._ingress_mirror_mirror_session_id34", 10, false], + ["userMetadata._ingress_mirror_bmd_type35", 8, false], + ["userMetadata._egress_cpu_port37", 9, false], + ["userMetadata._egress_inner_ipv4_checksum_err38", 1, false], + ["userMetadata._egress_int_md_hop_latency40", 32, false], + ["userMetadata._egress_int_md_timestamp41", 48, false], + ["userMetadata._egress_int_md_vlan_stripped42", 1, false], + ["userMetadata._egress_int_md_queue_report43", 1, false], + ["userMetadata._egress_int_ipv4_len44", 16, false], + ["userMetadata._egress_is_int_recirc45", 1, false], + ["userMetadata._egress_pkt_length46", 16, false], + ["userMetadata._recirc_preserved_report_type47", 3, false], + ["userMetadata._recirc_preserved_egress_port48", 9, false], + ["userMetadata._recirc_preserved_drop_reason49", 8, false], + ["userMetadata._recirc_preserved_ingress_port50", 9, false], + ["_padding_1", 3, false] + ] + }, + { + "name" : "fake_ethernet_t", + "id" : 1, + "fields" : [ + ["_pad0", 48, false], + ["_pad1", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "packet_out_header_t", + "id" : 2, + "fields" : [ + ["pad0", 7, false], + ["egress_port", 9, false], + ["pad1", 3, false], + ["queue_id", 5, false], + ["pad2", 5, false], + ["cpu_loopback_mode", 2, false], + ["do_forwarding", 1, false], + ["pad3", 16, false], + ["pad4", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "gtpu_t", + "id" : 3, + "fields" : [ + ["version", 3, false], + ["pt", 1, false], + ["spare", 1, false], + ["ex_flag", 1, false], + ["seq_flag", 1, false], + ["npdu_flag", 1, false], + ["msgtype", 8, false], + ["msglen", 16, false], + ["teid", 32, false] + ] + }, + { + "name" : "ethernet_t", + "id" : 4, + "fields" : [ + ["dst_addr", 48, false], + ["src_addr", 48, false] + ] + }, + { + "name" : "eth_type_t", + "id" : 5, + "fields" : [ + ["value", 16, false] + ] + }, + { + "name" : "ipv4_t", + "id" : 6, + "fields" : [ + ["version", 4, false], + ["ihl", 4, false], + ["dscp", 6, false], + ["ecn", 2, false], + ["total_len", 16, false], + ["identification", 16, false], + ["flags", 3, false], + ["frag_offset", 13, false], + ["ttl", 8, false], + ["protocol", 8, false], + ["hdr_checksum", 16, false], + ["src_addr", 32, false], + ["dst_addr", 32, false] + ] + }, + { + "name" : "udp_t", + "id" : 7, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false], + ["len", 16, false], + ["checksum", 16, false] + ] + }, + { + "name" : "report_fixed_header_t", + "id" : 8, + "fields" : [ + ["ver", 4, false], + ["nproto", 4, false], + ["dqf", 3, false], + ["rsvd", 15, false], + ["hw_id", 6, false], + ["seq_no", 32, false], + ["ig_tstamp", 32, false] + ] + }, + { + "name" : "common_report_header_t", + "id" : 9, + "fields" : [ + ["switch_id", 32, false], + ["pad1", 7, false], + ["ig_port", 9, false], + ["pad2", 7, false], + ["eg_port", 9, false], + ["pad3", 3, false], + ["queue_id", 5, false] + ] + }, + { + "name" : "local_report_header_t", + "id" : 10, + "fields" : [ + ["pad1", 5, false], + ["queue_occupancy", 19, false], + ["eg_tstamp", 32, false] + ] + }, + { + "name" : "drop_report_header_t", + "id" : 11, + "fields" : [ + ["drop_reason", 8, false], + ["pad", 16, false] + ] + }, + { + "name" : "mpls_t", + "id" : 12, + "fields" : [ + ["label", 20, false], + ["tc", 3, false], + ["bos", 1, false], + ["ttl", 8, false] + ] + }, + { + "name" : "bridged_metadata_t", + "id" : 13, + "fields" : [ + ["_bmd_type0", 8, false], + ["_base_inner_hash1", 32, false], + ["_base_mpls_label2", 20, false], + ["_base_ig_port3", 9, false], + ["_base_is_multicast4", 1, 0], + ["_base_fwd_type5", 3, false], + ["_base_vlan_id6", 12, false], + ["_base_encap_presence7", 2, false], + ["_base_mpls_ttl8", 8, false], + ["_base_ig_tstamp9", 48, false], + ["_base_ip_eth_type10", 16, false], + ["_base_stats_flow_id11", 10, false], + ["_base_slice_tc12", 6, false], + ["_upf_tun_peer_id13", 8, false], + ["_upf_upf_ctr_id14", 12, false], + ["_upf_qfi15", 6, false], + ["_upf_needs_gtpu_encap16", 1, 0], + ["_upf_skip_upf17", 1, 0], + ["_upf_skip_egress_upf_ctr18", 1, 0], + ["_upf_teid19", 32, false], + ["_upf__pad20", 4, false], + ["_int_bmd_report_type21", 3, false], + ["_int_bmd_mirror_session_id22", 10, false], + ["_int_bmd_drop_reason23", 8, false], + ["_int_bmd_queue_id24", 5, false], + ["_int_bmd_egress_port25", 9, false], + ["_int_bmd_wip_type26", 8, false], + ["__pad027", 1, false], + ["__pad128", 7, false], + ["__pad229", 5, false] + ] + }, + { + "name" : "int_report_metadata_t", + "id" : 14, + "fields" : [ + ["bmd_type", 8, false], + ["_pad0", 5, false], + ["mirror_type", 3, false], + ["_pad1", 7, false], + ["ig_port", 9, false], + ["_pad2", 7, false], + ["eg_port", 9, false], + ["_pad3", 3, false], + ["queue_id", 5, false], + ["_pad4", 5, false], + ["queue_occupancy", 19, false], + ["ig_tstamp", 32, false], + ["eg_tstamp", 32, false], + ["drop_reason", 8, false], + ["ip_eth_type", 16, false], + ["_pad5", 6, false], + ["encap_presence", 2, false], + ["report_type", 3, false], + ["_pad6", 5, false], + ["flow_hash", 32, false] + ] + }, + { + "name" : "int_metadata_t", + "id" : 15, + "fields" : [ + ["hop_latency", 32, false], + ["timestamp", 48, false], + ["vlan_stripped", 1, 0], + ["queue_report", 1, 0], + ["_padding", 6, false] + ] + }, + { + "name" : "standard_metadata", + "id" : 16, + "fields" : [ + ["ingress_port", 9, false], + ["egress_spec", 9, false], + ["egress_port", 9, false], + ["instance_type", 32, false], + ["packet_length", 32, false], + ["enq_timestamp", 32, false], + ["enq_qdepth", 19, false], + ["deq_timedelta", 32, false], + ["deq_qdepth", 19, false], + ["ingress_global_timestamp", 48, false], + ["egress_global_timestamp", 48, false], + ["mcast_grp", 16, false], + ["egress_rid", 16, false], + ["checksum_error", 1, false], + ["parser_error", 32, false], + ["priority", 3, false], + ["_padding_0", 3, false] + ] + }, + { + "name" : "packet_in_header_t", + "id" : 17, + "fields" : [ + ["ingress_port", 9, false], + ["_pad0", 7, false] + ] + }, + { + "name" : "vlan_tag_t", + "id" : 18, + "fields" : [ + ["eth_type", 16, false], + ["pri", 3, false], + ["cfi", 1, false], + ["vlan_id", 12, false] + ] + }, + { + "name" : "ipv6_t", + "id" : 19, + "fields" : [ + ["version", 4, false], + ["traffic_class", 8, false], + ["flow_label", 20, false], + ["payload_len", 16, false], + ["next_hdr", 8, false], + ["hop_limit", 8, false], + ["src_addr", 128, false], + ["dst_addr", 128, false] + ] + }, + { + "name" : "tcp_t", + "id" : 20, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false] + ] + }, + { + "name" : "icmp_t", + "id" : 21, + "fields" : [ + ["icmp_type", 8, false], + ["icmp_code", 8, false] + ] + }, + { + "name" : "gtpu_options_t", + "id" : 22, + "fields" : [ + ["seq_num", 16, false], + ["n_pdu_num", 8, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "gtpu_ext_psc_t", + "id" : 23, + "fields" : [ + ["len", 8, false], + ["type", 4, false], + ["spare0", 4, false], + ["ppp", 1, false], + ["rqi", 1, false], + ["qfi", 6, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "vxlan_t", + "id" : 24, + "fields" : [ + ["flags", 8, false], + ["reserved", 24, false], + ["vni", 24, false], + ["reserved_2", 8, false] + ] + } + ], + "headers" : [ + { + "name" : "tmp", + "id" : 0, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_0", + "id" : 1, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_1", + "id" : 2, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "gtpu_0", + "id" : 3, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ethernet", + "id" : 4, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_eth_type", + "id" : 5, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ipv4", + "id" : 6, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_udp", + "id" : 7, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_fixed_header", + "id" : 8, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_common_report_header", + "id" : 9, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_local_report_header", + "id" : 10, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_drop_report_header", + "id" : 11, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_eth_type", + "id" : 12, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_mpls", + "id" : 13, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_ipv4", + "id" : 14, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_udp", + "id" : 15, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_fixed_header", + "id" : 16, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_common_report_header", + "id" : 17, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_local_report_header", + "id" : 18, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_drop_report_header", + "id" : 19, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_eth_type", + "id" : 20, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_bridged", + "id" : 21, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_report_md", + "id" : 22, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_md", + "id" : 23, + "header_type" : "int_metadata_t", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "scalars", + "id" : 24, + "header_type" : "scalars_0", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "standard_metadata", + "id" : 25, + "header_type" : "standard_metadata", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_out0", + "id" : 26, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_in1", + "id" : 27, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_fake_ethernet2", + "id" : 28, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ethernet3", + "id" : 29, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vlan_tag4", + "id" : 30, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_eth_type5", + "id" : 31, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_mpls6", + "id" : 32, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv47", + "id" : 33, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv68", + "id" : 34, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_tcp9", + "id" : 35, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_udp10", + "id" : 36, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_icmp11", + "id" : 37, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu12", + "id" : 38, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_options13", + "id" : 39, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_ext_psc14", + "id" : 40, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vxlan15", + "id" : 41, + "header_type" : "vxlan_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ethernet16", + "id" : 42, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_eth_type17", + "id" : 43, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ipv418", + "id" : 44, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_tcp19", + "id" : 45, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_udp20", + "id" : 46, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_icmp21", + "id" : 47, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_packet_in22", + "id" : 48, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_fake_ethernet23", + "id" : 49, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ethernet24", + "id" : 50, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_eth_type25", + "id" : 51, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_mpls26", + "id" : 52, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ipv427", + "id" : 53, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_udp28", + "id" : 54, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_fixed_header29", + "id" : 55, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_common_report_header30", + "id" : 56, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_local_report_header31", + "id" : 57, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_drop_report_header32", + "id" : 58, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ethernet33", + "id" : 59, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_vlan_tag34", + "id" : 60, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_eth_type35", + "id" : 61, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_mpls36", + "id" : 62, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_ipv437", + "id" : 63, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_udp38", + "id" : 64, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu39", + "id" : 65, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_options40", + "id" : 66, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_ext_psc41", + "id" : 67, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv442", + "id" : 68, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv643", + "id" : 69, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_udp44", + "id" : 70, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_bridged4", + "id" : 71, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_bridged36", + "id" : 72, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_int_report_md39", + "id" : 73, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + } + ], + "header_stacks" : [], + "header_union_types" : [], + "header_unions" : [], + "header_union_stacks" : [], + "field_lists" : [ + { + "id" : 1, + "name" : "field_list241", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ] + }, + { + "id" : 2, + "name" : "field_list231", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ] + }, + { + "id" : 3, + "name" : "empty", + "elements" : [] + }, + { + "id" : 4, + "name" : "empty_0", + "elements" : [] + }, + { + "id" : 5, + "name" : "empty_1", + "elements" : [] + } + ], + "errors" : [ + ["NoError", 1], + ["PacketTooShort", 2], + ["NoMatch", 3], + ["StackOutOfBounds", 4], + ["HeaderTooShort", 5], + ["ParserTimeout", 6], + ["ParserInvalidArgument", 7], + ["PacketRejectedByParser", 8] + ], + "enums" : [], + "parsers" : [ + { + "name" : "parser", + "id" : 0, + "init_state" : "start", + "parse_states" : [ + { + "name" : "start", + "id" : 0, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_tstamp9"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_global_timestamp"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf02", + "mask" : null, + "next_state" : "parse_fake_ethernet" + }, + { + "type" : "hexstr", + "value" : "0xbf03", + "mask" : null, + "next_state" : "parse_fake_ethernet_and_accept" + }, + { + "type" : "hexstr", + "value" : "0xbf01", + "mask" : null, + "next_state" : "check_packet_out" + }, + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + } + ] + }, + { + "name" : "check_packet_out", + "id" : 1, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x69" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x7f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "egress_port"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x60" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x5d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "queue_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x58" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x53" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "cpu_loopback_mode"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x51" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "do_forwarding"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad3"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_packet_out_and_accept" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "strip_packet_out" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + } + ] + }, + { + "name" : "parse_int_wip_ipv4", + "id" : 2, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_int_wip_mpls", + "id" : 3, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_mpls" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_packet_out_and_accept", + "id" : 4, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_packet_out0" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "strip_packet_out", + "id" : 5, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_fake_ethernet", + "id" : 6, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_1" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + } + ] + }, + { + "name" : "parse_fake_ethernet_and_accept", + "id" : 7, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_ethernet", + "id" : 8, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ethernet3" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x88a8", + "mask" : null, + "next_state" : "parse_vlan_tag" + }, + { + "type" : "hexstr", + "value" : "0x8100", + "mask" : "0xefff", + "next_state" : "parse_vlan_tag" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_untagged" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + } + ] + }, + { + "name" : "parse_vlan_tag", + "id" : 9, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vlan_tag4" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + } + ] + }, + { + "name" : "parse_untagged", + "id" : 10, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_eth_type", + "id" : 11, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_eth_type5" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8847", + "mask" : null, + "next_state" : "parse_mpls" + }, + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_mpls", + "id" : 12, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_mpls6" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + }, + { + "type" : "lookahead", + "value" : [0, 4] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x04", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "reject_packet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + } + ] + }, + { + "name" : "reject_packet", + "id" : 13, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "bool", + "value" : false + }, + { + "type" : "hexstr", + "value" : "0x8" + } + ], + "op" : "verify" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_non_mpls", + "id" : 14, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_ipv4", + "id" : 15, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv47" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ] + }, + { + "name" : "parse_ipv6", + "id" : 16, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv68" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x86dd" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x3a", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "next_hdr"] + } + ] + }, + { + "name" : "parse_icmp", + "id" : 17, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_icmp11" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_tcp", + "id" : 18, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_tcp9" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_udp", + "id" : 19, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_udp10" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + { + "type" : "lookahead", + "value" : [0, 64] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "gtpu_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "version"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "pt"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3c" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "spare"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3b" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "ex_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3a" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "seq_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x39" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "npdu_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x38" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msgtype"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x20" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "teid"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x086801ff", + "mask" : null, + "next_state" : "parse_gtpu" + }, + { + "type" : "hexstr", + "value" : "0x12b50000", + "mask" : "0xffff0000", + "next_state" : "parse_vxlan" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + } + ] + }, + { + "name" : "parse_gtpu", + "id" : 20, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu12" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x000000", + "mask" : null, + "next_state" : "set_gtpu_only" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_gtpu_options" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + } + ] + }, + { + "name" : "set_gtpu_only", + "id" : 21, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_inner_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_gtpu_options", + "id" : 22, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_options13" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + }, + { + "type" : "lookahead", + "value" : [0, 8] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8501", + "mask" : null, + "next_state" : "parse_gtpu_ext_psc" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + } + ] + }, + { + "name" : "parse_gtpu_ext_psc", + "id" : 23, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + } + ] + }, + { + "name" : "parse_vxlan", + "id" : 24, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vxlan15" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x03" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ethernet16" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_eth_type17" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_eth_type17", "value"] + } + ] + }, + { + "name" : "parse_inner_ipv4", + "id" : 25, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ipv418" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_inner_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_inner_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_inner_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ] + }, + { + "name" : "parse_inner_tcp", + "id" : 26, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_tcp19" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_udp", + "id" : 27, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_udp20" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_icmp", + "id" : 28, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_icmp21" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + } + ] + } + ], + "parse_vsets" : [], + "deparsers" : [ + { + "name" : "deparser", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4", + "line" : 321, + "column" : 8, + "source_fragment" : "FabricDeparser" + }, + "order" : ["_ingress_fake_ethernet2", "_ingress_packet_in1", "_egress_report_ethernet24", "_egress_report_eth_type25", "_egress_report_mpls26", "_egress_report_ipv427", "_egress_report_udp28", "_egress_report_fixed_header29", "_egress_common_report_header30", "_egress_local_report_header31", "_egress_drop_report_header32", "_ingress_ethernet3", "_ingress_vlan_tag4", "_ingress_eth_type5", "_ingress_mpls6", "_ingress_ipv47", "_ingress_ipv68", "_ingress_tcp9", "_ingress_udp10", "_ingress_icmp11", "_ingress_gtpu12", "_ingress_gtpu_options13", "_ingress_gtpu_ext_psc14", "_ingress_vxlan15", "_ingress_inner_ethernet16", "_ingress_inner_eth_type17", "_ingress_inner_ipv418", "_ingress_inner_tcp19", "_ingress_inner_udp20", "_ingress_inner_icmp21"], + "primitives" : [] + } + ], + "meter_arrays" : [ + { + "name" : "FabricIngress.qos.slice_tc_meter", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 104, + "column" : 41, + "source_fragment" : "slice_tc_meter" + }, + "is_direct" : false, + "size" : 64, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.session_meter", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "session_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.app_meter", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 23, + "column" : 34, + "source_fragment" : "app_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + } + ], + "counter_arrays" : [ + { + "name" : "FabricIngress.stats.flow_counter", + "id" : 0, + "is_direct" : true, + "binding" : "FabricIngress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 14, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan_counter", + "id" : 1, + "is_direct" : true, + "binding" : "FabricIngress.filtering.ingress_port_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 17, + "column" : 50, + "source_fragment" : "ingress_port_vlan_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier_counter", + "id" : 2, + "is_direct" : true, + "binding" : "FabricIngress.filtering.fwd_classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 71, + "column" : 50, + "source_fragment" : "fwd_classifier_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_type_counter", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 78, + "column" : 46, + "source_fragment" : "fwd_type_counter" + }, + "size" : 8, + "is_direct" : false + }, + { + "name" : "FabricIngress.forwarding.bridging_counter", + "id" : 4, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.bridging", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 29, + "column" : 50, + "source_fragment" : "bridging_counter" + } + }, + { + "name" : "FabricIngress.forwarding.mpls_counter", + "id" : 5, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "mpls_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4_counter", + "id" : 6, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v4", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 98, + "column" : 50, + "source_fragment" : "routing_v4_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6_counter", + "id" : 7, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v6", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 142, + "column" : 50, + "source_fragment" : "routing_v6_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls_counter", + "id" : 8, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "next_mpls_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan_counter", + "id" : 9, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 39, + "column" : 50, + "source_fragment" : "next_vlan_counter" + } + }, + { + "name" : "FabricIngress.acl.acl_counter", + "id" : 10, + "is_direct" : true, + "binding" : "FabricIngress.acl.acl", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 19, + "column" : 50, + "source_fragment" : "acl_counter" + } + }, + { + "name" : "FabricIngress.next.hashed_counter", + "id" : 11, + "is_direct" : true, + "binding" : "FabricIngress.next.hashed", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 115, + "column" : 50, + "source_fragment" : "hashed_counter" + } + }, + { + "name" : "FabricIngress.next.multicast_counter", + "id" : 12, + "is_direct" : true, + "binding" : "FabricIngress.next.multicast", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 148, + "column" : 50, + "source_fragment" : "multicast_counter" + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier_stats", + "id" : 13, + "is_direct" : true, + "binding" : "FabricIngress.slice_tc_classifier.classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 20, + "column" : 40, + "source_fragment" : "classifier_stats" + } + }, + { + "name" : "FabricIngress.qos.queues_stats", + "id" : 14, + "is_direct" : true, + "binding" : "FabricIngress.qos.queues", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 106, + "column" : 40, + "source_fragment" : "queues_stats" + } + }, + { + "name" : "FabricIngress.upf.terminations_counter", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 20, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricIngress.upf.recirc_stats", + "id" : 16, + "is_direct" : true, + "binding" : "FabricIngress.upf.uplink_recirc_rules", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 356, + "column" : 40, + "source_fragment" : "recirc_stats" + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist_counter", + "id" : 17, + "is_direct" : true, + "binding" : "FabricIngress.int_watchlist.watchlist", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "watchlist_counter" + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report_counter", + "id" : 18, + "is_direct" : true, + "binding" : "FabricIngress.int_ingress.drop_report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "drop_report_counter" + } + }, + { + "name" : "FabricEgress.stats.flow_counter", + "id" : 19, + "is_direct" : true, + "binding" : "FabricEgress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 47, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan_counter", + "id" : 20, + "is_direct" : true, + "binding" : "FabricEgress.egress_next.egress_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 241, + "column" : 50, + "source_fragment" : "egress_vlan_counter" + } + }, + { + "name" : "FabricEgress.upf.terminations_counter", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 477, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricEgress.int_egress.report_counter", + "id" : 22, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 131, + "column" : 50, + "source_fragment" : "report_counter" + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata_counter", + "id" : 23, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.int_metadata", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 132, + "column" : 50, + "source_fragment" : "int_metadata_counter" + } + } + ], + "register_arrays" : [ + { + "name" : "FabricEgress.int_egress.seq_number", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 138, + "column" : 28, + "source_fragment" : "seq_number" + }, + "size" : 1024, + "bitwidth" : 32 + } + ], + "calculations" : [ + { + "name" : "calc", + "id" : 0, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + } + ] + }, + { + "name" : "calc_0", + "id" : 1, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + } + ] + }, + { + "name" : "calc_1", + "id" : 2, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + } + ] + }, + { + "name" : "calc_2", + "id" : 3, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + } + ] + }, + { + "name" : "calc_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_4", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + }, + { + "name" : "calc_5", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_egress_report_ipv427", "version"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ihl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dscp"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ecn"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "total_len"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "identification"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "flags"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "protocol"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "src_addr"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dst_addr"] + } + ] + }, + { + "name" : "calc_6", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_7", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + } + ], + "learn_lists" : [], + "actions" : [ + { + "name" : "nop", + "id" : 0, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 1, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 2, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 3, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 4, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 5, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 6, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "NoAction", + "id" : 7, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.stats.count", + "id" : 8, + "runtime_data" : [ + { + "name" : "flow_id", + "bitwidth" : 10 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_stats_flow_id11"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 17, + "column" : 22, + "source_fragment" : "= flow_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pkt_io.do_packet_out", + "id" : 9, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 14, + "column" : 37, + "source_fragment" : "= hdr.packet_out.egress_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 15, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_out0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "hdr.packet_out.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 17, + "column" : 20, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 19, + "column" : 8, + "source_fragment" : "fabric_md.bridged.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "FabricIngress.filtering.deny", + "id" : 10, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 23, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 100, + "column" : 14, + "source_fragment" : "0x0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x37" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 250, + "column" : 41, + "source_fragment" : "55, ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit", + "id" : 11, + "runtime_data" : [ + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit_with_internal_vlan", + "id" : 12, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + }, + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.set_forwarding_type", + "id" : 13, + "runtime_data" : [ + { + "name" : "fwd_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.fwd_type = fwd_type" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 14, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 15, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 16, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 17, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_bridging", + "id" : 18, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.pop_mpls_and_next", + "id" : 19, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 68, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v4", + "id" : 20, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.nop_routing_v4", + "id" : 21, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v4", + "id" : 22, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 111, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 113, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v6", + "id" : 23, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v6", + "id" : 24, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 150, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 152, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_mpls_label", + "id" : 25, + "runtime_data" : [ + { + "name" : "label", + "bitwidth" : 20 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 18, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = label" + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_vlan", + "id" : 26, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 42, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_next_id_acl", + "id" : 27, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 22, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 26, + "column" : 28, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 27, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.copy_to_cpu", + "id" : 28, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.punt_to_cpu", + "id" : 29, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 40, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 41, + "column" : 30, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 42, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.drop", + "id" : 30, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 46, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 47, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x50" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 252, + "column" : 27, + "source_fragment" : "80, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_output_port", + "id" : 31, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 62, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t) port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 63, + "column" : 37, + "source_fragment" : "= port_num; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 64, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 65, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 66, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.nop_acl", + "id" : 32, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.next.output_hashed", + "id" : 33, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_hashed", + "id" : 34, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + }, + { + "name" : "smac", + "bitwidth" : 48 + }, + { + "name" : "dmac", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 23, + "column" : 8, + "source_fragment" : "hdr.ethernet.src_addr = smac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 28, + "column" : 8, + "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.set_mcast_group_id", + "id" : 35, + "runtime_data" : [ + { + "name" : "group_id", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = group_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 152, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = true" + } + } + ] + }, + { + "name" : "FabricIngress.next.reset_mcast_group_id", + "id" : 36, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 157, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 158, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = false" + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.set_slice_id_tc", + "id" : 37, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + }, + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 23, + "column" : 27, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 24, + "column" : 21, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.no_classification", + "id" : 38, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 57, + "column" : 36, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 58, + "column" : 24, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 31, + "column" : 29, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.trust_dscp", + "id" : 39, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 38, + "column" : 27, + "source_fragment" : "= hdr.ipv4.dscp[4 +2 -1:2]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 39, + "column" : 21, + "source_fragment" : "= hdr.ipv4.dscp[2 -1:0]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 40, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_upf", + "id" : 40, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 81, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_default", + "id" : 41, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 86, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_queue", + "id" : 42, + "runtime_data" : [ + { + "name" : "qid", + "bitwidth" : 5 + } + ], + "primitives" : [] + }, + { + "name" : "FabricIngress.qos.meter_drop", + "id" : 43, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 115, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0xa0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 269, + "column" : 36, + "source_fragment" : "160, ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_default_tc", + "id" : 44, + "runtime_data" : [ + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc" + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_access", + "id" : 45, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_core", + "id" : 46, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_dbuf", + "id" : 47, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_miss", + "id" : 48, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 104, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_miss", + "id" : 49, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x86" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 261, + "column" : 38, + "source_fragment" : "134, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_drop", + "id" : 50, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 136, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x87" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 262, + "column" : 38, + "source_fragment" : "135, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_miss", + "id" : 51, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x84" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 259, + "column" : 38, + "source_fragment" : "132, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_drop", + "id" : 52, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 260, + "column" : 38, + "source_fragment" : "133, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session", + "id" : 53, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 159, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 161, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 162, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 163, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf", + "id" : 54, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 167, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 169, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 170, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 171, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 175, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf_drop", + "id" : 55, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 182, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x88" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 263, + "column" : 43, + "source_fragment" : "136, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session", + "id" : 56, + "runtime_data" : [ + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 190, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 192, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 193, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop_miss", + "id" : 57, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8b" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 266, + "column" : 42, + "source_fragment" : "139, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop_miss", + "id" : 58, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x89" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 264, + "column" : 42, + "source_fragment" : "137, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop", + "id" : 59, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8c" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 267, + "column" : 42, + "source_fragment" : "140, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop", + "id" : 60, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 265, + "column" : 42, + "source_fragment" : "138, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.app_fwd", + "id" : 61, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_fwd_encap", + "id" : 62, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "teid", + "bitwidth" : 32 + }, + { + "name" : "qfi", + "bitwidth" : 6 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.needs_gtpu_encap = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.teid = teid; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_qfi15"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 56, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.qfi = qfi; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_routing_ipv4_dst", + "id" : 63, + "runtime_data" : [ + { + "name" : "tun_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 314, + "column" : 35, + "source_fragment" : "= tun_dst_addr; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_app_id", + "id" : 64, + "runtime_data" : [ + { + "name" : "app_id", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 334, + "column" : 8, + "source_fragment" : "internal_app_id = app_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_allow", + "id" : 65, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 364, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 365, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 366, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 367, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_deny", + "id" : 66, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x96" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 268, + "column" : 41, + "source_fragment" : "150, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 375, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 376, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 377, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_miss", + "id" : 67, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.int_watchlist.mark_to_report", + "id" : 68, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report", + "id" : 69, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report_collector", + "id" : 70, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_ingress.report_drop", + "id" : 71, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 79, + "column" : 17, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "fabric_v1model64", + "id" : 72, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model61", + "id" : 73, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model70", + "id" : 74, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "lookup_md_init21", + "id" : 75, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "= hdr.vlan_tag.vlan_id; ..." + } + } + ] + }, + { + "name" : "lookup_md_init15", + "id" : 76, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_dst6"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_src7"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 16, + "column" : 23, + "source_fragment" : "= hdr.ethernet.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_type8"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 17, + "column" : 24, + "source_fragment" : "= hdr.eth_type.value; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 19, + "column" : 23, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "lookup_md_init38", + "id" : 77, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 39, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init41", + "id" : 78, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 42, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init44", + "id" : 79, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 45, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init33", + "id" : 80, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 34, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 35, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 36, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init53", + "id" : 81, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 54, + "column" : 32, + "source_fragment" : "= hdr.tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init56", + "id" : 82, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 57, + "column" : 32, + "source_fragment" : "= hdr.udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init59", + "id" : 83, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 60, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init48", + "id" : 84, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 49, + "column" : 28, + "source_fragment" : "= hdr.ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 50, + "column" : 28, + "source_fragment" : "= hdr.ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 51, + "column" : 28, + "source_fragment" : "= hdr.ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init24", + "id" : 85, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 25, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 26, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 27, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 29, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 30, + "column" : 25, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 31, + "column" : 25, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "upf409", + "id" : 86, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 20, + "source_fragment" : "is_uplink = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 410, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 411, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_dport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 412, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf418", + "id" : 87, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 419, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 420, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf424", + "id" : 88, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 425, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 426, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf443", + "id" : 89, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 16, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "upf448", + "id" : 90, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 44, + "source_fragment" : "(bit<32>) session_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.session_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf445", + "id" : 91, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 36, + "source_fragment" : "(bit<32>) app_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.app_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf461", + "id" : 92, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "upf25", + "id" : 93, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 26, + "column" : 4, + "source_fragment" : "bool term_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 27, + "column" : 4, + "source_fragment" : "bool sess_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 28, + "column" : 4, + "source_fragment" : "bit<32> app_ipv4_addr = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 29, + "column" : 4, + "source_fragment" : "l4_port_t app_l4_port = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 30, + "column" : 4, + "source_fragment" : "bit<8> app_ip_proto = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 55, + "column" : 30, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 32, + "column" : 4, + "source_fragment" : "ue_session_id_t ue_session_id = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 72, + "column" : 54, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 73, + "column" : 46, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "filtering100", + "id" : 94, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 31, + "source_fragment" : "(bit<32>)fabric_md.bridged.base.fwd_type" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.filtering.fwd_type_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + } + } + ] + }, + { + "name" : "hasher28", + "id" : 95, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 52, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher39", + "id" : 96, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 17, + "source_fragment" : "hdr.ipv4.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 36, + "source_fragment" : "hdr.ipv4.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 55, + "source_fragment" : "hdr.gtpu.teid" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_0" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher50", + "id" : 97, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..." + } + } + ] + }, + { + "name" : "hasher66", + "id" : 98, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.inner_hash = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 17, + "source_fragment" : "hdr.ethernet.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 40, + "source_fragment" : "hdr.ethernet.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 63, + "source_fragment" : "hdr.eth_type.value" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_1" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher17", + "id" : 99, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_2" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "slicing174", + "id" : 100, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 41, + "source_fragment" : "(bit<32>) fabric_md.bridged.base.slice_tc" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.qos.slice_tc_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + } + } + ] + }, + { + "name" : "slicing177", + "id" : 101, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 25, + "column" : 10, + "source_fragment" : "2 ..." + } + } + ] + }, + { + "name" : "int112", + "id" : 102, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_egress_port25"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_queue_id24"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 113, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.queue_id = 0" + } + } + ] + }, + { + "name" : "fabric_v1model110", + "id" : 103, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model106", + "id" : 104, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 8, + "source_fragment" : "fabric_md.egress.bridged = fabric_md" + } + } + ] + }, + { + "name" : "nop", + "id" : 105, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 106, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 107, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 108, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 109, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 110, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 111, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.stats.count", + "id" : 112, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.pkt_io_egress.set_switch_info", + "id" : 113, + "runtime_data" : [ + { + "name" : "cpu_port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 36, + "column" : 27, + "source_fragment" : "= (PortId_t)cpu_port; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_mpls_if_present", + "id" : 114, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 200, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.set_mpls", + "id" : 115, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 206, + "column" : 8, + "source_fragment" : "hdr.mpls.label = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.mpls.tc = 3w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 208, + "column" : 8, + "source_fragment" : "hdr.mpls.bos = 1w1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_ttl8"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 209, + "column" : 8, + "source_fragment" : "hdr.mpls.ttl = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 112, + "column" : 31, + "source_fragment" : "0x8847; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.push_vlan", + "id" : 116, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 217, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x8100" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 111, + "column" : 31, + "source_fragment" : "0x8100; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 221, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.vlan_id = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_vlan", + "id" : 117, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 249, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.drop", + "id" : 118, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 254, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x82" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 257, + "column" : 35, + "source_fragment" : "130, ..." + } + } + ] + }, + { + "name" : "FabricEgress.dscp_rewriter.rewrite", + "id" : 119, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.dscp_rewriter.clear", + "id" : 120, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "tmp_dscp = 0" + } + } + ] + }, + { + "name" : "FabricEgress.upf.load_tunnel_params", + "id" : 121, + "runtime_data" : [ + { + "name" : "tunnel_src_port", + "bitwidth" : 16 + }, + { + "name" : "tunnel_src_addr", + "bitwidth" : 32 + }, + { + "name" : "tunnel_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 486, + "column" : 8, + "source_fragment" : "hdr.ipv4.src_addr = tunnel_src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 487, + "column" : 8, + "source_fragment" : "hdr.ipv4.dst_addr = tunnel_dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 488, + "column" : 8, + "source_fragment" : "hdr.udp.sport = tunnel_src_port" + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_only", + "id" : 122, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0024" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 563, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0010" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 565, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 567, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = hdr.inner_ipv4.total_len" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 81, + "column" : 16, + "source_fragment" : "0x1, ..." + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_with_psc", + "id" : 123, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 577, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 578, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x002c" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 580, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0018" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 583, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0008" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 586, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = 4 + 4 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 588, + "column" : 8, + "source_fragment" : "hdr.gtpu.ex_flag = 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "qfi"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_qfi15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 589, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.qfi = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 82, + "column" : 20, + "source_fragment" : "0x2, ..." + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 124, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 125, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 126, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 127, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.check_quota", + "id" : 128, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.reset_quota", + "id" : 129, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.set_config", + "id" : 130, + "runtime_data" : [ + { + "name" : "hop_latency_mask", + "bitwidth" : 32 + }, + { + "name" : "timestamp_mask", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 180, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap", + "id" : 131, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap_mpls", + "id" : 132, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 226, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 227, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 228, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 230, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap", + "id" : 133, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap_mpls", + "id" : 134, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 251, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 252, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 253, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 256, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.init_int_metadata", + "id" : 135, + "runtime_data" : [ + { + "name" : "report_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + { + "type" : "hexstr", + "value" : "0x01fa" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 208, + "column" : 43, + "source_fragment" : "0x1FA; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 293, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 167, + "column" : 20, + "source_fragment" : "2, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_port"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 299, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_port =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_port"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 300, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_id"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 301, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_id = egress_qid" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "deq_qdepth"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 302, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 303, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 304, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 305, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ip_eth_type =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "flow_hash"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 306, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 309, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.report_type = report_type" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.adjust_ip_udp_len", + "id" : 136, + "runtime_data" : [ + { + "name" : "adjust_ip", + "bitwidth" : 16 + }, + { + "name" : "adjust_udp", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 342, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 343, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp" + } + } + ] + }, + { + "name" : "fabric_v1model136", + "id" : 137, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model133", + "id" : 138, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 8, + "source_fragment" : "fabric_md.egress.cpu_port = 0" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148", + "id" : 139, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14", + "id" : 140, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 144, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 145, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.report_type = fabric_md" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166", + "id" : 141, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x3" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169", + "id" : 142, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173", + "id" : 143, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148_0", + "id" : 144, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14_0", + "id" : 145, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166_0", + "id" : 146, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169_0", + "id" : 147, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173_0", + "id" : 148, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "packetio51", + "id" : 149, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_in1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_packet_in1", "ingress_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 52, + "column" : 12, + "source_fragment" : "hdr.packet_in.ingress_port = preserved_ig_port; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_fake_ethernet2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 53, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 54, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "packetio60", + "id" : 150, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xfff2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "= (bit<16>)standard_md.packet_length - 14; ..." + } + } + ] + }, + { + "name" : "next283", + "id" : 151, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 285, + "column" : 21, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "next325", + "id" : 152, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x83" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 258, + "column" : 32, + "source_fragment" : "131, ..." + } + } + ] + }, + { + "name" : "next323", + "id" : 153, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 12, + "source_fragment" : "hdr.mpls.ttl = hdr.mpls.ttl - 1" + } + } + ] + }, + { + "name" : "next333", + "id" : 154, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1" + } + } + ] + }, + { + "name" : "next336", + "id" : 155, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "next343", + "id" : 156, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1" + } + } + ] + }, + { + "name" : "next346", + "id" : 157, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "upf610", + "id" : 158, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + }, + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 611, + "column" : 34, + "source_fragment" : "= hdr.udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 612, + "column" : 20, + "source_fragment" : "hdr.udp.setInvalid()" + } + } + ] + }, + { + "name" : "upf615", + "id" : 159, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + }, + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 616, + "column" : 34, + "source_fragment" : "= hdr.tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 617, + "column" : 20, + "source_fragment" : "hdr.tcp.setInvalid()" + } + } + ] + }, + { + "name" : "upf620", + "id" : 160, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + }, + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 621, + "column" : 35, + "source_fragment" : "= hdr.icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 622, + "column" : 20, + "source_fragment" : "hdr.icmp.setInvalid()" + } + } + ] + }, + { + "name" : "upf628", + "id" : 161, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricEgress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "int128", + "id" : 162, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + }, + { + "type" : "header", + "value" : "_egress_report_mpls26" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + }, + { + "type" : "header", + "value" : "_egress_eth_type35" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + }, + { + "type" : "header", + "value" : "_egress_bridged36" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + }, + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "vlan_stripped"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_vlan_stripped42"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "queue_report"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_queue_report43"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 135, + "column" : 4, + "source_fragment" : "QueueId_t egress_qid = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 365, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 366, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = standard_md.egress_global_timestamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 166, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[31:16]: range @name(\\\"hop_latency_upper\\\");" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 167, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[15:0]: range @name(\\\"hop_latency_lower\\\");" + } + } + ] + }, + { + "name" : "int383", + "id" : 163, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 384, + "column" : 20, + "source_fragment" : "(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id" + } + }, + { + "op" : "clone_egress_pkt_to_egress", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + } + } + ] + }, + { + "name" : "int373", + "id" : 164, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "hexstr", + "value" : "0x00" + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x7" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]" + } + } + ] + }, + { + "name" : "slicing217", + "id" : 165, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 16, + "source_fragment" : "hdr.ipv4.dscp = tmp_dscp" + } + } + ] + }, + { + "name" : "slicing189", + "id" : 166, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_mpls26" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_eth_type35" + }, + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_slice_tc12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;" + } + } + ] + }, + { + "name" : "fabric_v1model170", + "id" : 167, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x5" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "fabric_v1model174", + "id" : 168, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + } + ], + "pipelines" : [ + { + "name" : "ingress", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 35, + "column" : 8, + "source_fragment" : "FabricIngress" + }, + "init_table" : "tbl_fabric_v1model61", + "tables" : [ + { + "name" : "tbl_fabric_v1model61", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [73], + "actions" : ["fabric_v1model61"], + "base_default_next" : "node_3", + "next_tables" : { + "fabric_v1model61" : "node_3" + }, + "default_entry" : { + "action_id" : 73, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model64", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [72], + "actions" : ["fabric_v1model64"], + "base_default_next" : "node_5", + "next_tables" : { + "fabric_v1model64" : "node_5" + }, + "default_entry" : { + "action_id" : 72, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model70", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 70, + "column" : 51, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [74], + "actions" : ["fabric_v1model70"], + "base_default_next" : "tbl_lookup_md_init15", + "next_tables" : { + "fabric_v1model70" : "tbl_lookup_md_init15" + }, + "default_entry" : { + "action_id" : 74, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init15", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [76], + "actions" : ["lookup_md_init15"], + "base_default_next" : "node_8", + "next_tables" : { + "lookup_md_init15" : "node_8" + }, + "default_entry" : { + "action_id" : 76, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init21", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [75], + "actions" : ["lookup_md_init21"], + "base_default_next" : "tbl_lookup_md_init24", + "next_tables" : { + "lookup_md_init21" : "tbl_lookup_md_init24" + }, + "default_entry" : { + "action_id" : 75, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init24", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [85], + "actions" : ["lookup_md_init24"], + "base_default_next" : "node_11", + "next_tables" : { + "lookup_md_init24" : "node_11" + }, + "default_entry" : { + "action_id" : 85, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init33", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [80], + "actions" : ["lookup_md_init33"], + "base_default_next" : "node_13", + "next_tables" : { + "lookup_md_init33" : "node_13" + }, + "default_entry" : { + "action_id" : 80, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init38", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [77], + "actions" : ["lookup_md_init38"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init38" : "node_27" + }, + "default_entry" : { + "action_id" : 77, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init41", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [78], + "actions" : ["lookup_md_init41"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init41" : "node_27" + }, + "default_entry" : { + "action_id" : 78, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init44", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [79], + "actions" : ["lookup_md_init44"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init44" : "node_27" + }, + "default_entry" : { + "action_id" : 79, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init48", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [84], + "actions" : ["lookup_md_init48"], + "base_default_next" : "node_21", + "next_tables" : { + "lookup_md_init48" : "node_21" + }, + "default_entry" : { + "action_id" : 84, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init53", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [81], + "actions" : ["lookup_md_init53"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init53" : "node_27" + }, + "default_entry" : { + "action_id" : 81, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init56", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [82], + "actions" : ["lookup_md_init56"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init56" : "node_27" + }, + "default_entry" : { + "action_id" : 82, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init59", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [83], + "actions" : ["lookup_md_init59"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init59" : "node_27" + }, + "default_entry" : { + "action_id" : 83, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_pkt_io_do_packet_out", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 25, + "column" : 12, + "source_fragment" : "do_packet_out()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [9], + "actions" : ["FabricIngress.pkt_io.do_packet_out"], + "base_default_next" : "FabricIngress.int_watchlist.watchlist", + "next_tables" : { + "FabricIngress.pkt_io.do_packet_out" : "FabricIngress.int_watchlist.watchlist" + }, + "default_entry" : { + "action_id" : 9, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 34, + "column" : 10, + "source_fragment" : "watchlist" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ipv4_valid", + "target" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [68, 70, 69], + "actions" : ["FabricIngress.int_watchlist.mark_to_report", "FabricIngress.int_watchlist.no_report_collector", "FabricIngress.int_watchlist.no_report"], + "base_default_next" : "FabricIngress.stats.flows", + "next_tables" : { + "FabricIngress.int_watchlist.mark_to_report" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report_collector" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report" : "FabricIngress.stats.flows" + }, + "default_entry" : { + "action_id" : 69, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.stats.flows", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 21, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [8], + "actions" : ["FabricIngress.stats.count"], + "base_default_next" : "FabricIngress.slice_tc_classifier.classifier", + "next_tables" : { + "FabricIngress.stats.count" : "FabricIngress.slice_tc_classifier.classifier" + }, + "default_entry" : { + "action_id" : 8, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 44, + "column" : 10, + "source_fragment" : "classifier" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 512, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [37, 39, 38], + "actions" : ["FabricIngress.slice_tc_classifier.set_slice_id_tc", "FabricIngress.slice_tc_classifier.trust_dscp", "FabricIngress.slice_tc_classifier.no_classification"], + "base_default_next" : "FabricIngress.filtering.ingress_port_vlan", + "next_tables" : { + "FabricIngress.slice_tc_classifier.set_slice_id_tc" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.trust_dscp" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.no_classification" : "FabricIngress.filtering.ingress_port_vlan" + }, + "default_entry" : { + "action_id" : 38, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 42, + "column" : 10, + "source_fragment" : "ingress_port_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "vlan_is_valid", + "target" : ["_ingress_vlan_tag4", "$valid$"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["_ingress_vlan_tag4", "vlan_id"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [10, 11, 12], + "actions" : ["FabricIngress.filtering.deny", "FabricIngress.filtering.permit", "FabricIngress.filtering.permit_with_internal_vlan"], + "base_default_next" : "FabricIngress.filtering.fwd_classifier", + "next_tables" : { + "FabricIngress.filtering.deny" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit_with_internal_vlan" : "FabricIngress.filtering.fwd_classifier" + }, + "default_entry" : { + "action_id" : 10, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 80, + "column" : 10, + "source_fragment" : "fwd_classifier" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["_ingress_eth_type5", "value"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ip_eth_type", + "target" : ["_ingress_bridged4", "_base_ip_eth_type10"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [13], + "actions" : ["FabricIngress.filtering.set_forwarding_type"], + "base_default_next" : "tbl_filtering100", + "next_tables" : { + "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100" + }, + "default_entry" : { + "action_id" : 13, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_filtering100", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [94], + "actions" : ["filtering100"], + "base_default_next" : "node_35", + "next_tables" : { + "filtering100" : "node_35" + }, + "default_entry" : { + "action_id" : 94, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf25", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [93], + "actions" : ["upf25"], + "base_default_next" : "node_37", + "next_tables" : { + "upf25" : "node_37" + }, + "default_entry" : { + "action_id" : 93, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.interfaces", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 107, + "column" : 10, + "source_fragment" : "interfaces" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst_addr", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "gtpu_is_valid", + "target" : ["_ingress_gtpu12", "$valid$"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 64, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [45, 46, 47, 48], + "actions" : ["FabricIngress.upf.iface_access", "FabricIngress.upf.iface_core", "FabricIngress.upf.iface_dbuf", "FabricIngress.upf.iface_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.iface_access" : "tbl_upf409", + "FabricIngress.upf.iface_core" : "tbl_upf418", + "FabricIngress.upf.iface_dbuf" : "tbl_upf424", + "FabricIngress.upf.iface_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 48, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf409", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 30, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [86], + "actions" : ["upf409"], + "base_default_next" : "node_40", + "next_tables" : { + "upf409" : "node_40" + }, + "default_entry" : { + "action_id" : 86, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_sessions", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 213, + "column" : 10, + "source_fragment" : "uplink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tunnel_ipv4_dst", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "teid", + "target" : ["_ingress_gtpu12", "teid"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [56, 50, 49], + "actions" : ["FabricIngress.upf.set_uplink_session", "FabricIngress.upf.set_uplink_session_drop", "FabricIngress.upf.set_uplink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_uplink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 49, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf418", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [87], + "actions" : ["upf418"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf418" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 87, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_sessions", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 198, + "column" : 10, + "source_fragment" : "downlink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_addr", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [53, 54, 55, 52, 51], + "actions" : ["FabricIngress.upf.set_downlink_session", "FabricIngress.upf.set_downlink_session_buf", "FabricIngress.upf.set_downlink_session_buf_drop", "FabricIngress.upf.set_downlink_session_drop", "FabricIngress.upf.set_downlink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_downlink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 51, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf424", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [88], + "actions" : ["upf424"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf424" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 88, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.applications", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 337, + "column" : 10, + "source_fragment" : "applications" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_id", + "target" : ["scalars", "userMetadata._ingress_upf_slice_id30"], + "mask" : null + }, + { + "match_type" : "lpm", + "name" : "app_ipv4_addr", + "target" : ["scalars", "upf_app_ipv4_addr"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "app_l4_port", + "target" : ["scalars", "upf_app_l4_port"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "app_ip_proto", + "target" : ["scalars", "upf_app_ip_proto"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 5, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [64, 5], + "actions" : ["FabricIngress.upf.set_app_id", "nop"], + "base_default_next" : "node_47", + "next_tables" : { + "FabricIngress.upf.set_app_id" : "node_47", + "nop" : "node_47" + }, + "default_entry" : { + "action_id" : 5, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_terminations", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 280, + "column" : 10, + "source_fragment" : "uplink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [61, 59, 57], + "actions" : ["FabricIngress.upf.app_fwd", "FabricIngress.upf.uplink_drop", "FabricIngress.upf.uplink_drop_miss"], + "base_default_next" : "FabricIngress.upf.uplink_recirc_rules", + "next_tables" : { + "FabricIngress.upf.app_fwd" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop_miss" : "FabricIngress.upf.uplink_recirc_rules" + }, + "default_entry" : { + "action_id" : 57, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_recirc_rules", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 387, + "column" : 10, + "source_fragment" : "uplink_recirc_rules" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [65, 66, 67], + "actions" : ["FabricIngress.upf.recirc_allow", "FabricIngress.upf.recirc_deny", "FabricIngress.upf.recirc_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.recirc_allow" : "tbl_upf445", + "FabricIngress.upf.recirc_deny" : "tbl_upf445", + "FabricIngress.upf.recirc_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 67, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_terminations", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 295, + "column" : 10, + "source_fragment" : "downlink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [62, 60, 58], + "actions" : ["FabricIngress.upf.downlink_fwd_encap", "FabricIngress.upf.downlink_drop", "FabricIngress.upf.downlink_drop_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.downlink_fwd_encap" : "tbl_upf445", + "FabricIngress.upf.downlink_drop" : "tbl_upf445", + "FabricIngress.upf.downlink_drop_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 58, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf443", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 58, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [89], + "actions" : ["upf443"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "upf443" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 89, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf445", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [91], + "actions" : ["upf445"], + "base_default_next" : "node_54", + "next_tables" : { + "upf445" : "node_54" + }, + "default_entry" : { + "action_id" : 91, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf448", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [90], + "actions" : ["upf448"], + "base_default_next" : "FabricIngress.upf.ig_tunnel_peers", + "next_tables" : { + "upf448" : "FabricIngress.upf.ig_tunnel_peers" + }, + "default_entry" : { + "action_id" : 90, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.ig_tunnel_peers", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 317, + "column" : 10, + "source_fragment" : "ig_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_ingress_bridged4", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [63, 4], + "actions" : ["FabricIngress.upf.set_routing_ipv4_dst", "nop"], + "base_default_next" : "node_57", + "next_tables" : { + "FabricIngress.upf.set_routing_ipv4_dst" : "node_57", + "nop" : "node_57" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf461", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [92], + "actions" : ["upf461"], + "base_default_next" : "node_59", + "next_tables" : { + "upf461" : "node_59" + }, + "default_entry" : { + "action_id" : 92, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.bridging", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "bridging" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_ingress_bridged4", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [18, 14], + "actions" : ["FabricIngress.forwarding.set_next_id_bridging", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_bridging" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 14, + "action_const" : true, + "action_data" : ["0x59"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.mpls", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "mpls_label", + "target" : ["_ingress_bridged4", "_base_mpls_label2"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [19, 15], + "actions" : ["FabricIngress.forwarding.pop_mpls_and_next", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.pop_mpls_and_next" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 15, + "action_const" : true, + "action_data" : ["0x81"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 116, + "column" : 10, + "source_fragment" : "routing_v4" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [20, 21, 22, 16], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v4", "FabricIngress.forwarding.nop_routing_v4", "FabricIngress.forwarding.drop_routing_v4", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.nop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 16, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 155, + "column" : 10, + "source_fragment" : "routing_v6" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv6_dst", + "target" : ["_ingress_ipv68", "dst_addr"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [23, 24, 17], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v6", "FabricIngress.forwarding.drop_routing_v6", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 17, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_hasher17", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [99], + "actions" : ["hasher17"], + "base_default_next" : "node_69", + "next_tables" : { + "hasher17" : "node_69" + }, + "default_entry" : { + "action_id" : 99, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher28", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [95], + "actions" : ["hasher28"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher28" : "node_76" + }, + "default_entry" : { + "action_id" : 95, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher39", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [96], + "actions" : ["hasher39"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher39" : "node_76" + }, + "default_entry" : { + "action_id" : 96, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher50", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [97], + "actions" : ["hasher50"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher50" : "node_76" + }, + "default_entry" : { + "action_id" : 97, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher66", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 46, + "source_fragment" : "= 0; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [98], + "actions" : ["hasher66"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher66" : "node_76" + }, + "default_entry" : { + "action_id" : 98, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 22, + "column" : 10, + "source_fragment" : "next_mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [25, 0], + "actions" : ["FabricIngress.pre_next.set_mpls_label", "nop"], + "base_default_next" : "FabricIngress.pre_next.next_vlan", + "next_tables" : { + "FabricIngress.pre_next.set_mpls_label" : "FabricIngress.pre_next.next_vlan", + "nop" : "FabricIngress.pre_next.next_vlan" + }, + "default_entry" : { + "action_id" : 0, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 54, + "column" : 10, + "source_fragment" : "next_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [26, 1], + "actions" : ["FabricIngress.pre_next.set_vlan", "nop"], + "base_default_next" : "FabricIngress.acl.acl", + "next_tables" : { + "FabricIngress.pre_next.set_vlan" : "FabricIngress.acl.acl", + "nop" : "FabricIngress.acl.acl" + }, + "default_entry" : { + "action_id" : 1, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.acl.acl", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "acl" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_src", + "target" : ["_ingress_ethernet3", "src_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["scalars", "userMetadata._ingress_lkp_eth_type8"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_type", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_code", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ig_port_type", + "target" : ["scalars", "userMetadata._ingress_ig_port_type33"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [27, 29, 28, 30, 31, 32], + "actions" : ["FabricIngress.acl.set_next_id_acl", "FabricIngress.acl.punt_to_cpu", "FabricIngress.acl.copy_to_cpu", "FabricIngress.acl.drop", "FabricIngress.acl.set_output_port", "FabricIngress.acl.nop_acl"], + "base_default_next" : "node_80", + "next_tables" : { + "FabricIngress.acl.set_next_id_acl" : "node_80", + "FabricIngress.acl.punt_to_cpu" : "node_80", + "FabricIngress.acl.copy_to_cpu" : "node_80", + "FabricIngress.acl.drop" : "node_80", + "FabricIngress.acl.set_output_port" : "node_80", + "FabricIngress.acl.nop_acl" : "node_80" + }, + "default_entry" : { + "action_id" : 32, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.hashed", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 127, + "column" : 10, + "source_fragment" : "hashed" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "indirect_ws", + "action_profile" : "FabricIngress.next.hashed_profile", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [33, 34, 2], + "actions" : ["FabricIngress.next.output_hashed", "FabricIngress.next.routing_hashed", "nop"], + "base_default_next" : "FabricIngress.next.multicast", + "next_tables" : { + "FabricIngress.next.output_hashed" : "FabricIngress.next.multicast", + "FabricIngress.next.routing_hashed" : "FabricIngress.next.multicast", + "nop" : "FabricIngress.next.multicast" + } + }, + { + "name" : "FabricIngress.next.multicast", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 161, + "column" : 10, + "source_fragment" : "multicast" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [35, 36], + "actions" : ["FabricIngress.next.set_mcast_group_id", "FabricIngress.next.reset_mcast_group_id"], + "base_default_next" : "FabricIngress.qos.set_slice_tc", + "next_tables" : { + "FabricIngress.next.set_mcast_group_id" : "FabricIngress.qos.set_slice_tc", + "FabricIngress.next.reset_mcast_group_id" : "FabricIngress.qos.set_slice_tc" + }, + "default_entry" : { + "action_id" : 36, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.set_slice_tc", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 91, + "column" : 10, + "source_fragment" : "set_slice_tc" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "fabric_md.is_upf_hit", + "target" : ["scalars", "userMetadata._ingress_is_upf_hit29"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [40, 41, 7], + "actions" : ["FabricIngress.qos.use_upf", "FabricIngress.qos.use_default", "NoAction"], + "base_default_next" : "FabricIngress.qos.default_tc", + "next_tables" : { + "FabricIngress.qos.use_upf" : "FabricIngress.qos.default_tc", + "FabricIngress.qos.use_default" : "FabricIngress.qos.default_tc", + "NoAction" : "FabricIngress.qos.default_tc" + }, + "default_entry" : { + "action_id" : 7, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 96, + "column" : 12, + "source_fragment" : "true: use_upf" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 40, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 97, + "column" : 12, + "source_fragment" : "false: use_default" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 41, + "action_data" : [] + }, + "priority" : 2 + } + ] + }, + { + "name" : "FabricIngress.qos.default_tc", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 150, + "column" : 10, + "source_fragment" : "default_tc" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "tc_unknown", + "target" : ["scalars", "userMetadata._ingress_tc_unknown28"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 16, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [44, 3], + "actions" : ["FabricIngress.qos.set_default_tc", "nop"], + "base_default_next" : "node_85", + "next_tables" : { + "FabricIngress.qos.set_default_tc" : "node_85", + "nop" : "node_85" + }, + "default_entry" : { + "action_id" : 3, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing174", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [100], + "actions" : ["slicing174"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing174" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 100, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing177", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 177, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [101], + "actions" : ["slicing177"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing177" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 101, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.queues", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 122, + "column" : 10, + "source_fragment" : "queues" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "color", + "target" : ["scalars", "qos_packet_color"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 128, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [42, 43], + "actions" : ["FabricIngress.qos.set_queue", "FabricIngress.qos.meter_drop"], + "base_default_next" : "tbl_int112", + "next_tables" : { + "FabricIngress.qos.set_queue" : "tbl_int112", + "FabricIngress.qos.meter_drop" : "tbl_int112" + }, + "default_entry" : { + "action_id" : 42, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int112", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 46, + "source_fragment" : "= standard_md.egress_spec; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [102], + "actions" : ["int112"], + "base_default_next" : "FabricIngress.int_ingress.drop_report", + "next_tables" : { + "int112" : "FabricIngress.int_ingress.drop_report" + }, + "default_entry" : { + "action_id" : 102, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 86, + "column" : 10, + "source_fragment" : "drop_report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_ingress_bridged4", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "punt_to_cpu", + "target" : ["scalars", "userMetadata._ingress_punt_to_cpu23"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "egress_port_set", + "target" : ["scalars", "userMetadata._ingress_egress_port_set22"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "mcast_group_id", + "target" : ["standard_metadata", "mcast_grp"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 3, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [71, 6], + "actions" : ["FabricIngress.int_ingress.report_drop", "nop"], + "base_default_next" : "tbl_fabric_v1model106", + "next_tables" : { + "FabricIngress.int_ingress.report_drop" : "tbl_fabric_v1model106", + "nop" : "tbl_fabric_v1model106" + }, + "default_entry" : { + "action_id" : 6, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 101, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 102, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 2 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 104, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0xffff" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 3 + } + ] + }, + { + "name" : "tbl_fabric_v1model106", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [104], + "actions" : ["fabric_v1model106"], + "base_default_next" : "node_92", + "next_tables" : { + "fabric_v1model106" : "node_92" + }, + "default_entry" : { + "action_id" : 104, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model110", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [103], + "actions" : ["fabric_v1model110"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model110" : null + }, + "default_entry" : { + "action_id" : 103, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [ + { + "name" : "FabricIngress.next.hashed_profile", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 112, + "column" : 15, + "source_fragment" : "hashed_profile" + }, + "max_size" : 16, + "selector" : { + "algo" : "crc16", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + } + ] + } + } + ], + "conditionals" : [ + { + "name" : "node_3", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 62, + "column" : 12, + "source_fragment" : "standard_md.parser_error == error.PacketRejectedByParser" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "parser_error"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x8" + } + } + }, + "true_next" : "tbl_fabric_v1model64", + "false_next" : "node_5" + }, + { + "name" : "node_5", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 67, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 4" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000004" + } + } + }, + "true_next" : "tbl_fabric_v1model70", + "false_next" : "tbl_lookup_md_init15" + }, + { + "name" : "node_8", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 20, + "column" : 12, + "source_fragment" : "hdr.vlan_tag.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init21", + "false_next" : "tbl_lookup_md_init24" + }, + { + "name" : "node_11", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 32, + "column" : 12, + "source_fragment" : "hdr.inner_ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init33", + "false_next" : "node_19" + }, + { + "name" : "node_13", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 37, + "column" : 16, + "source_fragment" : "hdr.inner_tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init38", + "false_next" : "node_15" + }, + { + "name" : "node_15", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 40, + "column" : 23, + "source_fragment" : "hdr.inner_udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_udp20", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init41", + "false_next" : "node_17" + }, + { + "name" : "node_17", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 43, + "column" : 23, + "source_fragment" : "hdr.inner_icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init44", + "false_next" : "node_27" + }, + { + "name" : "node_19", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 47, + "column" : 19, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init48", + "false_next" : "node_27" + }, + { + "name" : "node_21", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 52, + "column" : 16, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init53", + "false_next" : "node_23" + }, + { + "name" : "node_23", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 55, + "column" : 23, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init56", + "false_next" : "node_25" + }, + { + "name" : "node_25", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 58, + "column" : 23, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init59", + "false_next" : "node_27" + }, + { + "name" : "node_27", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 24, + "column" : 12, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "$valid$"] + } + } + }, + "true_next" : "tbl_pkt_io_do_packet_out", + "false_next" : "FabricIngress.int_watchlist.watchlist" + }, + { + "name" : "node_35", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 84, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "tbl_upf25", + "true_next" : "node_59" + }, + { + "name" : "node_37", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 406, + "column" : 12, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "FabricIngress.upf.interfaces", + "false_next" : "node_59" + }, + { + "name" : "node_40", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 413, + "column" : 24, + "source_fragment" : "fabric_md.bridged.base.encap_presence != EncapPresence.NONE" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "FabricIngress.upf.uplink_sessions", + "false_next" : "FabricIngress.upf.applications" + }, + { + "name" : "node_47", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 433, + "column" : 16, + "source_fragment" : "sess_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + } + } + }, + "true_next" : "node_48", + "false_next" : "tbl_upf443" + }, + { + "name" : "node_48", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 434, + "column" : 20, + "source_fragment" : "is_uplink" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + } + } + }, + "true_next" : "FabricIngress.upf.uplink_terminations", + "false_next" : "FabricIngress.upf.downlink_terminations" + }, + { + "name" : "node_54", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 446, + "column" : 16, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_upf448", + "false_next" : "FabricIngress.upf.ig_tunnel_peers" + }, + { + "name" : "node_57", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 451, + "column" : 16, + "source_fragment" : "term_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + } + } + }, + "true_next" : "tbl_upf461", + "false_next" : "node_59" + }, + { + "name" : "node_59", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 88, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "node_60", + "true_next" : "tbl_hasher17" + }, + { + "name" : "node_60", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 178, + "column" : 12, + "source_fragment" : "hdr.ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ethernet3", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.bridging", + "false_next" : "node_62" + }, + { + "name" : "node_62", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 181, + "column" : 19, + "source_fragment" : "hdr.mpls.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.mpls", + "false_next" : "node_64" + }, + { + "name" : "node_64", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 184, + "column" : 19, + "source_fragment" : "fabric_md.lkp.is_ipv4 && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v4", + "false_next" : "node_66" + }, + { + "name" : "node_66", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 188, + "column" : 19, + "source_fragment" : "hdr.ipv6.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v6", + "false_next" : "tbl_hasher17" + }, + { + "name" : "node_69", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 27, + "column" : 12, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "tbl_hasher28", + "false_next" : "node_71" + }, + { + "name" : "node_71", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 38, + "column" : 12, + "source_fragment" : "hdr.gtpu.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "true_next" : "tbl_hasher39", + "false_next" : "node_73" + }, + { + "name" : "node_73", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "true_next" : "tbl_hasher50", + "false_next" : "tbl_hasher66" + }, + { + "name" : "node_76", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 92, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.pre_next.next_mpls", + "true_next" : "FabricIngress.acl.acl" + }, + { + "name" : "node_80", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 96, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.next.hashed", + "true_next" : "FabricIngress.qos.set_slice_tc" + }, + { + "name" : "node_85", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_slicing174", + "false_next" : "tbl_slicing177" + }, + { + "name" : "node_92", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 109, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model110" + } + ] + }, + { + "name" : "egress", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 115, + "column" : 8, + "source_fragment" : "FabricEgress" + }, + "init_table" : "tbl_fabric_v1model133", + "tables" : [ + { + "name" : "tbl_fabric_v1model133", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 34, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [138], + "actions" : ["fabric_v1model133"], + "base_default_next" : "node_97", + "next_tables" : { + "fabric_v1model133" : "node_97" + }, + "default_entry" : { + "action_id" : 138, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model136", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [137], + "actions" : ["fabric_v1model136"], + "base_default_next" : "node_99", + "next_tables" : { + "fabric_v1model136" : "node_99" + }, + "default_entry" : { + "action_id" : 137, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [140], + "actions" : ["int_tna_parser_emulator14"], + "base_default_next" : "node_101", + "next_tables" : { + "int_tna_parser_emulator14" : "node_101" + }, + "default_entry" : { + "action_id" : 140, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148", + "id" : 63, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [139], + "actions" : ["int_tna_parser_emulator148"], + "base_default_next" : "node_103", + "next_tables" : { + "int_tna_parser_emulator148" : "node_103" + }, + "default_entry" : { + "action_id" : 139, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop", + "id" : 64, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [124], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166" + }, + "default_entry" : { + "action_id" : 124, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166", + "id" : 65, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [141], + "actions" : ["int_tna_parser_emulator166"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator166" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 141, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror", + "id" : 66, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [126], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169" + }, + "default_entry" : { + "action_id" : 126, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169", + "id" : 67, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [142], + "actions" : ["int_tna_parser_emulator169"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator169" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 142, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173", + "id" : 68, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [143], + "actions" : ["int_tna_parser_emulator173"], + "base_default_next" : "node_109", + "next_tables" : { + "int_tna_parser_emulator173" : "node_109" + }, + "default_entry" : { + "action_id" : 143, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14_0", + "id" : 69, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [145], + "actions" : ["int_tna_parser_emulator14_0"], + "base_default_next" : "node_111", + "next_tables" : { + "int_tna_parser_emulator14_0" : "node_111" + }, + "default_entry" : { + "action_id" : 145, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148_0", + "id" : 70, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [144], + "actions" : ["int_tna_parser_emulator148_0"], + "base_default_next" : "node_113", + "next_tables" : { + "int_tna_parser_emulator148_0" : "node_113" + }, + "default_entry" : { + "action_id" : 144, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "id" : 71, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [125], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166_0" + }, + "default_entry" : { + "action_id" : 125, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166_0", + "id" : 72, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [146], + "actions" : ["int_tna_parser_emulator166_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator166_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 146, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror_0", + "id" : 73, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [127], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169_0" + }, + "default_entry" : { + "action_id" : 127, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169_0", + "id" : 74, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [147], + "actions" : ["int_tna_parser_emulator169_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator169_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 147, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173_0", + "id" : 75, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [148], + "actions" : ["int_tna_parser_emulator173_0"], + "base_default_next" : "FabricEgress.pkt_io_egress.switch_info", + "next_tables" : { + "int_tna_parser_emulator173_0" : "FabricEgress.pkt_io_egress.switch_info" + }, + "default_entry" : { + "action_id" : 148, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.pkt_io_egress.switch_info", + "id" : 76, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "switch_info" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [113, 105], + "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"], + "base_default_next" : "node_120", + "next_tables" : { + "FabricEgress.pkt_io_egress.set_switch_info" : "node_120", + "nop" : "node_120" + }, + "default_entry" : { + "action_id" : 105, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "tbl_packetio51", + "id" : 77, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [149], + "actions" : ["packetio51"], + "base_default_next" : "node_122", + "next_tables" : { + "packetio51" : "node_122" + }, + "default_entry" : { + "action_id" : 149, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_packetio60", + "id" : 78, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [150], + "actions" : ["packetio60"], + "base_default_next" : "node_124", + "next_tables" : { + "packetio60" : "node_124" + }, + "default_entry" : { + "action_id" : 150, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.stats.flows", + "id" : 79, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 53, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "stats_flow_id", + "target" : ["_egress_bridged36", "_base_stats_flow_id11"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [112], + "actions" : ["FabricEgress.stats.count"], + "base_default_next" : "node_126", + "next_tables" : { + "FabricEgress.stats.count" : "node_126" + }, + "default_entry" : { + "action_id" : 112, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next283", + "id" : 80, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 283, + "column" : 50, + "source_fragment" : "= INT_REPORT_TYPE_NO_REPORT; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [151], + "actions" : ["next283"], + "base_default_next" : "node_128", + "next_tables" : { + "next283" : "node_128" + }, + "default_entry" : { + "action_id" : 151, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_pop_mpls_if_present", + "id" : 81, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 36, + "source_fragment" : "pop_mpls_if_present()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [114], + "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.pop_mpls_if_present" : "node_132" + }, + "default_entry" : { + "action_id" : 114, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_set_mpls", + "id" : 82, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 291, + "column" : 12, + "source_fragment" : "set_mpls()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [115], + "actions" : ["FabricEgress.egress_next.set_mpls"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.set_mpls" : "node_132" + }, + "default_entry" : { + "action_id" : 115, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan", + "id" : 83, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 264, + "column" : 10, + "source_fragment" : "egress_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_egress_bridged36", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [116, 117, 118], + "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"], + "base_default_next" : "node_134", + "next_tables" : { + "FabricEgress.egress_next.push_vlan" : "node_134", + "FabricEgress.egress_next.pop_vlan" : "node_134", + "FabricEgress.egress_next.drop" : "node_134" + }, + "default_entry" : { + "action_id" : 118, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next323", + "id" : 84, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [153], + "actions" : ["next323"], + "base_default_next" : "node_136", + "next_tables" : { + "next323" : "node_136" + }, + "default_entry" : { + "action_id" : 153, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next325", + "id" : 85, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [152], + "actions" : ["next325"], + "base_default_next" : "node_148", + "next_tables" : { + "next325" : "node_148" + }, + "default_entry" : { + "action_id" : 152, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next333", + "id" : 86, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [154], + "actions" : ["next333"], + "base_default_next" : "node_141", + "next_tables" : { + "next333" : "node_141" + }, + "default_entry" : { + "action_id" : 154, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next336", + "id" : 87, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [155], + "actions" : ["next336"], + "base_default_next" : "node_148", + "next_tables" : { + "next336" : "node_148" + }, + "default_entry" : { + "action_id" : 155, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next343", + "id" : 88, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 39, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [156], + "actions" : ["next343"], + "base_default_next" : "node_146", + "next_tables" : { + "next343" : "node_146" + }, + "default_entry" : { + "action_id" : 156, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next346", + "id" : 89, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [157], + "actions" : ["next346"], + "base_default_next" : "node_148", + "next_tables" : { + "next346" : "node_148" + }, + "default_entry" : { + "action_id" : 157, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf610", + "id" : 90, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [158], + "actions" : ["upf610"], + "base_default_next" : "node_152", + "next_tables" : { + "upf610" : "node_152" + }, + "default_entry" : { + "action_id" : 158, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf615", + "id" : 91, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [159], + "actions" : ["upf615"], + "base_default_next" : "node_154", + "next_tables" : { + "upf615" : "node_154" + }, + "default_entry" : { + "action_id" : 159, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf620", + "id" : 92, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [160], + "actions" : ["upf620"], + "base_default_next" : "FabricEgress.upf.gtpu_encap", + "next_tables" : { + "upf620" : "FabricEgress.upf.gtpu_encap" + }, + "default_entry" : { + "action_id" : 160, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.upf.gtpu_encap", + "id" : 93, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 597, + "column" : 10, + "source_fragment" : "gtpu_encap" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [122, 123], + "actions" : ["FabricEgress.upf.gtpu_only", "FabricEgress.upf.gtpu_with_psc"], + "base_default_next" : "FabricEgress.upf.eg_tunnel_peers", + "next_tables" : { + "FabricEgress.upf.gtpu_only" : "FabricEgress.upf.eg_tunnel_peers", + "FabricEgress.upf.gtpu_with_psc" : "FabricEgress.upf.eg_tunnel_peers" + }, + "default_entry" : { + "action_id" : 122, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.upf.eg_tunnel_peers", + "id" : 94, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 491, + "column" : 10, + "source_fragment" : "eg_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_egress_bridged36", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [121, 107], + "actions" : ["FabricEgress.upf.load_tunnel_params", "nop"], + "base_default_next" : "node_158", + "next_tables" : { + "FabricEgress.upf.load_tunnel_params" : "node_158", + "nop" : "node_158" + }, + "default_entry" : { + "action_id" : 107, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf628", + "id" : 95, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [161], + "actions" : ["upf628"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "upf628" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 161, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int128", + "id" : 96, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [162], + "actions" : ["int128"], + "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds", + "next_tables" : { + "int128" : "FabricEgress.int_egress.queue_latency_thresholds" + }, + "default_entry" : { + "action_id" : 162, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.queue_latency_thresholds", + "id" : 97, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 159, + "column" : 10, + "source_fragment" : "queue_latency_thresholds" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "egress_qid", + "target" : ["scalars", "int_egress_egress_qid"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_upper", + "target" : ["scalars", "key_0"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_lower", + "target" : ["scalars", "key_1"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 128, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [128, 129, 108], + "actions" : ["FabricEgress.int_egress.check_quota", "FabricEgress.int_egress.reset_quota", "nop"], + "base_default_next" : "FabricEgress.int_egress.config", + "next_tables" : { + "FabricEgress.int_egress.check_quota" : "FabricEgress.int_egress.config", + "FabricEgress.int_egress.reset_quota" : "FabricEgress.int_egress.config", + "nop" : "FabricEgress.int_egress.config" + }, + "default_entry" : { + "action_id" : 108, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.config", + "id" : 98, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 183, + "column" : 10, + "source_fragment" : "config" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [130], + "actions" : ["FabricEgress.int_egress.set_config"], + "base_default_next" : "tbl_int373", + "next_tables" : { + "FabricEgress.int_egress.set_config" : "tbl_int373" + }, + "default_entry" : { + "action_id" : 130, + "action_const" : false, + "action_data" : ["0xffffff00", "0xffffc0000000"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_int373", + "id" : 99, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 38, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [164], + "actions" : ["int373"], + "base_default_next" : "node_164", + "next_tables" : { + "int373" : "node_164" + }, + "default_entry" : { + "action_id" : 164, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.report", + "id" : 100, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 260, + "column" : 10, + "source_fragment" : "report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "bmd_type", + "target" : ["int_egress_fabric_md_int_report_md", "bmd_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "mirror_type", + "target" : ["int_egress_fabric_md_int_report_md", "mirror_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["int_egress_fabric_md_int_report_md", "report_type"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 6, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [131, 132, 133, 134, 109], + "actions" : ["FabricEgress.int_egress.do_local_report_encap", "FabricEgress.int_egress.do_local_report_encap_mpls", "FabricEgress.int_egress.do_drop_report_encap", "FabricEgress.int_egress.do_drop_report_encap_mpls", "nop"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "FabricEgress.int_egress.do_local_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_local_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "nop" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 109, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata", + "id" : 101, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 315, + "column" : 10, + "source_fragment" : "int_metadata" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_egress_bridged36", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "queue_report", + "target" : ["scalars", "userMetadata._egress_int_md_queue_report43"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [135, 110], + "actions" : ["FabricEgress.int_egress.init_int_metadata", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "tbl_int383", + "__MISS__" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 110, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 327, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x1"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 329, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x4"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_int383", + "id" : 102, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [163], + "actions" : ["int383"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "int383" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 163, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "id" : 103, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 347, + "column" : 10, + "source_fragment" : "adjust_int_report_hdr_length" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "is_int_wip", + "target" : ["int_egress_fabric_md_bridged", "_int_bmd_wip_type26"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [111, 136], + "actions" : ["nop", "FabricEgress.int_egress.adjust_ip_udp_len"], + "base_default_next" : "tbl_slicing189", + "next_tables" : { + "nop" : "tbl_slicing189", + "FabricEgress.int_egress.adjust_ip_udp_len" : "tbl_slicing189" + }, + "default_entry" : { + "action_id" : 111, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 358, + "column" : 12, + "source_fragment" : "INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xfff2", "0xffde"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 359, + "column" : 12, + "source_fragment" : "INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x02" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xffee", "0xffda"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_slicing189", + "id" : 104, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [166], + "actions" : ["slicing189"], + "base_default_next" : "FabricEgress.dscp_rewriter.rewriter", + "next_tables" : { + "slicing189" : "FabricEgress.dscp_rewriter.rewriter" + }, + "default_entry" : { + "action_id" : 166, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.dscp_rewriter.rewriter", + "id" : 105, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 201, + "column" : 10, + "source_fragment" : "rewriter" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 512, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [119, 120, 106], + "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "node_171", + "__MISS__" : "node_173" + }, + "default_entry" : { + "action_id" : 106, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing217", + "id" : 106, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 30, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [165], + "actions" : ["slicing217"], + "base_default_next" : "node_173", + "next_tables" : { + "slicing217" : "node_173" + }, + "default_entry" : { + "action_id" : 165, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model170", + "id" : 107, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [167], + "actions" : ["fabric_v1model170"], + "base_default_next" : "node_175", + "next_tables" : { + "fabric_v1model170" : "node_175" + }, + "default_entry" : { + "action_id" : 167, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model174", + "id" : 108, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [168], + "actions" : ["fabric_v1model174"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model174" : null + }, + "default_entry" : { + "action_id" : 168, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [], + "conditionals" : [ + { + "name" : "node_97", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 135, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + } + } + }, + "true_next" : "tbl_fabric_v1model136", + "false_next" : "node_99" + }, + { + "name" : "node_99", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 140, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 2" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000002" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14", + "false_next" : "node_109" + }, + { + "name" : "node_101", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148", + "false_next" : "node_103" + }, + { + "name" : "node_103", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror" + }, + { + "name" : "node_109", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 150, + "column" : 11, + "source_fragment" : "(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14_0", + "false_next" : "FabricEgress.pkt_io_egress.switch_info" + }, + { + "name" : "node_111", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148_0", + "false_next" : "node_113" + }, + { + "name" : "node_113", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror_0" + }, + { + "name" : "node_120", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 50, + "column" : 12, + "source_fragment" : "standard_md.egress_port == fabric_md.cpu_port" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + }, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + } + } + }, + "true_next" : "tbl_packetio51", + "false_next" : "node_122" + }, + { + "name" : "node_122", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 58, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "ether_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xbf03" + } + } + } + } + }, + "true_next" : "tbl_packetio60", + "false_next" : "node_124" + }, + { + "name" : "node_124", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "FabricEgress.stats.flows", + "false_next" : "node_126" + }, + { + "name" : "node_126", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 280, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.is_multicast ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_is_multicast4"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + }, + "right" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + } + } + } + }, + "true_next" : "tbl_next283", + "false_next" : "node_128" + }, + { + "name" : "node_128", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 288, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.mpls_label == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x000000" + } + } + }, + "true_next" : "node_129", + "false_next" : "tbl_egress_next_set_mpls" + }, + { + "name" : "node_129", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 16, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_egress_next_pop_mpls_if_present", + "false_next" : "node_132" + }, + { + "name" : "node_132", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 159, + "column" : 39, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + } + } + }, + "false_next" : "FabricEgress.egress_next.egress_vlan", + "true_next" : "node_134" + }, + { + "name" : "node_134", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 322, + "column" : 12, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_next323", + "false_next" : "node_138" + }, + { + "name" : "node_136", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 324, + "column" : 16, + "source_fragment" : "hdr.mpls.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next325", + "false_next" : "node_148" + }, + { + "name" : "node_138", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 331, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_139", + "false_next" : "node_143" + }, + { + "name" : "node_139", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next333", + "true_next" : "node_141" + }, + { + "name" : "node_141", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 335, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next336", + "false_next" : "node_148" + }, + { + "name" : "node_143", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 341, + "column" : 23, + "source_fragment" : "hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_144", + "false_next" : "node_148" + }, + { + "name" : "node_144", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next343", + "true_next" : "node_146" + }, + { + "name" : "node_146", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 345, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next346", + "false_next" : "node_148" + }, + { + "name" : "node_148", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 607, + "column" : 13, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + } + } + }, + "false_next" : "node_149", + "true_next" : "tbl_int128" + }, + { + "name" : "node_149", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 608, + "column" : 16, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "node_150", + "false_next" : "node_158" + }, + { + "name" : "node_150", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 609, + "column" : 20, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_upf610", + "false_next" : "node_152" + }, + { + "name" : "node_152", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 614, + "column" : 20, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_upf615", + "false_next" : "node_154" + }, + { + "name" : "node_154", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 619, + "column" : 20, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_upf620", + "false_next" : "FabricEgress.upf.gtpu_encap" + }, + { + "name" : "node_158", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 627, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_egress_upf_ctr18"] + } + } + }, + "false_next" : "tbl_upf628", + "true_next" : "tbl_int128" + }, + { + "name" : "node_164", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 375, + "column" : 12, + "source_fragment" : "fabric_md.int_report_md.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "$valid$"] + } + } + }, + "true_next" : "FabricEgress.int_egress.report", + "false_next" : "FabricEgress.int_egress.int_metadata" + }, + { + "name" : "node_171", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 216, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_slicing217", + "false_next" : "node_173" + }, + { + "name" : "node_173", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + } + } + }, + "true_next" : "tbl_fabric_v1model170", + "false_next" : "node_175" + }, + { + "name" : "node_175", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model174" + } + ] + } + ], + "checksums" : [ + { + "name" : "cksum", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_3", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_0", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_4", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + }, + { + "name" : "cksum_1", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "target" : ["_egress_report_ipv427", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_5", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_report_ipv427", "$valid$"] + } + } + } + }, + { + "name" : "cksum_2", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_6", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_7", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + } + ], + "force_arith" : [], + "extern_instances" : [], + "field_aliases" : [ + [ + "queueing_metadata.enq_timestamp", + ["standard_metadata", "enq_timestamp"] + ], + [ + "queueing_metadata.enq_qdepth", + ["standard_metadata", "enq_qdepth"] + ], + [ + "queueing_metadata.deq_timedelta", + ["standard_metadata", "deq_timedelta"] + ], + [ + "queueing_metadata.deq_qdepth", + ["standard_metadata", "deq_qdepth"] + ], + [ + "intrinsic_metadata.ingress_global_timestamp", + ["standard_metadata", "ingress_global_timestamp"] + ], + [ + "intrinsic_metadata.egress_global_timestamp", + ["standard_metadata", "egress_global_timestamp"] + ], + [ + "intrinsic_metadata.mcast_grp", + ["standard_metadata", "mcast_grp"] + ], + [ + "intrinsic_metadata.egress_rid", + ["standard_metadata", "egress_rid"] + ], + [ + "intrinsic_metadata.priority", + ["standard_metadata", "priority"] + ] + ], + "program" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "__meta__" : { + "version" : [2, 23], + "compiler" : "https://github.com/p4lang/p4c" + } +} \ No newline at end of file diff --git a/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt b/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt new file mode 100644 index 000000000..d502367c0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt @@ -0,0 +1,2482 @@ +pkg_info { + arch: "v1model" +} +tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 +} +tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 +} +tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 +} +tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 +} +tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 +} +tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 +} +tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 +} +tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 +} +tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 +} +tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 +} +tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 +} +tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 +} +tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 +} +tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 +} +tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 +} +tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 +} +tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 +} +tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 +} +tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 +} +tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 +} +tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 +} +tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 +} +tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 +} +tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 +} +tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 +} +tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 +} +tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 +} +tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 +} +tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 +} +actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } +} +actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } +} +actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } +} +actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } +} +actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } +} +actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } +} +actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } +} +actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } +} +actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } +} +actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } +} +actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } +} +actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } +} +actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } +} +actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } +} +actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } +} +actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } +} +actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } +} +actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } +} +actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } +} +actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } +} +actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } +} +actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } +} +actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } +} +actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } +} +actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } +} +actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } +} +actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } +} +actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } +} +actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } +} +actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } +} +actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } +} +actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } +} +actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } +} +actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } +} +actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } +} +actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } +} +actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } +} +actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } +} +actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } +} +actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } +} +actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } +} +actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } +} +actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } +} +actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } +} +actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } +} +actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } +} +actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } +} +actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 +} +counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 +} +counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 +} +direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 +} +direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 +} +direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 +} +direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 +} +direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 +} +direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 +} +direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 +} +direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 +} +direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 +} +direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 +} +direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 +} +direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 +} +direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 +} +direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 +} +direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 +} +direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 +} +direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 +} +direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 +} +meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 +} +meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } +} +controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } +} +registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 +} +type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } +} diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh new file mode 100644 index 000000000..f537e5a46 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_dashboard.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# ----------------------------------- +# CONFIGURATION +# ----------------------------------- + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +DASHBOARD_FILE="/home/ubuntu/tfs-ctrl/src/tests/p4-sd-fabric-svc-connectivity/descriptors/grafana-latency.json" # Path to your dashboard JSON + +# ----------------------------------- +# READ DASHBOARD JSON +# ----------------------------------- +if [ ! -f "$DASHBOARD_FILE" ]; then + echo "[ERROR] Dashboard file not found: $DASHBOARD_FILE" + exit 1 +fi + +DASHBOARD_JSON=$(cat "$DASHBOARD_FILE") + +# --------------------------------------- +# 1. Get the datasource UID +# --------------------------------------- + +PROM_UID=$(curl -s \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + "${GRAFANA_URL}/api/datasources/name/${DATASOURCE_NAME}" \ + | jq -r '.uid') + +if [ -z "$PROM_UID" ] || [ "$PROM_UID" == "null" ]; then + echo "ERROR: Could not retrieve datasource UID. Check datasource name/auth." + exit 1 +fi + +echo "Found datasource UID: $PROM_UID" + +# --------------------------------------- +# 2. Inject the UID into dashboard JSON +# --------------------------------------- + +DASHBOARD_JSON=$(jq --arg uid "$PROM_UID" ' + walk( + if type == "object" and has("datasource") then + .datasource |= + (if type == "object" then .uid = $uid else $uid end) + else . + end + ) +' "$DASHBOARD_FILE") + +# --------------------------------------- +# 3. Wrap in Grafana API import format +# --------------------------------------- + +read -r -d '' IMPORT_JSON << EOF +{ + "dashboard": ${DASHBOARD_JSON}, + "overwrite": true, + "folderId": 0, + "message": "Imported via API" +} +EOF + +# ----------------------------------- +# 4. Import dashboard using API +# ----------------------------------- + +echo "Importing dashboard into Grafana..." + +curl -X POST "${GRAFANA_URL}/api/dashboards/db" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${IMPORT_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh new file mode 100644 index 000000000..2e82eebe5 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_grafana_datasources.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# --------------------------- +# CONFIGURATION +# --------------------------- + +TFS_IP="192.168.5.137" + +GRAFANA_URL="http://localhost:80/grafana" # Your Grafana URL +GRAFANA_USERNAME="admin" +GRAFANA_PASSWORD="admin" + +DATASOURCE_NAME="Prometheus" +PROMETHEUS_URL="http://${TFS_IP}:30090/" # URL of your Prometheus server + +# --------------------------- +# CREATE DATA SOURCE PAYLOAD +# --------------------------- + +read -r -d '' DATA_SOURCE_JSON << EOF +{ + "name": "${DATASOURCE_NAME}", + "type": "prometheus", + "access": "proxy", + "url": "${PROMETHEUS_URL}", + "basicAuth": false, + "isDefault": true, + "editable": true +} +EOF + +# --------------------------- +# SEND REQUEST (with username/password) +# --------------------------- + +echo "Creating Prometheus datasource in Grafana..." + +curl -X POST "${GRAFANA_URL}/api/datasources" \ + -H "Content-Type: application/json" \ + -u "${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}" \ + -d "${DATA_SOURCE_JSON}" + +echo +echo "Done" diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh new file mode 100755 index 000000000..3e7f22b90 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_01_bootstrap.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# make sure to source the following scripts: +# - my_deploy.sh +# - tfs_runtime_env_vars.sh + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh new file mode 100755 index 000000000..6d33f8a9b --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_02_service_provision_int.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh new file mode 100755 index 000000000..f5d4c814c --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_03_service_provision_l2.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh new file mode 100755 index 000000000..1b2775680 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_04_service_provision_l3.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh new file mode 100755 index 000000000..fc95c0d61 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_05_service_provision_acl.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh new file mode 100755 index 000000000..035353e19 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_06_service_deprovision_int.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh new file mode 100755 index 000000000..fb60d0eba --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_07_service_deprovision_l2.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh new file mode 100755 index 000000000..6c14c8ab9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_08_service_deprovision_l3.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh new file mode 100755 index 000000000..1e3bd5b09 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_09_service_deprovision_acl.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py diff --git a/src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh similarity index 77% rename from src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh rename to src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh index 618a3457f..558bf7e32 100755 --- a/src/tests/p4-fabric-tna/run_test_03a_service_provision_l2.sh +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_10_cleanup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh b/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh new file mode 100755 index 000000000..02e500f88 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/run_test_11_purge.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py diff --git a/src/tests/p4-sd-fabric-svc-connectivity/setup.sh b/src/tests/p4-sd-fabric-svc-connectivity/setup.sh new file mode 100755 index 000000000..5a1daf120 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/setup.sh @@ -0,0 +1,22 @@ +#! /bin/bash +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') + +kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 + +kubectl cp src/tests/p4-sd-fabric-svc-connectivity/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-svc-connectivity/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py similarity index 92% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py index fa8f31397..e90ff1687 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,15 +20,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - ACL_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +ACL_RULES = 1 LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py similarity index 92% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py index fe73810c0..3709d808b 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,15 +20,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - INT_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +INT_RULES = 19 LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py similarity index 92% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py index bd1d740b9..e97b84b36 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,15 +20,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - L2_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +L2_RULES = 12 LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py similarity index 92% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py index 7f669fbe3..0fc2a7363 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,15 +20,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DEV_NB, - P4_DEV_NB, - L3_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +L3_RULES = 14 LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py similarity index 84% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py index d9da5d381..e200253ed 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,23 +13,30 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum +import os +from common.proto.context_pb2 import ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_ACL, - DEV_NB, - P4_DEV_NB, - ACL_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +ACL_RULES = 1 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_ACL = os.path.join(TEST_PATH, 'service-p4-acl.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_ACL), "Invalid path to the ACL service descriptor" LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py similarity index 85% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py index 13ae470c8..a112e85d2 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import logging from common.proto.context_pb2 import ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results @@ -20,16 +21,22 @@ from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_INT, - DEV_NB, - P4_DEV_NB, - INT_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +INT_RULES = 19 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_INT = os.path.join(TEST_PATH, 'service-p4-int.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_INT), "Invalid path to the INT service descriptor" LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py similarity index 82% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py index 5de0d511f..d80f24630 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,23 +13,30 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum +import os +from common.proto.context_pb2 import ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_L2_SIMPLE, - DEV_NB, - P4_DEV_NB, - L2_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +L2_RULES = 12 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_L2 = os.path.join(TEST_PATH, 'service-p4-l2.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_L2), "Invalid path to the L2 service descriptor" LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -60,7 +67,7 @@ def test_service_creation_l2( # Load service descriptor_loader = DescriptorLoader( - descriptors_file=DESC_FILE_SERVICE_P4_L2_SIMPLE, + descriptors_file=DESC_FILE_SERVICE_P4_L2, context_client=context_client, device_client=device_client, service_client=service_client ) results = descriptor_loader.process() diff --git a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py similarity index 84% rename from src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py rename to src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py index 2bd673144..80e1547d9 100644 --- a/src/tests/p4-fabric-tna/tests-service/test_functional_service_provision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,23 +13,30 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceStatusEnum, ServiceTypeEnum +import os +from common.proto.context_pb2 import ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import -from tests.tools.test_tools_p4 import ( - ADMIN_CONTEXT_ID, - DESC_FILE_SERVICE_P4_L3, - DEV_NB, - P4_DEV_NB, - L3_RULES, - identify_number_of_p4_devices, - get_number_of_rules, - verify_active_service_type -) +from tests.tools.test_tools_p4 import * + +DEV_NB = 4 +P4_DEV_NB = 1 + +L3_RULES = 14 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_FILE_SERVICE_P4_L3 = os.path.join(TEST_PATH, 'service-p4-l3.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_L3), "Invalid path to the L3 service descriptor" LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py new file mode 100644 index 000000000..8807764e4 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py @@ -0,0 +1,80 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging, os, time +from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty +from common.tools.descriptor.Loader import DescriptorLoader, \ + check_descriptor_load_results, validate_empty_scenario +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.Fixtures import context_client, device_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_bootstrap( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test assumes that the environment is in a clean state (empty) + before bootstrapping the P4 topology. + It loads the topology descriptor and verifies that no other services + or slices are created. + """ + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py new file mode 100644 index 000000000..12d5afac2 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py @@ -0,0 +1,49 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging, os +from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.Fixtures import context_client, device_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'topology.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Unload topology and validate empty scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py new file mode 100644 index 000000000..1d7f1523c --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py @@ -0,0 +1,83 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum, ServiceTypeEnum +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_clean_services( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + + for service in response.services: + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + +def test_clean_links( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListLinks(ADMIN_CONTEXT_ID) + + for link in response.links: + link_id = link.link_id + + # Delete link + context_client.RemoveLink(LinkId(**link_id)) + +def test_clean_devices( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + for device in response.devices: + device_uuid = device.device_id.device_uuid.uuid + device_json = json_device_id(device_uuid) + + # Delete device + device_client.DeleteDevice(DeviceId(**device_json)) + +def test_clean_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.ListTopologies(ADMIN_CONTEXT_ID) + + for topology in response.topologies: + topology_id = topology.topology_id + response = context_client.RemoveTopology(topology_id) + + response = context_client.RemoveContext(ADMIN_CONTEXT_ID) diff --git a/src/tests/p4-sd-fabric-svc-upf/README.md b/src/tests/p4-sd-fabric-svc-upf/README.md new file mode 100644 index 000000000..2a9eff304 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/README.md @@ -0,0 +1,158 @@ +# Tests for TFS Ecosystem Days #7 - PoC#1 + +This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 switch that acts as a 5G UPF. +The P4 data plane is based on ONF's SD-Fabric implementation, titled [fabric-tna](https://github.com/stratum/fabric-tna) + +## Prerequisites + +You need Python3, which should already be installed while preparing for a TFS build. +Additionally, `pytest` is also mandatory as it is used by our tests below. +Aliasing python with python3 will also help bridging issues between older and newer python versions. + +```shell +alias python='python3' +pip3 install pytest +pip3 install grpclib protobuf +pip3 install grpcio-tools +``` + +The versions used for this test are: + +- `protobuf` 3.20.3 +- `grpclib` 0.4.4 +- `grpcio` 1.47.5 +- `grpcio-tools` 1.47.5 + +After the installation of `grpclib`, protoc-gen-grpclib_python binary is in /home/$USER/.local/bin/ +First we copy it to /usr/local/bin/: + +```shell + sudo cp /home/$USER/.local/bin/protoc-gen-grpclib_python /usr/local/bin/ +``` + +Then, we include this path to the PYTHONPATH: + +```shell +export PYTHONPATH="${PYTHONPATH}:/usr/local/bin/protoc-gen-grpclib_python" +``` + +You need to build and deploy a software-based Stratum switch, before being able to use TFS to control it. +To do so, follow the instructions in the `./topology` folder. + +## Steps to setup and run a TFS program atop Stratum + +To conduct this test, follow the steps below. + +### Deploy TFS + +Go to the TFS parent folder. + +```shell +cd ~/tfs-ctrl/ +``` + +Edit `my_deploy.sh` to include the following TFS components and then source the file. + +```shell +nano my_deploy.sh +`export TFS_COMPONENTS="context device pathcomp service nbi webui"` +``` + +```shell +source my_deploy.sh && source tfs_runtime_env_vars.sh +``` + +Now deploy TFS: + +```shell +./deploy/all.sh +``` + +When deployed, execute the following command to ensure that the above components are all in place and in a running state: + +```shell +./deploy/show.sh +``` + +### Path setup + +Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl". + +Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src" + +## Topology setup + +Open `topology/README.md` and follow the instructions on how to install a Stratum switch in a Linux namespace. + +## P4 artifacts + +In the `./p4src/` directory there are compiled P4 artifacts of the pipeline that will be pushed to the P4 switch, along with the P4-runtime definitions. +The `./setup.sh` script copies from this directory. If you need to change the P4 program, make sure to put the compiled artifacts there. + +## Tests + +A set of tests is implemented, each focusing on different aspects of TFS. +For each of these tests, an auxiliary bash script allows to run it with less typing. + +| Bash Runner | Purpose | +| --------------------------------------------- | --------------------------------------------------------------------------- | +| setup.sh | Copy P4 artifacts into the SBI pod | +| run_test_01_bootstrap.sh | Connect TFS to the P4 switch | +| run_test_02_service_provision_upf.sh | Install UPF forwarding rules via a dedicated P4 UPF service handler | +| run_test_03_service_deprovision_upf.sh | Uninstall UPF forwarding rules via a dedicated P4 PF service handler | +| run_test_04_cleanup.sh | Clean-up context and topology and disconnect TFS from the P4 switch | + +Each of the tests above is described in detail below. + +### Step 0: Copy the necessary P4 artifacts into the TFS SBI service pod + +The setup script copies the necessary artifacts to the SBI service pod. +It should be run just once, after a fresh install of TFS. +If you `deploy/all.sh` again, you need to repeat this step. + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +bash src/tests/p4-sd-fabric-svc-upf/setup.sh +``` + +### Step 1: Bootstrap topology + +The bootstrap script registers the context, topology, links, and devices to TFS. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh +``` + +### Step 2: Provision UPF via the Service API + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh +``` + +### Step 3: Deprovision UPF via the Service API + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh +``` + +### Step 4: Deprovision topology + +Delete all the objects (context, topology, links, devices) from TFS: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh +``` + +### Step 5: Purge context and topology (if needed) + +Alternatively, a purge test is implemented; this test removes services, links, devices, topology, and context in this order. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh +``` diff --git a/src/tests/p4-sd-fabric-svc-upf/__init__.py b/src/tests/p4-sd-fabric-svc-upf/__init__.py new file mode 100644 index 000000000..023830645 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json new file mode 100644 index 000000000..cebb197a4 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/all.json @@ -0,0 +1,134 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "5gc"}}, + "device_type": "oran-cn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "5g-gNb"}}, + "device_type": "emu-packet-radio-router", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1-5g-upf", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.7.56"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1-5g-upf", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "sw1-1", "name": "1", "type": "port-dp-net-access"}, + {"uuid": "sw1-2", "name": "2", "type": "port-dp-net-core"}, + {"uuid": "sw1-3", "name": "3", "type": "port-cp-5gc"}, + {"uuid": "sw1-4", "name": "4", "type": "port-cp-sdn"} + ] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "data-network"}}, + "device_type": "network", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "5g-gNb/eth1==sw1-5g-upf/sw1-1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-1==5g-gNb/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}}, + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-2==data-network/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}}, + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "data-network/eth1==sw1-5g-upf/sw1-2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-3==5gc/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-3"}}, + {"device_id": {"device_uuid": {"uuid": "5gc"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-4==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-4"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json new file mode 100644 index 000000000..08e617ba5 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/context.json @@ -0,0 +1,5 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json new file mode 100644 index 000000000..c537ead3c --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/devices.json @@ -0,0 +1,89 @@ +{ + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, + "name": "tfs-sdn-controller", + "device_type": "teraflowsdn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_UNDEFINED", + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "5gc"}}, + "device_type": "oran-cn", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "mgmt", "name": "mgmt", "type": "mgmt-int"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "5g-gNb"}}, + "device_type": "emu-packet-radio-router", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "device_type": "p4-switch", + "device_drivers": ["DEVICEDRIVER_P4"], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "sw1-5g-upf", + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "192.168.7.56"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "50001"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "id": 1, + "name": "sw1-5g-upf", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "timeout": 60, + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "endpoints": [ + {"uuid": "sw1-1", "name": "1", "type": "port-dp-net-access"}, + {"uuid": "sw1-2", "name": "2", "type": "port-dp-net-core"}, + {"uuid": "sw1-3", "name": "3", "type": "port-cp-5gc"}, + {"uuid": "sw1-4", "name": "4", "type": "port-cp-sdn"} + ] + }}} + ] + } + }, + { + "device_id": {"device_uuid": {"uuid": "data-network"}}, + "device_type": "network", + "device_drivers": ["DEVICEDRIVER_UNDEFINED"], + "device_config": { + "config_rules": [ + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": "CONFIGACTION_SET", "custom": {"resource_key": "_connect/settings", "resource_value": { + "endpoints": [{"uuid": "eth1", "name": "eth1", "type": "copper"}] + }}} + ] + } + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json new file mode 100644 index 000000000..ea28f012b --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/links.json @@ -0,0 +1,40 @@ +{ + "links": [ + { + "link_id": {"link_uuid": {"uuid": "5g-gNb/eth1==sw1-5g-upf/sw1-1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-1==5g-gNb/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-1"}}, + {"device_id": {"device_uuid": {"uuid": "5g-gNb"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-2==data-network/eth1"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}}, + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "data-network/eth1==sw1-5g-upf/sw1-2"}}, "link_type": "LINKTYPE_COPPER", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "data-network"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-3==5gc/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-3"}}, + {"device_id": {"device_uuid": {"uuid": "5gc"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "sw1-5g-upf/sw1-4==tfs-sdn-controller/mgmt"}}, "link_type": "LINKTYPE_MANAGEMENT", "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, "endpoint_uuid": {"uuid": "sw1-4"}}, + {"device_id": {"device_uuid": {"uuid": "tfs-sdn-controller"}}, "endpoint_uuid": {"uuid": "mgmt"}} + ] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh new file mode 100644 index 000000000..97a7895de --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_service.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +CREDENTIALS="admin:admin" +CONTEXT="admin" +TFS_IP="192.168.5.137" +HEADER="Content-Type: application/json" + +##### Raw HTTP requests to provision the UPF TFS service +# curl -X PUT --header "Content-Type: application/json" --data @service-upf.json --user "admin:admin" http://192.168.5.137/tfs-api/context/admin/service/p4-service-upf + +curl -X PUT --header "${HEADER}" --data @service-upf.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/context/${CONTEXT}/service/p4-service-upf diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh new file mode 100644 index 000000000..80fa2a24f --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/send_descriptors_topo.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +CREDENTIALS="admin:admin" +CONTEXT="admin" +TFS_IP="192.168.5.137" +HEADER="Content-Type: application/json" + +###### Disclaimer: Currently TFS does not possess a single NBI endpoint where all context, topologies, devices, and links can be given at once. +# For this reason, you need to issue 4 different requests to 4 different NBI endpoints as follows. + +# curl -X POST --header "Content-Type: application/json" --data @context.json --user "admin:admin" http://192.168.5.137/tfs-api/contexts +# curl -X POST --header "Content-Type: application/json" --data @topologies.json --user "admin:admin" http://192.168.5.137/tfs-api/context/admin/topologies +# curl -X POST --header "Content-Type: application/json" --data @devices.json --user "admin:admin" http://192.168.5.137/tfs-api/devices +# curl -X POST --header "Content-Type: application/json" --data @links.json --user "admin:admin" http://192.168.5.137/tfs-api/links + +dispatch() { + echo "Onboarding topology" + curl -X POST --header "${HEADER}" --data @context.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/contexts + curl -X POST --header "${HEADER}" --data @topologies.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/context/${CONTEXT}/topologies + curl -X POST --header "${HEADER}" --data @devices.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/devices + curl -X POST --header "${HEADER}" --data @links.json --user ${CREDENTIALS} http://${TFS_IP}/tfs-api/links +} + +dispatch + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json new file mode 100644 index 000000000..d031de781 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf-ui.json @@ -0,0 +1,144 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-upf"} + }, + "name": "p4-service-upf", + "service_type": "SERVICETYPE_UPF", + "service_endpoint_ids": [ + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-1"} + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-2"} + } + ], + "service_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/settings", + "resource_value": { + "switch_info": [ + { + "sw1-5g-upf": { + "arch": "v1model", + "dpid": 1, + "port_list": [ + { + "port_id": 1, + "port_type": "host", + "vlan_id": 4094 + }, + { + "port_id": 2, + "port_type": "host", + "vlan_id": 4094 + } + ], + "fwd_list": [ + { + "port_id": 1, + "host_mac": "50:3e:aa:85:89:09", + "host_label": "N3 - 5G gNB" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:52:3e:38", + "host_label": "N3 - 5G UPF" + }, + { + "port_id": 1, + "host_mac": "18:a6:f7:0e:73:e5", + "host_label": "N6 - 5G UPF" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:96:ba:dd", + "host_label": "N6 - Data Network" + } + ], + "routing_list": [ + { + "port_id": 1, + "ipv4_dst": "10.10.2.2", + "ipv4_prefix_len": 32, + "mac_src": "18:a6:f7:0e:73:e5", + "mac_dst": "50:3e:aa:96:ba:dd" + }, + { + "port_id": 2, + "ipv4_dst": "12.1.1.0", + "ipv4_prefix_len": 24, + "mac_src": "50:3e:aa:52:3e:38", + "mac_dst": "50:3e:aa:85:89:09" + } + ], + "upf": { + "uplink_port": 1, + "uplink_ip": "10.10.1.1", + "uplink_mac": "50:3e:aa:52:3e:38", + + "downlink_port": 2, + "downlink_ip": "10.10.2.1", + "downlink_mac": "18:a6:f7:0e:73:e5", + + "slice_id": 0, + "teid": 1, + "app_id": 0, + "app_meter_id": 0, + "ctr_id": 401, + "tc_id": 3, + "tunnel_peer_id": 1 + }, + "gnb": { + "ip": "10.10.1.2", + "mac": "50:3e:aa:85:89:09" + }, + "ue_list": [ + { + "ue_id": "UE 1", + "ue_ip": "12.1.1.51", + "pdu_sessions": [ + { + "pdu_session_id": 0, + "dnn": "Data Network 1", + "pdu_session_type": "0x0800", + "gtpu_tunnel": { + "uplink": { + "src": "10.10.1.2", + "dst": "10.10.1.1" + }, + "downlink": { + "src": "10.10.1.1", + "dst": "10.10.1.2" + } + } + } + ], + "qos_flows": [ + { + "qfi": 0, + "5qi": 9, + "qos_type": "Non-GBR" + } + ] + } + ] + } + } + ] + } + } + } + ] + }, + "service_constraints": [] + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json new file mode 100644 index 000000000..e1437ca2f --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/service-upf.json @@ -0,0 +1,140 @@ +{ + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "p4-service-upf"} + }, + "name": "p4-service-upf", + "service_type": "SERVICETYPE_UPF", + "service_endpoint_ids": [ + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-1"} + }, + { + "device_id": {"device_uuid": {"uuid": "sw1-5g-upf"}}, + "endpoint_uuid": {"uuid": "sw1-2"} + } + ], + "service_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/settings", + "resource_value": { + "switch_info": [ + { + "sw1-5g-upf": { + "arch": "v1model", + "dpid": 1, + "port_list": [ + { + "port_id": 1, + "port_type": "host", + "vlan_id": 4094 + }, + { + "port_id": 2, + "port_type": "host", + "vlan_id": 4094 + } + ], + "fwd_list": [ + { + "port_id": 1, + "host_mac": "50:3e:aa:85:89:09", + "host_label": "N3 - 5G gNB" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:52:3e:38", + "host_label": "N3 - 5G UPF" + }, + { + "port_id": 1, + "host_mac": "18:a6:f7:0e:73:e5", + "host_label": "N6 - 5G UPF" + }, + { + "port_id": 2, + "host_mac": "50:3e:aa:96:ba:dd", + "host_label": "N6 - Data Network" + } + ], + "routing_list": [ + { + "port_id": 1, + "ipv4_dst": "10.10.2.2", + "ipv4_prefix_len": 32, + "mac_src": "18:a6:f7:0e:73:e5", + "mac_dst": "50:3e:aa:96:ba:dd" + }, + { + "port_id": 2, + "ipv4_dst": "12.1.1.0", + "ipv4_prefix_len": 24, + "mac_src": "50:3e:aa:52:3e:38", + "mac_dst": "50:3e:aa:85:89:09" + } + ], + "upf": { + "uplink_port": 1, + "uplink_ip": "10.10.1.1", + "uplink_mac": "50:3e:aa:52:3e:38", + + "downlink_port": 2, + "downlink_ip": "10.10.2.1", + "downlink_mac": "18:a6:f7:0e:73:e5", + + "slice_id": 0, + "teid": 1, + "app_id": 0, + "app_meter_id": 0, + "ctr_id": 401, + "tc_id": 3, + "tunnel_peer_id": 1 + }, + "gnb": { + "ip": "10.10.1.2", + "mac": "50:3e:aa:85:89:09" + }, + "ue_list": [ + { + "ue_id": "UE 1", + "ue_ip": "12.1.1.51", + "pdu_sessions": [ + { + "pdu_session_id": 0, + "dnn": "Data Network 1", + "pdu_session_type": "0x0800", + "gtpu_tunnel": { + "uplink": { + "src": "10.10.1.2", + "dst": "10.10.1.1" + }, + "downlink": { + "src": "10.10.1.1", + "dst": "10.10.1.2" + } + } + } + ], + "qos_flows": [ + { + "qfi": 0, + "5qi": 9, + "qos_type": "Non-GBR" + } + ] + } + ] + } + } + ] + } + } + } + ] + }, + "service_constraints": [] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json b/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json new file mode 100644 index 000000000..a38381fb7 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/descriptors/topologies.json @@ -0,0 +1,6 @@ +{ + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + } + ] +} diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/README.md b/src/tests/p4-sd-fabric-svc-upf/p4src/README.md new file mode 100644 index 000000000..e17d044fb --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/README.md @@ -0,0 +1,24 @@ +# P4 Sources + +We employ the P4 sources from the [fabric-tna](https://github.com/stratum/fabric-tna/tree/main) project. + +To compile a relevant P4 target binary and P4 info file, do: + +```shell +git clone https://github.com/stratum/fabric-tna.git + +cd ./fabric-tna + +make fabric-upf-int-v1model +``` + +At this point, a relevant `build.sh` script is being run and a P4 program is being compiled. + +After a successful compilation, some artifacts (p4info.txt, bmv2.json) will be generated and placed into `build` sub-folder. + +```shell +ls build/fabric-int/bmv2 +_pp.p4 bmv2.json p4info.txt +``` + +These artefacts are now moved into this repository. diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 b/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 new file mode 100644 index 000000000..870509db7 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/_pp.p4 @@ -0,0 +1,2452 @@ +error { + PacketRejectedByParser +} +#include +#define V1MODEL_VERSION 20180101 +#include + +typedef bit<9> PortId_t; +typedef bit<16> MulticastGroupId_t; +typedef bit<5> QueueId_t; +typedef bit<10> MirrorId_t; +typedef bit<16> ReplicationId_t; +enum bit<2> MeterColor_t { + GREEN = 0, + YELLOW = 1, + RED = 2 +} + +typedef bit<1> BOOL; +typedef bit<8> FieldListIndex_t; +const PortId_t BMV2_DROP_PORT = 511; +const PortId_t FAKE_V1MODEL_RECIRC_PORT = 510; +const FieldListIndex_t PRESERVE_INT_MD = 241; +const FieldListIndex_t PRESERVE_INGRESS_PORT = 231; +const FieldListIndex_t NO_PRESERVATION = 0; +typedef bit<3> fwd_type_t; +typedef bit<32> next_id_t; +typedef bit<20> mpls_label_t; +typedef bit<48> mac_addr_t; +typedef bit<12> vlan_id_t; +typedef bit<32> ipv4_addr_t; +typedef bit<16> l4_port_t; +typedef bit<32> flow_hash_t; +typedef bit<4> slice_id_t; +typedef bit<2> tc_t; +typedef bit<(4 + 2)> slice_tc_t; +type bit<9> FabricPortId_t; +const bit<8> DEFAULT_APP_ID = 0; +const slice_id_t DEFAULT_SLICE_ID = 0; +const tc_t DEFAULT_TC = 0; +const QueueId_t QUEUE_ID_BEST_EFFORT = 0; +typedef bit<32> teid_t; +typedef bit<12> upf_ctr_idx_t; +typedef bit<8> tun_peer_id_t; +typedef bit<32> ue_session_id_t; +typedef bit<15> session_meter_idx_t; +typedef bit<15> app_meter_idx_t; +const session_meter_idx_t DEFAULT_SESSION_METER_IDX = 0; +const app_meter_idx_t DEFAULT_APP_METER_IDX = 0; +enum bit<2> EncapPresence { + NONE = 0x0, + GTPU_ONLY = 0x1, + GTPU_WITH_PSC = 0x2, + VXLAN = 0x3 +} + +const bit<16> GTPU_UDP_PORT = 2152; +const bit<3> GTP_V1 = 3w1; +const bit<8> GTPU_GPDU = 0xff; +const bit<1> GTP_PROTOCOL_TYPE_GTP = 1w1; +const bit<8> GTPU_NEXT_EXT_NONE = 0x0; +const bit<8> GTPU_NEXT_EXT_PSC = 0x85; +const bit<4> GTPU_EXT_PSC_TYPE_DL = 4w0; +const bit<4> GTPU_EXT_PSC_TYPE_UL = 4w1; +const bit<8> GTPU_EXT_PSC_LEN = 8w1; +enum bit<2> PortType_t { + UNKNOWN = 0x0, + EDGE = 0x1, + INFRA = 0x2, + INTERNAL = 0x3 +} + +const bit<16> ETHERTYPE_QINQ = 0x88a8; +const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100; +const bit<16> ETHERTYPE_VLAN = 0x8100; +const bit<16> ETHERTYPE_MPLS = 0x8847; +const bit<16> ETHERTYPE_MPLS_MULTICAST = 0x8848; +const bit<16> ETHERTYPE_IPV4 = 0x800; +const bit<16> ETHERTYPE_IPV6 = 0x86dd; +const bit<16> ETHERTYPE_ARP = 0x806; +const bit<16> ETHERTYPE_PPPOED = 0x8863; +const bit<16> ETHERTYPE_PPPOES = 0x8864; +const bit<16> ETHERTYPE_PACKET_OUT = 0xbf01; +const bit<16> ETHERTYPE_CPU_LOOPBACK_INGRESS = 0xbf02; +const bit<16> ETHERTYPE_CPU_LOOPBACK_EGRESS = 0xbf03; +const bit<16> ETHERTYPE_INT_WIP_IPV4 = 0xbf04; +const bit<16> ETHERTYPE_INT_WIP_MPLS = 0xbf05; +const bit<16> PPPOE_PROTOCOL_IP4 = 0x21; +const bit<16> PPPOE_PROTOCOL_IP6 = 0x57; +const bit<16> PPPOE_PROTOCOL_MPLS = 0x281; +const bit<8> PROTO_ICMP = 1; +const bit<8> PROTO_TCP = 6; +const bit<8> PROTO_UDP = 17; +const bit<8> PROTO_ICMPV6 = 58; +const bit<4> IPV4_MIN_IHL = 5; +const fwd_type_t FWD_BRIDGING = 0; +const fwd_type_t FWD_MPLS = 1; +const fwd_type_t FWD_IPV4_UNICAST = 2; +const fwd_type_t FWD_IPV4_MULTICAST = 3; +const fwd_type_t FWD_IPV6_UNICAST = 4; +const fwd_type_t FWD_IPV6_MULTICAST = 5; +const fwd_type_t FWD_UNKNOWN = 7; +const vlan_id_t DEFAULT_VLAN_ID = 12w4094; +const bit<8> DEFAULT_MPLS_TTL = 64; +const bit<8> DEFAULT_IPV4_TTL = 64; +const bit<16> VXLAN_UDP_PORT = 4789; +const bit<7> RECIRC_PORT_NUMBER = 7w68; +action nop() { + NoAction(); +} +enum bit<8> BridgedMdType_t { + INVALID = 0, + INGRESS_TO_EGRESS = 1, + EGRESS_MIRROR = 2, + INGRESS_MIRROR = 3, + INT_INGRESS_DROP = 4, + DEFLECTED = 5 +} + +enum bit<3> FabricMirrorType_t { + INVALID = 0, + INT_REPORT = 1, + PACKET_IN = 2 +} + +const MirrorId_t PACKET_IN_MIRROR_SESSION_ID = 0x1ff; +enum bit<2> CpuLoopbackMode_t { + DISABLED = 0, + DIRECT = 1, + INGRESS = 2 +} + +const bit<4> NPROTO_ETHERNET = 0; +const bit<4> NPROTO_TELEMETRY_DROP_HEADER = 1; +const bit<4> NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER = 2; +const bit<16> REPORT_FIXED_HEADER_BYTES = 12; +const bit<16> DROP_REPORT_HEADER_BYTES = 12; +const bit<16> LOCAL_REPORT_HEADER_BYTES = 16; +const bit<8> INT_MIRROR_SESSION_BASE = 0x80; +const bit<10> V1MODEL_INT_MIRROR_SESSION = 0x1fa; +typedef bit<16> flow_report_filter_index_t; +typedef bit<16> drop_report_filter_index_t; +typedef bit<12> queue_report_filter_index_t; +typedef bit<16> queue_report_quota_t; +typedef bit<3> IntReportType_t; +const IntReportType_t INT_REPORT_TYPE_NO_REPORT = 0; +const IntReportType_t INT_REPORT_TYPE_DROP = 4; +const IntReportType_t INT_REPORT_TYPE_QUEUE = 2; +const IntReportType_t INT_REPORT_TYPE_FLOW = 1; +typedef bit<8> IntWipType_t; +const IntWipType_t INT_IS_NOT_WIP = 0; +const IntWipType_t INT_IS_WIP = 1; +const IntWipType_t INT_IS_WIP_WITH_MPLS = 2; +const bit<16> INT_WIP_ADJUST_IP_BYTES = 14 - 1 ^ 0xffff; +const bit<16> INT_WIP_ADJUST_UDP_BYTES = INT_WIP_ADJUST_IP_BYTES - 20; +const bit<16> INT_WIP_ADJUST_IP_MPLS_BYTES = INT_WIP_ADJUST_IP_BYTES - 4; +const bit<16> INT_WIP_ADJUST_UDP_MPLS_BYTES = INT_WIP_ADJUST_UDP_BYTES - 4; +enum bit<8> IntDropReason_t { + DROP_REASON_UNKNOWN = 0, + DROP_REASON_IP_TTL_ZERO = 26, + DROP_REASON_ROUTING_V4_MISS = 29, + DROP_REASON_ROUTING_V6_MISS = 29, + DROP_REASON_PORT_VLAN_MAPPING_MISS = 55, + DROP_REASON_TRAFFIC_MANAGER = 71, + DROP_REASON_ACL_DENY = 80, + DROP_REASON_BRIDGING_MISS = 89, + DROP_REASON_NEXT_ID_MISS = 128, + DROP_REASON_MPLS_MISS = 129, + DROP_REASON_EGRESS_NEXT_MISS = 130, + DROP_REASON_MPLS_TTL_ZERO = 131, + DROP_REASON_UPF_DL_SESSION_MISS = 132, + DROP_REASON_UPF_DL_SESSION_DROP = 133, + DROP_REASON_UPF_UL_SESSION_MISS = 134, + DROP_REASON_UPF_UL_SESSION_DROP = 135, + DROP_REASON_UPF_DL_SESSION_DROP_BUFF = 136, + DROP_REASON_UPF_DL_TERMINATION_MISS = 137, + DROP_REASON_UPF_DL_TERMINATION_DROP = 138, + DROP_REASON_UPF_UL_TERMINATION_MISS = 139, + DROP_REASON_UPF_UL_TERMINATION_DROP = 140, + DROP_REASON_UPF_UPLINK_RECIRC_DENY = 150, + DROP_REASON_INGRESS_QOS_METER = 160, + DROP_REASON_ROUTING_V4_DROP = 170, + DROP_REASON_ROUTING_V6_DROP = 171 +} + +@controller_header("packet_in") header packet_in_header_t { + FabricPortId_t ingress_port; + bit<7> _pad0; +} + +@controller_header("packet_out") header packet_out_header_t { + @padding + bit<7> pad0; + FabricPortId_t egress_port; + @padding + bit<3> pad1; + QueueId_t queue_id; + @padding + bit<5> pad2; + CpuLoopbackMode_t cpu_loopback_mode; + bit<1> do_forwarding; + @padding + bit<16> pad3; + @padding + bit<48> pad4; + bit<16> ether_type; +} + +header ethernet_t { + mac_addr_t dst_addr; + mac_addr_t src_addr; +} + +header eth_type_t { + bit<16> value; +} + +header vlan_tag_t { + bit<16> eth_type; + bit<3> pri; + bit<1> cfi; + vlan_id_t vlan_id; +} + +header mpls_t { + mpls_label_t label; + bit<3> tc; + bit<1> bos; + bit<8> ttl; +} + +header pppoe_t { + bit<4> version; + bit<4> type_id; + bit<8> code; + bit<16> session_id; + bit<16> length; + bit<16> protocol; +} + +header ipv4_t { + bit<4> version; + bit<4> ihl; + bit<6> dscp; + bit<2> ecn; + bit<16> total_len; + bit<16> identification; + bit<3> flags; + bit<13> frag_offset; + bit<8> ttl; + bit<8> protocol; + bit<16> hdr_checksum; + bit<32> src_addr; + bit<32> dst_addr; +} + +header ipv6_t { + bit<4> version; + bit<8> traffic_class; + bit<20> flow_label; + bit<16> payload_len; + bit<8> next_hdr; + bit<8> hop_limit; + bit<128> src_addr; + bit<128> dst_addr; +} + +header tcp_t { + bit<16> sport; + bit<16> dport; +} + +@pa_container_size("egress" , "hdr.outer_udp.sport" , 16) @pa_container_size("egress" , "hdr.outer_udp.dport" , 16) header udp_t { + bit<16> sport; + bit<16> dport; + bit<16> len; + bit<16> checksum; +} + +header icmp_t { + bit<8> icmp_type; + bit<8> icmp_code; +} + +header vxlan_t { + bit<8> flags; + bit<24> reserved; + bit<24> vni; + bit<8> reserved_2; +} + +header gtpu_t { + bit<3> version; + bit<1> pt; + bit<1> spare; + bit<1> ex_flag; + bit<1> seq_flag; + bit<1> npdu_flag; + bit<8> msgtype; + bit<16> msglen; + teid_t teid; +} + +header gtpu_options_t { + bit<16> seq_num; + bit<8> n_pdu_num; + bit<8> next_ext; +} + +header gtpu_ext_psc_t { + bit<8> len; + bit<4> type; + bit<4> spare0; + bit<1> ppp; + bit<1> rqi; + bit<6> qfi; + bit<8> next_ext; +} + +@flexible struct upf_bridged_metadata_t { + tun_peer_id_t tun_peer_id; + upf_ctr_idx_t upf_ctr_id; + bit<6> qfi; + bool needs_gtpu_encap; + bool skip_upf; + bool skip_egress_upf_ctr; + teid_t teid; + bit<4> _pad; +} + +@pa_no_overlay("egress" , "hdr.report_fixed_header.rsvd") header report_fixed_header_t { + bit<4> ver; + bit<4> nproto; + bit<3> dqf; + bit<15> rsvd; + bit<6> hw_id; + bit<32> seq_no; + bit<32> ig_tstamp; +} + +@pa_container_size("egress" , "hdr.common_report_header.queue_id" , 8) @pa_container_size("egress" , "hdr.common_report_header.ig_port" , 16) @pa_container_size("egress" , "hdr.common_report_header.eg_port" , 16) @pa_no_overlay("egress" , "hdr.common_report_header.queue_id") @pa_no_overlay("egress" , "hdr.common_report_header.eg_port") header common_report_header_t { + bit<32> switch_id; + bit<7> pad1; + bit<9> ig_port; + bit<7> pad2; + bit<9> eg_port; + bit<3> pad3; + bit<5> queue_id; +} + +header drop_report_header_t { + bit<8> drop_reason; + @padding + bit<16> pad; +} + +header local_report_header_t { + bit<5> pad1; + bit<19> queue_occupancy; + bit<32> eg_tstamp; +} + +@pa_no_overlay("egress" , "fabric_md.int_report_md.bmd_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.mirror_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_id") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_occupancy") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.drop_reason") @pa_no_overlay("egress" , "fabric_md.int_report_md.ip_eth_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.report_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.flow_hash") @pa_no_overlay("egress" , "fabric_md.int_report_md.encap_presence") header int_report_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + bit<9> ig_port; + @padding + bit<7> _pad2; + bit<9> eg_port; + @padding + bit<3> _pad3; + bit<5> queue_id; + @padding + bit<5> _pad4; + bit<19> queue_occupancy; + bit<32> ig_tstamp; + bit<32> eg_tstamp; + bit<8> drop_reason; + bit<16> ip_eth_type; + @padding + bit<6> _pad5; + EncapPresence encap_presence; + bit<3> report_type; + @padding + bit<5> _pad6; + flow_hash_t flow_hash; +} + +@flexible struct int_bridged_metadata_t { + bit<3> report_type; + MirrorId_t mirror_session_id; + IntDropReason_t drop_reason; + QueueId_t queue_id; + PortId_t egress_port; + IntWipType_t wip_type; +} + +struct int_metadata_t { + bit<32> hop_latency; + bit<48> timestamp; + bool vlan_stripped; + bool queue_report; +} + +@flexible struct bridged_metadata_base_t { + flow_hash_t inner_hash; + mpls_label_t mpls_label; + PortId_t ig_port; + bool is_multicast; + fwd_type_t fwd_type; + vlan_id_t vlan_id; + EncapPresence encap_presence; + bit<8> mpls_ttl; + bit<48> ig_tstamp; + bit<16> ip_eth_type; + bit<10> stats_flow_id; + slice_tc_t slice_tc; +} + +header bridged_metadata_t { + BridgedMdType_t bmd_type; + bridged_metadata_base_t base; + upf_bridged_metadata_t upf; + int_bridged_metadata_t int_bmd; + bit<1> _pad0; + bit<7> _pad1; + bit<5> _pad2; +} + +struct lookup_metadata_t { + mac_addr_t eth_dst; + mac_addr_t eth_src; + bit<16> eth_type; + vlan_id_t vlan_id; + bool is_ipv4; + bit<32> ipv4_src; + bit<32> ipv4_dst; + bit<8> ip_proto; + l4_port_t l4_sport; + l4_port_t l4_dport; + bit<8> icmp_type; + bit<8> icmp_code; +} + +struct common_mirror_metadata_t { + MirrorId_t mirror_session_id; + BridgedMdType_t bmd_type; +} + +@pa_auto_init_metadata struct fabric_ingress_metadata_t { + bridged_metadata_t bridged; + flow_hash_t ecmp_hash; + lookup_metadata_t lkp; + bit<32> routing_ipv4_dst; + bool skip_forwarding; + bool skip_next; + next_id_t next_id; + bool egress_port_set; + bool punt_to_cpu; + bool ipv4_checksum_err; + bool inner_ipv4_checksum_err; + slice_id_t slice_id; + tc_t tc; + bool tc_unknown; + bool is_upf_hit; + slice_id_t upf_slice_id; + tc_t upf_tc; + MeterColor_t upf_meter_color; + PortType_t ig_port_type; + common_mirror_metadata_t mirror; +} + +header common_egress_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad; + FabricMirrorType_t mirror_type; +} + +header packet_in_mirror_metadata_t { + BridgedMdType_t bmd_type; + @padding + bit<5> _pad0; + FabricMirrorType_t mirror_type; + @padding + bit<7> _pad1; + PortId_t ingress_port; +} + +@pa_auto_init_metadata struct fabric_egress_metadata_t { + bridged_metadata_t bridged; + PortId_t cpu_port; + bool inner_ipv4_checksum_err; + int_report_metadata_t int_report_md; + int_metadata_t int_md; + bit<16> int_ipv4_len; + bool is_int_recirc; + bit<16> pkt_length; +} + +header fake_ethernet_t { + @padding + bit<48> _pad0; + @padding + bit<48> _pad1; + bit<16> ether_type; +} + +struct ingress_headers_t { + packet_out_header_t packet_out; + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t ipv4; + ipv6_t ipv6; + tcp_t tcp; + udp_t udp; + icmp_t icmp; + gtpu_t gtpu; + gtpu_options_t gtpu_options; + gtpu_ext_psc_t gtpu_ext_psc; + vxlan_t vxlan; + ethernet_t inner_ethernet; + eth_type_t inner_eth_type; + ipv4_t inner_ipv4; + tcp_t inner_tcp; + udp_t inner_udp; + icmp_t inner_icmp; +} + +struct egress_headers_t { + packet_in_header_t packet_in; + fake_ethernet_t fake_ethernet; + ethernet_t report_ethernet; + eth_type_t report_eth_type; + mpls_t report_mpls; + ipv4_t report_ipv4; + udp_t report_udp; + report_fixed_header_t report_fixed_header; + common_report_header_t common_report_header; + local_report_header_t local_report_header; + drop_report_header_t drop_report_header; + ethernet_t ethernet; + vlan_tag_t vlan_tag; + eth_type_t eth_type; + mpls_t mpls; + ipv4_t outer_ipv4; + udp_t outer_udp; + gtpu_t outer_gtpu; + gtpu_options_t outer_gtpu_options; + gtpu_ext_psc_t outer_gtpu_ext_psc; + ipv4_t ipv4; + ipv6_t ipv6; + udp_t udp; +} + +struct fabric_v1model_metadata_t { + bool skip_egress; + bool do_upf_uplink_recirc; + bit<1> drop_ctl; + IntReportType_t int_mirror_type; + fabric_ingress_metadata_t ingress; + fabric_egress_metadata_t egress; + @field_list(PRESERVE_INT_MD) + IntReportType_t recirc_preserved_report_type; + @field_list(PRESERVE_INT_MD) + FabricPortId_t recirc_preserved_egress_port; + @field_list(PRESERVE_INT_MD) + IntDropReason_t recirc_preserved_drop_reason; + @field_list(PRESERVE_INGRESS_PORT) + FabricPortId_t recirc_preserved_ingress_port; +} + +struct v1model_header_t { + ingress_headers_t ingress; + egress_headers_t egress; +} + +parser FabricParser(packet_in packet, out v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + state start { + fabric_md.egress.pkt_length = (bit<16>)standard_md.packet_length; + fabric_md.ingress.bridged.setValid(); + fabric_md.ingress.bridged.bmd_type = BridgedMdType_t.INGRESS_TO_EGRESS; + fabric_md.ingress.bridged.base.ig_port = standard_md.ingress_port; + fabric_md.recirc_preserved_ingress_port = (FabricPortId_t)standard_md.ingress_port; + fabric_md.ingress.bridged.base.ig_tstamp = standard_md.ingress_global_timestamp; + fabric_md.ingress.egress_port_set = false; + fabric_md.ingress.punt_to_cpu = false; + fabric_md.ingress.bridged.base.ip_eth_type = 0; + fabric_md.ingress.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UNKNOWN; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_NOT_WIP; + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.NONE; + fabric_md.ingress.upf_meter_color = MeterColor_t.GREEN; + transition check_ethernet; + } + state check_ethernet { + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_CPU_LOOPBACK_INGRESS: parse_fake_ethernet; + ETHERTYPE_CPU_LOOPBACK_EGRESS: parse_fake_ethernet_and_accept; + ETHERTYPE_PACKET_OUT: check_packet_out; + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state check_packet_out { + packet_out_header_t tmp = packet.lookahead(); + transition select(tmp.do_forwarding) { + 0: parse_packet_out_and_accept; + default: strip_packet_out; + } + } + state parse_int_wip_ipv4 { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_IPV4; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP; + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + packet.advance(14 * 8); + transition parse_ipv4; + } + state parse_int_wip_mpls { + hdr.ingress.ethernet.setValid(); + hdr.ingress.eth_type.setValid(); + hdr.ingress.eth_type.value = ETHERTYPE_MPLS; + fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP_WITH_MPLS; + packet.advance(14 * 8); + transition parse_mpls; + } + state parse_packet_out_and_accept { + packet.extract(hdr.ingress.packet_out); + transition accept; + } + state strip_packet_out { + packet.advance(14 * 8); + transition parse_ethernet; + } + state parse_fake_ethernet { + packet.extract(hdr.ingress.fake_ethernet); + fake_ethernet_t tmp = packet.lookahead(); + transition select(tmp.ether_type) { + ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4; + ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls; + default: parse_ethernet; + } + } + state parse_fake_ethernet_and_accept { + packet.extract(hdr.ingress.fake_ethernet); + transition accept; + } + state parse_ethernet { + packet.extract(hdr.ingress.ethernet); + transition select(packet.lookahead>()) { + ETHERTYPE_QINQ: parse_vlan_tag; + ETHERTYPE_VLAN &&& 0xefff: parse_vlan_tag; + default: parse_untagged; + } + } + state parse_vlan_tag { + packet.extract(hdr.ingress.vlan_tag); + fabric_md.ingress.bridged.base.vlan_id = hdr.ingress.vlan_tag.vlan_id; + transition select(packet.lookahead>()) { + default: parse_eth_type; + } + } + state parse_untagged { + fabric_md.ingress.bridged.base.vlan_id = DEFAULT_VLAN_ID; + transition parse_eth_type; + } + state parse_eth_type { + packet.extract(hdr.ingress.eth_type); + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_MPLS: parse_mpls; + ETHERTYPE_IPV4: parse_non_mpls; + ETHERTYPE_IPV6: parse_non_mpls; + default: accept; + } + } + state parse_mpls { + packet.extract(hdr.ingress.mpls); + fabric_md.ingress.bridged.base.mpls_label = hdr.ingress.mpls.label; + fabric_md.ingress.bridged.base.mpls_ttl = hdr.ingress.mpls.ttl; + transition select(packet.lookahead>()) { + 4: parse_ipv4; + 6: parse_ipv6; + default: reject_packet; + } + } + state reject_packet { + verify(false, error.PacketRejectedByParser); + transition accept; + } + state parse_non_mpls { + fabric_md.ingress.bridged.base.mpls_label = 0; + fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1; + transition select(hdr.ingress.eth_type.value) { + ETHERTYPE_IPV4: parse_ipv4; + ETHERTYPE_IPV6: parse_ipv6; + default: accept; + } + } + state parse_ipv4 { + packet.extract(hdr.ingress.ipv4); + fabric_md.ingress.routing_ipv4_dst = hdr.ingress.ipv4.dst_addr; + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + transition select(hdr.ingress.ipv4.protocol) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMP: parse_icmp; + default: accept; + } + } + state parse_ipv6 { + packet.extract(hdr.ingress.ipv6); + fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV6; + transition select(hdr.ingress.ipv6.next_hdr) { + PROTO_TCP: parse_tcp; + PROTO_UDP: parse_udp; + PROTO_ICMPV6: parse_icmp; + default: accept; + } + } + state parse_icmp { + packet.extract(hdr.ingress.icmp); + transition accept; + } + state parse_tcp { + packet.extract(hdr.ingress.tcp); + transition accept; + } + state parse_udp { + packet.extract(hdr.ingress.udp); + gtpu_t gtpu = packet.lookahead(); + transition select(hdr.ingress.udp.dport, gtpu.version, gtpu.msgtype) { + (GTPU_UDP_PORT, GTP_V1, GTPU_GPDU): parse_gtpu; + (VXLAN_UDP_PORT, default, default): parse_vxlan; + default: accept; + } + } + state parse_gtpu { + packet.extract(hdr.ingress.gtpu); + transition select(hdr.ingress.gtpu.ex_flag, hdr.ingress.gtpu.seq_flag, hdr.ingress.gtpu.npdu_flag) { + (0, 0, 0): set_gtpu_only; + default: parse_gtpu_options; + } + } + state set_gtpu_only { + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_ONLY; + transition parse_inner_ipv4; + } + state parse_gtpu_options { + packet.extract(hdr.ingress.gtpu_options); + bit<8> gtpu_ext_len = packet.lookahead>(); + transition select(hdr.ingress.gtpu_options.next_ext, gtpu_ext_len) { + (GTPU_NEXT_EXT_PSC, GTPU_EXT_PSC_LEN): parse_gtpu_ext_psc; + default: accept; + } + } + state parse_gtpu_ext_psc { + packet.extract(hdr.ingress.gtpu_ext_psc); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_WITH_PSC; + transition select(hdr.ingress.gtpu_ext_psc.next_ext) { + GTPU_NEXT_EXT_NONE: parse_inner_ipv4; + default: accept; + } + } + state parse_vxlan { + packet.extract(hdr.ingress.vxlan); + fabric_md.ingress.bridged.base.encap_presence = EncapPresence.VXLAN; + transition parse_inner_ethernet; + } + state parse_inner_ethernet { + packet.extract(hdr.ingress.inner_ethernet); + packet.extract(hdr.ingress.inner_eth_type); + transition select(hdr.ingress.inner_eth_type.value) { + ETHERTYPE_IPV4: parse_inner_ipv4; + default: accept; + } + } + state parse_inner_ipv4 { + packet.extract(hdr.ingress.inner_ipv4); + transition select(hdr.ingress.inner_ipv4.protocol) { + PROTO_TCP: parse_inner_tcp; + PROTO_UDP: parse_inner_udp; + PROTO_ICMP: parse_inner_icmp; + default: accept; + } + } + state parse_inner_tcp { + packet.extract(hdr.ingress.inner_tcp); + transition accept; + } + state parse_inner_udp { + packet.extract(hdr.ingress.inner_udp); + transition accept; + } + state parse_inner_icmp { + packet.extract(hdr.ingress.inner_icmp); + transition accept; + } +} + +control FabricDeparser(packet_out packet, in v1model_header_t hdr) { + apply { + packet.emit(hdr.ingress.fake_ethernet); + packet.emit(hdr.ingress.packet_in); + packet.emit(hdr.egress.report_ethernet); + packet.emit(hdr.egress.report_eth_type); + packet.emit(hdr.egress.report_mpls); + packet.emit(hdr.egress.report_ipv4); + packet.emit(hdr.egress.report_udp); + packet.emit(hdr.egress.report_fixed_header); + packet.emit(hdr.egress.common_report_header); + packet.emit(hdr.egress.local_report_header); + packet.emit(hdr.egress.drop_report_header); + packet.emit(hdr.ingress.ethernet); + packet.emit(hdr.ingress.vlan_tag); + packet.emit(hdr.ingress.eth_type); + packet.emit(hdr.ingress.mpls); + packet.emit(hdr.ingress.ipv4); + packet.emit(hdr.ingress.ipv6); + packet.emit(hdr.ingress.tcp); + packet.emit(hdr.ingress.udp); + packet.emit(hdr.ingress.icmp); + packet.emit(hdr.ingress.gtpu); + packet.emit(hdr.ingress.gtpu_options); + packet.emit(hdr.ingress.gtpu_ext_psc); + packet.emit(hdr.ingress.vxlan); + packet.emit(hdr.ingress.inner_ethernet); + packet.emit(hdr.ingress.inner_eth_type); + packet.emit(hdr.ingress.inner_ipv4); + packet.emit(hdr.ingress.inner_tcp); + packet.emit(hdr.ingress.inner_udp); + packet.emit(hdr.ingress.inner_icmp); + } +} + +control Acl(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) acl_counter; + action set_next_id_acl(next_id_t next_id) { + fabric_md.next_id = next_id; + acl_counter.count(); + fabric_md.skip_next = false; + drop_ctl = 0; + } + action copy_to_cpu() { + clone_preserving_field_list(CloneType.I2E, (bit<32>)PACKET_IN_MIRROR_SESSION_ID, PRESERVE_INGRESS_PORT); + acl_counter.count(); + } + action punt_to_cpu() { + copy_to_cpu(); + fabric_md.skip_next = true; + fabric_md.punt_to_cpu = true; + drop_ctl = 1; + } + action drop() { + drop_ctl = 1; + fabric_md.skip_next = true; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_ACL_DENY; + acl_counter.count(); + } + action set_output_port(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + fabric_md.skip_next = true; + drop_ctl = 0; + acl_counter.count(); + } + action nop_acl() { + acl_counter.count(); + } + table acl { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_src : ternary @name("eth_src") ; + fabric_md.lkp.vlan_id : ternary @name("vlan_id") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.icmp_type : ternary @name("icmp_type") ; + fabric_md.lkp.icmp_code : ternary @name("icmp_code") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + fabric_md.ig_port_type : ternary @name("ig_port_type") ; + } + actions = { + set_next_id_acl; + punt_to_cpu; + copy_to_cpu; + drop; + set_output_port; + nop_acl; + } + const default_action = nop_acl(); + size = 1024; + counters = acl_counter; + } + apply { + acl.apply(); + } +} + +control Next(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action output(FabricPortId_t port_num) { + standard_md.egress_spec = (PortId_t)port_num; + recirc_preserved_egress_port = port_num; + fabric_md.egress_port_set = true; + } + @hidden action rewrite_smac(mac_addr_t smac) { + hdr.ethernet.src_addr = smac; + } + @hidden action rewrite_dmac(mac_addr_t dmac) { + hdr.ethernet.dst_addr = dmac; + } + @hidden action routing(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + rewrite_smac(smac); + rewrite_dmac(dmac); + output(port_num); + } + @max_group_size(32w16) action_selector(HashAlgorithm.crc16, 32w16, 32w16) hashed_profile; + direct_counter(CounterType.packets_and_bytes) hashed_counter; + action output_hashed(FabricPortId_t port_num) { + output(port_num); + hashed_counter.count(); + } + action routing_hashed(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + routing(port_num, smac, dmac); + hashed_counter.count(); + } + table hashed { + key = { + fabric_md.next_id : exact @name("next_id") ; + fabric_md.ecmp_hash: selector; + } + actions = { + output_hashed; + routing_hashed; + @defaultonly nop; + } + implementation = hashed_profile; + counters = hashed_counter; + const default_action = nop(); + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) multicast_counter; + action set_mcast_group_id(MulticastGroupId_t group_id) { + standard_md.mcast_grp = group_id; + fabric_md.bridged.base.is_multicast = true; + multicast_counter.count(); + } + action reset_mcast_group_id() { + standard_md.mcast_grp = 0; + fabric_md.bridged.base.is_multicast = false; + } + table multicast { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mcast_group_id; + @defaultonly reset_mcast_group_id; + } + counters = multicast_counter; + const default_action = reset_mcast_group_id(); + size = 1024; + } + apply { + hashed.apply(); + multicast.apply(); + } +} + +control EgressNextControl(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntDropReason_t recirc_preserved_drop_reason, inout bit<1> drop_ctl) { + @hidden action pop_mpls_if_present() { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + } + @hidden action set_mpls() { + hdr.mpls.setValid(); + hdr.mpls.label = fabric_md.bridged.base.mpls_label; + hdr.mpls.tc = 3w0; + hdr.mpls.bos = 1w1; + hdr.mpls.ttl = fabric_md.bridged.base.mpls_ttl; + hdr.eth_type.value = ETHERTYPE_MPLS; + } + @hidden action push_outer_vlan() { + hdr.vlan_tag.setValid(); + hdr.vlan_tag.eth_type = ETHERTYPE_VLAN; + hdr.vlan_tag.vlan_id = fabric_md.bridged.base.vlan_id; + } + direct_counter(CounterType.packets_and_bytes) egress_vlan_counter; + action push_vlan() { + push_outer_vlan(); + egress_vlan_counter.count(); + } + action pop_vlan() { + hdr.vlan_tag.setInvalid(); + egress_vlan_counter.count(); + } + action drop() { + drop_ctl = 1; + egress_vlan_counter.count(); + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_EGRESS_NEXT_MISS; + } + table egress_vlan { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + standard_md.egress_port : exact @name("eg_port") ; + } + actions = { + push_vlan; + pop_vlan; + @defaultonly drop; + } + const default_action = drop(); + counters = egress_vlan_counter; + size = 1024; + } + apply { + if (fabric_md.bridged.base.is_multicast && fabric_md.bridged.base.ig_port == standard_md.egress_port) { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + drop_ctl = 1; + } + if (fabric_md.bridged.base.mpls_label == 0) { + if (hdr.mpls.isValid()) { + pop_mpls_if_present(); + } + } else { + set_mpls(); + } + if (!fabric_md.is_int_recirc) { + egress_vlan.apply(); + } + bool regular_packet = true; + regular_packet = !(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP || fabric_md.bridged.bmd_type == BridgedMdType_t.EGRESS_MIRROR); + if (hdr.mpls.isValid()) { + hdr.mpls.ttl = hdr.mpls.ttl - 1; + if (hdr.mpls.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_MPLS_TTL_ZERO; + } + } else { + if (hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv4.ttl = hdr.ipv4.ttl - 1; + } + if (hdr.ipv4.ttl == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) { + if (regular_packet) { + hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1; + } + if (hdr.ipv6.hop_limit == 0) { + drop_ctl = 1; + recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO; + } + } + } + } +} + +const bit<10> UNSET_FLOW_ID = 0; +control StatsIngress(in lookup_metadata_t lkp, in PortId_t ig_port, out bit<10> stats_flow_id) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count(bit<10> flow_id) { + stats_flow_id = flow_id; + flow_counter.count(); + } + table flows { + key = { + lkp.ipv4_src: ternary @name("ipv4_src") ; + lkp.ipv4_dst: ternary @name("ipv4_dst") ; + lkp.ip_proto: ternary @name("ip_proto") ; + lkp.l4_sport: ternary @name("l4_sport") ; + lkp.l4_dport: ternary @name("l4_dport") ; + ig_port : exact @name("ig_port") ; + } + actions = { + count; + } + const default_action = count(UNSET_FLOW_ID); + const size = 1 << 10; + counters = flow_counter; + } + apply { + flows.apply(); + } +} + +control StatsEgress(in bit<10> stats_flow_id, in PortId_t eg_port, in BridgedMdType_t bmd_type) { + direct_counter(CounterType.packets_and_bytes) flow_counter; + action count() { + flow_counter.count(); + } + table flows { + key = { + stats_flow_id: exact @name("stats_flow_id") ; + eg_port : exact @name("eg_port") ; + } + actions = { + count; + } + const default_action = count; + const size = 1 << 10; + counters = flow_counter; + } + apply { + if (bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS) { + flows.apply(); + } + } +} + +control Hasher(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + flow_hash_t max = 0xffffffff; + flow_hash_t base = 0; + apply { + hash(fabric_md.bridged.base.inner_hash, HashAlgorithm.crc32, base, { fabric_md.lkp.ipv4_src, fabric_md.lkp.ipv4_dst, fabric_md.lkp.ip_proto, fabric_md.lkp.l4_sport, fabric_md.lkp.l4_dport }, max); + if (fabric_md.bridged.upf.needs_gtpu_encap) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { fabric_md.bridged.upf.tun_peer_id, fabric_md.bridged.upf.teid }, max); + } else if (hdr.gtpu.isValid()) { + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ipv4.src_addr, hdr.ipv4.dst_addr, hdr.gtpu.teid }, max); + } else if (fabric_md.lkp.is_ipv4) { + fabric_md.ecmp_hash = fabric_md.bridged.base.inner_hash; + } else { + fabric_md.bridged.base.inner_hash = 0; + hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ethernet.dst_addr, hdr.ethernet.src_addr, hdr.eth_type.value }, max); + } + } +} + +control IngressSliceTcClassifier(inout ingress_headers_t hdr, inout standard_metadata_t standard_md, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets) classifier_stats; + action set_slice_id_tc(slice_id_t slice_id, tc_t tc) { + fabric_md.slice_id = slice_id; + fabric_md.tc = tc; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + action no_classification() { + set_slice_id_tc(DEFAULT_SLICE_ID, DEFAULT_TC); + fabric_md.tc_unknown = true; + } + action trust_dscp() { + fabric_md.slice_id = hdr.ipv4.dscp[4 + 2 - 1:2]; + fabric_md.tc = hdr.ipv4.dscp[2 - 1:0]; + fabric_md.tc_unknown = false; + classifier_stats.count(); + } + table classifier { + key = { + fabric_md.bridged.base.ig_port: ternary @name("ig_port") ; + fabric_md.lkp.ipv4_src : ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst : ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto : ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport : ternary @name("l4_sport") ; + fabric_md.lkp.l4_dport : ternary @name("l4_dport") ; + } + actions = { + set_slice_id_tc; + trust_dscp; + @defaultonly no_classification; + } + const default_action = no_classification(); + counters = classifier_stats; + size = 512; + } + apply { + classifier.apply(); + } +} + +control IngressQos(inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + bit<2> packet_color = 2w0; + @hidden action use_upf() { + fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id ++ fabric_md.upf_tc; + } + @hidden action use_default() { + fabric_md.bridged.base.slice_tc = fabric_md.slice_id ++ fabric_md.tc; + } + @hidden table set_slice_tc { + key = { + fabric_md.is_upf_hit: exact; + } + actions = { + use_upf; + use_default; + } + const size = 2; + const entries = { + true : use_upf; + false : use_default; + } + } + meter(1 << 4 + 2, MeterType.bytes) slice_tc_meter; + direct_counter(CounterType.packets) queues_stats; + action set_queue(QueueId_t qid) { + queues_stats.count(); + } + action meter_drop() { + drop_ctl = 1; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_INGRESS_QOS_METER; + queues_stats.count(); + } + table queues { + key = { + fabric_md.bridged.base.slice_tc: exact @name("slice_tc") ; + packet_color : ternary @name("color") ; + } + actions = { + set_queue; + meter_drop; + } + const default_action = set_queue(QUEUE_ID_BEST_EFFORT); + counters = queues_stats; + size = 1 << 4 + 2 + 1; + } + action set_default_tc(tc_t tc) { + fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 + 2 - 1:2] ++ tc; + } + table default_tc { + key = { + fabric_md.bridged.base.slice_tc: ternary @name("slice_tc") ; + fabric_md.tc_unknown : exact @name("tc_unknown") ; + } + actions = { + set_default_tc; + @defaultonly nop; + } + const default_action = nop; + size = 1 << 4; + } + apply { + set_slice_tc.apply(); + default_tc.apply(); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + slice_tc_meter.execute_meter((bit<32>)fabric_md.bridged.base.slice_tc, packet_color); + } else { + packet_color = MeterColor_t.RED; + } + queues.apply(); + } +} + +control EgressDscpRewriter(inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout ingress_headers_t hdr) { + bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; + action rewrite() { + } + action clear() { + tmp_dscp = 0; + } + table rewriter { + key = { + standard_md.egress_port: exact @name("eg_port") ; + } + actions = { + rewrite; + clear; + @defaultonly nop; + } + const default_action = nop; + size = 512; + } + apply { + if (rewriter.apply().hit) { + if (hdr.ipv4.isValid()) { + hdr.ipv4.dscp = tmp_dscp; + } + } + } +} + +control FabricVerifyChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t meta) { + apply { + verify_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + verify_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control FabricComputeChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md) { + apply { + update_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16); + update_checksum(hdr.egress.report_ipv4.isValid(), { hdr.egress.report_ipv4.version, hdr.egress.report_ipv4.ihl, hdr.egress.report_ipv4.dscp, hdr.egress.report_ipv4.ecn, hdr.egress.report_ipv4.total_len, hdr.egress.report_ipv4.identification, hdr.egress.report_ipv4.flags, hdr.egress.report_ipv4.frag_offset, hdr.egress.report_ipv4.ttl, hdr.egress.report_ipv4.protocol, hdr.egress.report_ipv4.src_addr, hdr.egress.report_ipv4.dst_addr }, hdr.egress.report_ipv4.hdr_checksum, HashAlgorithm.csum16); + } +} + +control PacketIoIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout bool skip_egress, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) { + @hidden action do_packet_out() { + standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port; + recirc_preserved_egress_port = hdr.packet_out.egress_port; + fabric_md.egress_port_set = true; + hdr.packet_out.setInvalid(); + skip_egress = true; + fabric_md.bridged.setInvalid(); + exit; + } + apply { + if (hdr.packet_out.isValid()) { + do_packet_out(); + } + } +} + +control PacketIoEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, in FabricPortId_t preserved_ig_port) { + action set_switch_info(FabricPortId_t cpu_port) { + fabric_md.cpu_port = (PortId_t)cpu_port; + } + table switch_info { + actions = { + set_switch_info; + @defaultonly nop; + } + default_action = nop; + const size = 1; + } + apply { + switch_info.apply(); + if (standard_md.egress_port == fabric_md.cpu_port) { + hdr.packet_in.setValid(); + hdr.packet_in.ingress_port = preserved_ig_port; + hdr.fake_ethernet.setInvalid(); + exit; + } + if (hdr.fake_ethernet.isValid() && hdr.fake_ethernet.ether_type == ETHERTYPE_CPU_LOOPBACK_EGRESS) { + fabric_md.pkt_length = (bit<16>)standard_md.packet_length - 14; + } + } +} + +control PreNext(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) { + direct_counter(CounterType.packets_and_bytes) next_mpls_counter; + action set_mpls_label(mpls_label_t label) { + fabric_md.bridged.base.mpls_label = label; + next_mpls_counter.count(); + } + table next_mpls { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_mpls_label; + @defaultonly nop; + } + const default_action = nop(); + counters = next_mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) next_vlan_counter; + action set_vlan(vlan_id_t vlan_id) { + fabric_md.bridged.base.vlan_id = vlan_id; + next_vlan_counter.count(); + } + table next_vlan { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + set_vlan; + @defaultonly nop; + } + const default_action = nop(); + counters = next_vlan_counter; + size = 1024; + } + apply { + next_mpls.apply(); + next_vlan.apply(); + } +} + +control Filtering(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter; + action deny() { + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + fabric_md.ig_port_type = PortType_t.UNKNOWN; + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_PORT_VLAN_MAPPING_MISS; + ingress_port_vlan_counter.count(); + } + action permit(PortType_t port_type) { + fabric_md.ig_port_type = port_type; + ingress_port_vlan_counter.count(); + } + action permit_with_internal_vlan(vlan_id_t vlan_id, PortType_t port_type) { + fabric_md.bridged.base.vlan_id = vlan_id; + permit(port_type); + } + table ingress_port_vlan { + key = { + fabric_md.bridged.base.ig_port: exact @name("ig_port") ; + hdr.vlan_tag.isValid() : exact @name("vlan_is_valid") ; + hdr.vlan_tag.vlan_id : ternary @name("vlan_id") ; + } + actions = { + deny(); + permit(); + permit_with_internal_vlan(); + } + const default_action = deny(); + counters = ingress_port_vlan_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter; + action set_forwarding_type(fwd_type_t fwd_type) { + fabric_md.bridged.base.fwd_type = fwd_type; + fwd_classifier_counter.count(); + } + counter(8, CounterType.packets_and_bytes) fwd_type_counter; + table fwd_classifier { + key = { + fabric_md.bridged.base.ig_port : exact @name("ig_port") ; + fabric_md.lkp.eth_dst : ternary @name("eth_dst") ; + fabric_md.lkp.eth_type : ternary @name("eth_type") ; + fabric_md.bridged.base.ip_eth_type: exact @name("ip_eth_type") ; + } + actions = { + set_forwarding_type; + } + const default_action = set_forwarding_type(FWD_BRIDGING); + counters = fwd_classifier_counter; + size = 1024; + } + apply { + ingress_port_vlan.apply(); + fwd_classifier.apply(); + fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type); + } +} + +control Forwarding(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + action set_int_drop_reason(bit<8> drop_reason) { + fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason; + } + @hidden action set_next_id(next_id_t next_id) { + fabric_md.next_id = next_id; + } + direct_counter(CounterType.packets_and_bytes) bridging_counter; + action set_next_id_bridging(next_id_t next_id) { + set_next_id(next_id); + bridging_counter.count(); + } + table bridging { + key = { + fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ; + hdr.ethernet.dst_addr : ternary @name("eth_dst") ; + } + actions = { + set_next_id_bridging; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_BRIDGING_MISS); + counters = bridging_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) mpls_counter; + action pop_mpls_and_next(next_id_t next_id) { + hdr.mpls.setInvalid(); + hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type; + fabric_md.bridged.base.mpls_label = 0; + set_next_id(next_id); + mpls_counter.count(); + } + table mpls { + key = { + fabric_md.bridged.base.mpls_label: exact @name("mpls_label") ; + } + actions = { + pop_mpls_and_next; + @defaultonly set_int_drop_reason; + } + const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_MPLS_MISS); + counters = mpls_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v4_counter; + action set_next_id_routing_v4(next_id_t next_id) { + set_next_id(next_id); + routing_v4_counter.count(); + } + action nop_routing_v4() { + routing_v4_counter.count(); + } + action drop_routing_v4() { + fabric_md.skip_next = true; + routing_v4_counter.count(); + drop_ctl = 1; + } + table routing_v4 { + key = { + fabric_md.routing_ipv4_dst: lpm @name("ipv4_dst") ; + } + actions = { + set_next_id_routing_v4; + nop_routing_v4; + drop_routing_v4; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V4_MISS); + counters = routing_v4_counter; + size = 1024; + } + direct_counter(CounterType.packets_and_bytes) routing_v6_counter; + action set_next_id_routing_v6(next_id_t next_id) { + set_next_id(next_id); + routing_v6_counter.count(); + } + action drop_routing_v6() { + fabric_md.skip_next = true; + routing_v6_counter.count(); + drop_ctl = 1; + } + table routing_v6 { + key = { + hdr.ipv6.dst_addr: lpm @name("ipv6_dst") ; + } + actions = { + set_next_id_routing_v6; + drop_routing_v6; + @defaultonly set_int_drop_reason; + } + default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V6_MISS); + counters = routing_v6_counter; + size = 1024; + } + apply { + if (hdr.ethernet.isValid() && fabric_md.bridged.base.fwd_type == FWD_BRIDGING) { + bridging.apply(); + } else if (hdr.mpls.isValid() && fabric_md.bridged.base.fwd_type == FWD_MPLS) { + mpls.apply(); + } else if (fabric_md.lkp.is_ipv4 && (fabric_md.bridged.base.fwd_type == FWD_IPV4_UNICAST || fabric_md.bridged.base.fwd_type == FWD_IPV4_MULTICAST)) { + routing_v4.apply(); + } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type == FWD_IPV6_UNICAST) { + routing_v6.apply(); + } + } +} + +control LookupMdInit(in ingress_headers_t hdr, out lookup_metadata_t lkp_md) { + apply { + lkp_md.eth_dst = hdr.ethernet.dst_addr; + lkp_md.eth_src = hdr.ethernet.src_addr; + lkp_md.eth_type = hdr.eth_type.value; + lkp_md.vlan_id = 0; + if (hdr.vlan_tag.isValid()) { + lkp_md.vlan_id = hdr.vlan_tag.vlan_id; + } + lkp_md.is_ipv4 = false; + lkp_md.ipv4_src = 0; + lkp_md.ipv4_dst = 0; + lkp_md.ip_proto = 0; + lkp_md.l4_sport = 0; + lkp_md.l4_dport = 0; + lkp_md.icmp_type = 0; + lkp_md.icmp_code = 0; + if (hdr.inner_ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.inner_ipv4.src_addr; + lkp_md.ipv4_dst = hdr.inner_ipv4.dst_addr; + lkp_md.ip_proto = hdr.inner_ipv4.protocol; + if (hdr.inner_tcp.isValid()) { + lkp_md.l4_sport = hdr.inner_tcp.sport; + lkp_md.l4_dport = hdr.inner_tcp.dport; + } else if (hdr.inner_udp.isValid()) { + lkp_md.l4_sport = hdr.inner_udp.sport; + lkp_md.l4_dport = hdr.inner_udp.dport; + } else if (hdr.inner_icmp.isValid()) { + lkp_md.icmp_type = hdr.inner_icmp.icmp_type; + lkp_md.icmp_code = hdr.inner_icmp.icmp_code; + } + } else if (hdr.ipv4.isValid()) { + lkp_md.is_ipv4 = true; + lkp_md.ipv4_src = hdr.ipv4.src_addr; + lkp_md.ipv4_dst = hdr.ipv4.dst_addr; + lkp_md.ip_proto = hdr.ipv4.protocol; + if (hdr.tcp.isValid()) { + lkp_md.l4_sport = hdr.tcp.sport; + lkp_md.l4_dport = hdr.tcp.dport; + } else if (hdr.udp.isValid()) { + lkp_md.l4_sport = hdr.udp.sport; + lkp_md.l4_dport = hdr.udp.dport; + } else if (hdr.icmp.isValid()) { + lkp_md.icmp_type = hdr.icmp.icmp_type; + lkp_md.icmp_code = hdr.icmp.icmp_code; + } + } + } +} + +control UpfIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bool do_upf_uplink_recirc, inout bit<1> drop_ctl) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + meter(20000, MeterType.bytes) session_meter; + meter(20000, MeterType.bytes) app_meter; + bool is_uplink = false; + bool term_hit = false; + bool sess_hit = false; + bit<32> app_ipv4_addr = 0; + l4_port_t app_l4_port = 0; + bit<8> app_ip_proto = 0; + bit<8> internal_app_id = DEFAULT_APP_ID; + ue_session_id_t ue_session_id = 0; + session_meter_idx_t session_meter_idx_internal = DEFAULT_SESSION_METER_IDX; + app_meter_idx_t app_meter_idx_internal = DEFAULT_APP_METER_IDX; + @hidden action _drop_common() { + drop_ctl = 1; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + } + @hidden action _term_hit(upf_ctr_idx_t ctr_id) { + fabric_md.bridged.upf.upf_ctr_id = ctr_id; + term_hit = true; + } + @hidden action _set_field_encap(teid_t teid, bit<6> qfi) { + fabric_md.bridged.upf.needs_gtpu_encap = true; + fabric_md.bridged.upf.teid = teid; + fabric_md.bridged.upf.qfi = qfi; + } + @hidden action _gtpu_decap() { + fabric_md.bridged.base.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.routing_ipv4_dst = hdr.inner_ipv4.dst_addr; + hdr.ipv4 = hdr.inner_ipv4; + hdr.inner_ipv4.setInvalid(); + hdr.udp = hdr.inner_udp; + hdr.inner_udp.setInvalid(); + hdr.tcp = hdr.inner_tcp; + hdr.inner_tcp.setInvalid(); + hdr.icmp = hdr.inner_icmp; + hdr.inner_icmp.setInvalid(); + hdr.gtpu.setInvalid(); + hdr.gtpu_options.setInvalid(); + hdr.gtpu_ext_psc.setInvalid(); + fabric_md.bridged.base.encap_presence = EncapPresence.NONE; + } + @hidden action _iface_common(slice_id_t slice_id) { + fabric_md.bridged.upf.skip_upf = false; + fabric_md.is_upf_hit = true; + fabric_md.upf_slice_id = slice_id; + } + action iface_access(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_core(slice_id_t slice_id) { + _iface_common(slice_id); + } + action iface_dbuf(slice_id_t slice_id) { + _iface_common(slice_id); + _gtpu_decap(); + } + action iface_miss() { + fabric_md.bridged.upf.skip_upf = true; + } + table interfaces { + key = { + hdr.ipv4.dst_addr : lpm @name("ipv4_dst_addr") ; + hdr.gtpu.isValid(): exact @name("gtpu_is_valid") ; + } + actions = { + iface_access; + iface_core; + iface_dbuf; + @defaultonly iface_miss; + } + const default_action = iface_miss(); + const size = 64; + } + action set_uplink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_MISS; + } + action set_uplink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_SESSION_DROP; + } + action set_downlink_session_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_MISS; + } + action set_downlink_session_drop() { + sess_hit = true; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP; + } + action set_downlink_session(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + } + action set_downlink_session_buf(tun_peer_id_t tun_peer_id, session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + session_meter_idx_internal = session_meter_idx; + fabric_md.bridged.upf.tun_peer_id = tun_peer_id; + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + action set_downlink_session_buf_drop() { + sess_hit = true; + ue_session_id = fabric_md.routing_ipv4_dst; + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_SESSION_DROP_BUFF; + } + action set_uplink_session(session_meter_idx_t session_meter_idx) { + sess_hit = true; + ue_session_id = fabric_md.lkp.ipv4_src; + session_meter_idx_internal = session_meter_idx; + _gtpu_decap(); + } + table downlink_sessions { + key = { + fabric_md.routing_ipv4_dst: exact @name("ue_addr") ; + } + actions = { + set_downlink_session; + set_downlink_session_buf; + set_downlink_session_buf_drop; + set_downlink_session_drop; + @defaultonly set_downlink_session_miss; + } + size = 100000; + const default_action = set_downlink_session_miss(); + } + table uplink_sessions { + key = { + hdr.ipv4.dst_addr: exact @name("tunnel_ipv4_dst") ; + hdr.gtpu.teid : exact @name("teid") ; + } + actions = { + set_uplink_session; + set_uplink_session_drop; + @defaultonly set_uplink_session_miss; + } + size = 100000 * 1; + const default_action = set_uplink_session_miss(); + } + action uplink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_MISS; + } + action downlink_drop_miss() { + _drop_common(); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_MISS; + } + action uplink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UL_TERMINATION_DROP; + } + action downlink_drop(upf_ctr_idx_t ctr_id) { + _drop_common(); + _term_hit(ctr_id); + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_DL_TERMINATION_DROP; + } + action app_fwd(upf_ctr_idx_t ctr_id, tc_t tc, app_meter_idx_t app_meter_idx) { + _term_hit(ctr_id); + fabric_md.upf_tc = tc; + app_meter_idx_internal = app_meter_idx; + fabric_md.tc_unknown = false; + } + action downlink_fwd_encap(upf_ctr_idx_t ctr_id, tc_t tc, teid_t teid, bit<6> qfi, app_meter_idx_t app_meter_idx) { + app_fwd(ctr_id, tc, app_meter_idx); + _set_field_encap(teid, qfi); + } + table uplink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + app_fwd; + uplink_drop; + @defaultonly uplink_drop_miss; + } + const default_action = uplink_drop_miss(); + const size = 100000; + } + table downlink_terminations { + key = { + ue_session_id : exact @name("ue_session_id") ; + internal_app_id: exact @name("app_id") ; + } + actions = { + downlink_fwd_encap; + downlink_drop; + @defaultonly downlink_drop_miss; + } + const default_action = downlink_drop_miss(); + const size = 100000; + } + action set_routing_ipv4_dst(ipv4_addr_t tun_dst_addr) { + fabric_md.routing_ipv4_dst = tun_dst_addr; + } + table ig_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + set_routing_ipv4_dst; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + action set_app_id(bit<8> app_id) { + internal_app_id = app_id; + } + table applications { + key = { + fabric_md.upf_slice_id: exact @name("slice_id") ; + app_ipv4_addr : lpm @name("app_ipv4_addr") ; + app_l4_port : range @name("app_l4_port") ; + app_ip_proto : ternary @name("app_ip_proto") ; + } + actions = { + set_app_id; + @defaultonly nop; + } + const default_action = nop(); + size = 5 * 1; + } + direct_counter(CounterType.packets) recirc_stats; + action recirc_allow() { + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + do_upf_uplink_recirc = true; + fabric_md.egress_port_set = true; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_deny() { + fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UPF_UPLINK_RECIRC_DENY; + do_upf_uplink_recirc = false; + fabric_md.skip_forwarding = true; + fabric_md.skip_next = true; + recirc_stats.count(); + } + action recirc_miss() { + recirc_stats.count(); + } + table uplink_recirc_rules { + key = { + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + } + actions = { + recirc_allow; + recirc_deny; + @defaultonly recirc_miss; + } + const default_action = recirc_miss; + size = 64; + counters = recirc_stats; + } + apply { + if (hdr.ipv4.isValid()) { + switch (interfaces.apply().action_run) { + iface_access: { + is_uplink = true; + app_ipv4_addr = fabric_md.lkp.ipv4_dst; + app_l4_port = fabric_md.lkp.l4_dport; + app_ip_proto = fabric_md.lkp.ip_proto; + if (fabric_md.bridged.base.encap_presence != EncapPresence.NONE) { + uplink_sessions.apply(); + } + } + iface_core: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + iface_dbuf: { + app_ipv4_addr = fabric_md.lkp.ipv4_src; + app_l4_port = fabric_md.lkp.l4_sport; + app_ip_proto = fabric_md.lkp.ip_proto; + downlink_sessions.apply(); + } + } + applications.apply(); + if (sess_hit) { + if (is_uplink) { + uplink_terminations.apply(); + uplink_recirc_rules.apply(); + } else { + downlink_terminations.apply(); + } + } else { + fabric_md.bridged.upf.skip_egress_upf_ctr = true; + } + app_meter.execute_meter((bit<32>)app_meter_idx_internal, fabric_md.upf_meter_color); + if (fabric_md.upf_meter_color != MeterColor_t.RED) { + session_meter.execute_meter((bit<32>)session_meter_idx_internal, fabric_md.upf_meter_color); + } + ig_tunnel_peers.apply(); + if (term_hit) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control UpfEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md) { + counter(4096, CounterType.packets_and_bytes) terminations_counter; + action load_tunnel_params(l4_port_t tunnel_src_port, ipv4_addr_t tunnel_src_addr, ipv4_addr_t tunnel_dst_addr) { + hdr.ipv4.src_addr = tunnel_src_addr; + hdr.ipv4.dst_addr = tunnel_dst_addr; + hdr.udp.sport = tunnel_src_port; + } + table eg_tunnel_peers { + key = { + fabric_md.bridged.upf.tun_peer_id: exact @name("tun_peer_id") ; + } + actions = { + load_tunnel_params; + @defaultonly nop; + } + const default_action = nop(); + const size = 256; + } + @hidden action _encap_initialize() { + hdr.ipv4.version = 4w4; + hdr.ipv4.ihl = 4w5; + hdr.ipv4.dscp = 0; + hdr.ipv4.ecn = 0; + hdr.ipv4.identification = 0x1513; + hdr.ipv4.flags = 0; + hdr.ipv4.frag_offset = 0; + hdr.ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.ipv4.protocol = PROTO_UDP; + hdr.udp.dport = GTPU_UDP_PORT; + hdr.gtpu.version = GTP_V1; + hdr.gtpu.pt = GTP_PROTOCOL_TYPE_GTP; + hdr.gtpu.spare = 0; + hdr.gtpu.seq_flag = 0; + hdr.gtpu.npdu_flag = 0; + hdr.gtpu.msgtype = GTPU_GPDU; + hdr.gtpu.teid = fabric_md.bridged.upf.teid; + hdr.gtpu_options.seq_num = 0; + hdr.gtpu_options.n_pdu_num = 0; + hdr.gtpu_options.next_ext = GTPU_NEXT_EXT_PSC; + hdr.gtpu_ext_psc.len = GTPU_EXT_PSC_LEN; + hdr.gtpu_ext_psc.type = GTPU_EXT_PSC_TYPE_DL; + hdr.gtpu_ext_psc.spare0 = 0; + hdr.gtpu_ext_psc.ppp = 0; + hdr.gtpu_ext_psc.rqi = 0; + hdr.gtpu_ext_psc.next_ext = GTPU_NEXT_EXT_NONE; + } + @hidden action _encap_common() { + hdr.inner_ipv4.setValid(); + hdr.inner_ipv4 = hdr.ipv4; + hdr.udp.setValid(); + hdr.gtpu.setValid(); + _encap_initialize(); + } + action gtpu_only() { + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = hdr.inner_ipv4.total_len; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_ONLY; + } + action gtpu_with_psc() { + hdr.gtpu_options.setValid(); + hdr.gtpu_ext_psc.setValid(); + _encap_common(); + hdr.ipv4.total_len = 20 + 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.udp.len = 8 + 8 + 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.msglen = 4 + 4 + hdr.inner_ipv4.total_len; + hdr.gtpu.ex_flag = 1; + hdr.gtpu_ext_psc.qfi = fabric_md.bridged.upf.qfi; + fabric_md.int_report_md.encap_presence = EncapPresence.GTPU_WITH_PSC; + } + table gtpu_encap { + actions = { + gtpu_only; + gtpu_with_psc; + } + default_action = gtpu_only(); + const size = 1; + } + apply { + if (!fabric_md.bridged.upf.skip_upf) { + if (fabric_md.bridged.upf.needs_gtpu_encap) { + if (hdr.udp.isValid()) { + hdr.inner_udp.setValid(); + hdr.inner_udp = hdr.udp; + hdr.udp.setInvalid(); + } + if (hdr.tcp.isValid()) { + hdr.inner_tcp.setValid(); + hdr.inner_tcp = hdr.tcp; + hdr.tcp.setInvalid(); + } + if (hdr.icmp.isValid()) { + hdr.inner_icmp.setValid(); + hdr.inner_icmp = hdr.icmp; + hdr.icmp.setInvalid(); + } + gtpu_encap.apply(); + eg_tunnel_peers.apply(); + } + if (!fabric_md.bridged.upf.skip_egress_upf_ctr) { + terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id); + } + } + } +} + +control IntWatchlist(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntReportType_t recirc_preserved_report_type) { + direct_counter(CounterType.packets_and_bytes) watchlist_counter; + action mark_to_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_FLOW; + recirc_preserved_report_type = INT_REPORT_TYPE_FLOW; + watchlist_counter.count(); + } + action no_report() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + recirc_preserved_report_type = INT_REPORT_TYPE_NO_REPORT; + } + action no_report_collector() { + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT; + } + table watchlist { + key = { + fabric_md.lkp.is_ipv4 : exact @name("ipv4_valid") ; + fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ; + fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ; + fabric_md.lkp.ip_proto: ternary @name("ip_proto") ; + fabric_md.lkp.l4_sport: range @name("l4_sport") ; + fabric_md.lkp.l4_dport: range @name("l4_dport") ; + } + actions = { + mark_to_report; + no_report_collector; + @defaultonly no_report(); + } + const default_action = no_report(); + const size = 64; + counters = watchlist_counter; + } + apply { + watchlist.apply(); + } +} + +control IntIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) { + direct_counter(CounterType.packets_and_bytes) drop_report_counter; + @hidden action report_drop() { + fabric_md.bridged.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_DROP; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + drop_ctl = 0; + standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT; + drop_report_counter.count(); + } + @hidden table drop_report { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + drop_ctl : exact @name("drop_ctl") ; + fabric_md.punt_to_cpu : exact @name("punt_to_cpu") ; + fabric_md.egress_port_set : exact @name("egress_port_set") ; + standard_md.mcast_grp : ternary @name("mcast_group_id") ; + } + actions = { + report_drop; + @defaultonly nop; + } + const entries = { + (INT_REPORT_TYPE_FLOW, 1, false, false, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 1, false, true, default) : report_drop(); + (INT_REPORT_TYPE_FLOW, 0, false, false, 0) : report_drop(); + } + const default_action = nop(); + counters = drop_report_counter; + } + apply { + fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec; + fabric_md.bridged.int_bmd.queue_id = 0; + drop_report.apply(); + } +} + +control IntEgress(inout v1model_header_t hdr_v1model, inout fabric_v1model_metadata_t fabric_v1model, inout standard_metadata_t standard_md) { + const bit<48> DEFAULT_TIMESTAMP_MASK = 0xffffc0000000; + const bit<32> DEFAULT_HOP_LATENCY_MASK = 0xffffff00; + egress_headers_t hdr = hdr_v1model.egress; + fabric_egress_metadata_t fabric_md = fabric_v1model.egress; + direct_counter(CounterType.packets_and_bytes) report_counter; + direct_counter(CounterType.packets_and_bytes) int_metadata_counter; + QueueId_t egress_qid = 0; + @hidden register>(1024) seq_number; + @hidden action get_seq_number(in bit<32> seq_number_idx, out bit<32> result) { + bit<32> reg = 0; + seq_number.read(reg, seq_number_idx); + reg = reg + 1; + result = reg; + seq_number.write(seq_number_idx, reg); + } + action check_quota() { + } + action reset_quota() { + } + table queue_latency_thresholds { + key = { + egress_qid : exact @name("egress_qid") ; + fabric_md.int_md.hop_latency[31:16]: range @name("hop_latency_upper") ; + fabric_md.int_md.hop_latency[15:0] : range @name("hop_latency_lower") ; + } + actions = { + check_quota; + reset_quota; + @defaultonly nop; + } + default_action = nop(); + const size = 32 * 4; + } + action set_config(bit<32> hop_latency_mask, bit<48> timestamp_mask) { + fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask; + fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask; + } + table config { + actions = { + @defaultonly set_config; + } + default_action = set_config(DEFAULT_HOP_LATENCY_MASK, DEFAULT_TIMESTAMP_MASK); + const size = 1; + } + @hidden action _report_encap_common(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + random(hdr.report_ipv4.identification, 0, 0xffff); + hdr.report_ipv4.src_addr = src_ip; + hdr.report_ipv4.dst_addr = mon_ip; + hdr.report_udp.dport = mon_port; + get_seq_number((bit<32>)hdr.report_fixed_header.hw_id, hdr.report_fixed_header.seq_no); + hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type; + hdr.common_report_header.switch_id = switch_id; + hdr.common_report_header.pad1 = 0; + hdr.common_report_header.pad2 = 0; + hdr.common_report_header.pad3 = 0; + hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type; + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INVALID; + report_counter.count(); + } + action do_local_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.local_report_header.setValid(); + } + action do_local_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_local_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + } + action do_drop_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) { + _report_encap_common(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_DROP_HEADER; + hdr.drop_report_header.setValid(); + hdr.local_report_header.setInvalid(); + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + } + action do_drop_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) { + do_drop_report_encap(src_ip, mon_ip, mon_port, switch_id); + hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS; + hdr.report_mpls.setValid(); + hdr.report_mpls.tc = 0; + hdr.report_mpls.bos = 0; + hdr.report_mpls.ttl = DEFAULT_MPLS_TTL; + hdr.report_mpls.label = mon_label; + hdr.report_mpls.label = mon_label; + } + table report { + key = { + fabric_md.int_report_md.bmd_type : exact @name("bmd_type") ; + fabric_md.int_report_md.mirror_type: exact @name("mirror_type") ; + fabric_md.int_report_md.report_type: exact @name("int_report_type") ; + } + actions = { + do_local_report_encap; + do_local_report_encap_mpls; + do_drop_report_encap; + do_drop_report_encap_mpls; + @defaultonly nop(); + } + default_action = nop; + const size = 6; + counters = report_counter; + } + @hidden action init_int_metadata(bit<3> report_type) { + fabric_md.bridged.int_bmd.mirror_session_id = V1MODEL_INT_MIRROR_SESSION; + fabric_md.int_report_md.setValid(); + fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.bmd_type = BridgedMdType_t.EGRESS_MIRROR; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INT_REPORT; + fabric_md.int_report_md.report_type = fabric_md.bridged.int_bmd.report_type; + fabric_md.int_report_md.ig_port = fabric_md.bridged.base.ig_port; + fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port; + fabric_md.int_report_md.queue_id = egress_qid; + fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth; + fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]; + fabric_md.int_report_md.ip_eth_type = fabric_md.bridged.base.ip_eth_type; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + fabric_md.int_report_md.report_type = report_type; + int_metadata_counter.count(); + } + @hidden table int_metadata { + key = { + fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ; + fabric_v1model.drop_ctl : exact @name("drop_ctl") ; + fabric_md.int_md.queue_report : exact @name("queue_report") ; + } + actions = { + init_int_metadata; + @defaultonly nop(); + } + const default_action = nop(); + const entries = { + (INT_REPORT_TYPE_FLOW, 0, false) : init_int_metadata(INT_REPORT_TYPE_FLOW); + (INT_REPORT_TYPE_FLOW, 1, false) : init_int_metadata(INT_REPORT_TYPE_DROP); + } + counters = int_metadata_counter; + } + @hidden action adjust_ip_udp_len(bit<16> adjust_ip, bit<16> adjust_udp) { + hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip; + hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp; + } + @hidden table adjust_int_report_hdr_length { + key = { + fabric_md.bridged.int_bmd.wip_type: exact @name("is_int_wip") ; + } + actions = { + @defaultonly nop(); + adjust_ip_udp_len; + } + const default_action = nop(); + const entries = { + INT_IS_WIP : adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES); + INT_IS_WIP_WITH_MPLS : adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES); + } + } + apply { + fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]; + fabric_md.int_md.timestamp = standard_md.egress_global_timestamp; + queue_latency_thresholds.apply(); + config.apply(); + hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]; + if (fabric_md.int_report_md.isValid()) { + report.apply(); + } else { + if (int_metadata.apply().hit) { + clone_preserving_field_list(CloneType.E2E, (bit<32>)fabric_md.bridged.int_bmd.mirror_session_id, PRESERVE_INT_MD); + } + } + adjust_int_report_hdr_length.apply(); + fabric_v1model.egress = fabric_md; + hdr_v1model.egress = hdr; + } +} + +control IntTnaEgressParserEmulator(inout v1model_header_t hdr_v1model, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md) { + egress_headers_t hdr = hdr_v1model.egress; + @hidden action set_common_int_headers() { + hdr.report_ethernet.setValid(); + hdr.report_eth_type.setValid(); + hdr.report_ipv4.setValid(); + hdr.report_ipv4.version = 4w4; + hdr.report_ipv4.ihl = 4w5; + hdr.report_ipv4.dscp = 0; + hdr.report_ipv4.ecn = 2w0; + hdr.report_ipv4.flags = 0; + hdr.report_ipv4.frag_offset = 0; + hdr.report_ipv4.ttl = DEFAULT_IPV4_TTL; + hdr.report_ipv4.protocol = PROTO_UDP; + hdr.report_udp.setValid(); + hdr.report_udp.sport = 0; + hdr.report_fixed_header.setValid(); + hdr.report_fixed_header.ver = 0; + hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER; + hdr.report_fixed_header.rsvd = 0; + hdr.common_report_header.setValid(); + } + @hidden action set_common_int_drop_headers() { + set_common_int_headers(); + fabric_md.int_report_md.setValid(); + fabric_md.int_report_md.ip_eth_type = ETHERTYPE_IPV4; + fabric_md.int_report_md.report_type = INT_REPORT_TYPE_DROP; + fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INVALID; + hdr.drop_report_header.setValid(); + } + @hidden action parse_int_ingress_drop() { + set_common_int_drop_headers(); + fabric_md.int_report_md.bmd_type = BridgedMdType_t.INT_INGRESS_DROP; + fabric_md.int_report_md.encap_presence = fabric_md.bridged.base.encap_presence; + fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash; + hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason; + hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]; + hdr.common_report_header.ig_port = fabric_md.bridged.base.ig_port; + hdr.common_report_header.eg_port = 0; + hdr.common_report_header.queue_id = 0; + } + @hidden action parse_int_report_mirror() { + set_common_int_headers(); + fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type; + fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID; + fabric_md.bridged.base.mpls_label = 0; + fabric_md.bridged.upf.skip_upf = true; + hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp; + hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port; + hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port; + hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id; + hdr.local_report_header.setValid(); + hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy; + hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp; + } + apply { + fabric_md.is_int_recirc = true; + hdr_v1model.ingress.vlan_tag.setInvalid(); + if (hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()) { + hdr_v1model.ingress.ipv4.setInvalid(); + hdr_v1model.ingress.tcp.setInvalid(); + hdr_v1model.ingress.udp.setInvalid(); + hdr_v1model.ingress.icmp.setInvalid(); + hdr_v1model.ingress.vxlan.setInvalid(); + hdr_v1model.ingress.inner_ethernet.setInvalid(); + hdr_v1model.ingress.inner_eth_type.setInvalid(); + hdr_v1model.ingress.gtpu.setInvalid(); + hdr_v1model.ingress.gtpu_options.setInvalid(); + hdr_v1model.ingress.gtpu_ext_psc.setInvalid(); + } + if ((bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parse_int_ingress_drop(); + recirculate_preserving_field_list(NO_PRESERVATION); + } else { + parse_int_report_mirror(); + recirculate_preserving_field_list(PRESERVE_INT_MD); + } + hdr_v1model.egress = hdr; + } +} + +control FabricIngress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + LookupMdInit() lkp_md_init; + StatsIngress() stats; + PacketIoIngress() pkt_io; + Filtering() filtering; + Forwarding() forwarding; + PreNext() pre_next; + Acl() acl; + Next() next; + Hasher() hasher; + IngressSliceTcClassifier() slice_tc_classifier; + IngressQos() qos; + UpfIngress() upf; + IntWatchlist() int_watchlist; + IntIngress() int_ingress; + apply { + mark_to_drop(standard_md); + if (standard_md.parser_error == error.PacketRejectedByParser) { + exit; + } + if (standard_md.instance_type == 4) { + fabric_md.ingress.bridged.base.ig_port = FAKE_V1MODEL_RECIRC_PORT; + } + lkp_md_init.apply(hdr.ingress, fabric_md.ingress.lkp); + pkt_io.apply(hdr.ingress, fabric_md.ingress, fabric_md.skip_egress, standard_md, fabric_md.recirc_preserved_egress_port); + int_watchlist.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_report_type); + stats.apply(fabric_md.ingress.lkp, fabric_md.ingress.bridged.base.ig_port, fabric_md.ingress.bridged.base.stats_flow_id); + slice_tc_classifier.apply(hdr.ingress, standard_md, fabric_md.ingress); + filtering.apply(hdr.ingress, fabric_md.ingress, standard_md); + if (!fabric_md.ingress.skip_forwarding) { + upf.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.do_upf_uplink_recirc, fabric_md.drop_ctl); + } + if (!fabric_md.ingress.skip_forwarding) { + forwarding.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + } + hasher.apply(hdr.ingress, fabric_md.ingress); + if (!fabric_md.ingress.skip_next) { + pre_next.apply(hdr.ingress, fabric_md.ingress); + } + acl.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port, fabric_md.drop_ctl); + if (!fabric_md.ingress.skip_next) { + next.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port); + } + qos.apply(fabric_md.ingress, standard_md, fabric_md.drop_ctl); + int_ingress.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl); + fabric_md.egress.bridged = fabric_md.ingress.bridged; + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +control FabricEgress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) { + StatsEgress() stats; + PacketIoEgress() pkt_io_egress; + EgressNextControl() egress_next; + EgressDscpRewriter() dscp_rewriter; + UpfEgress() upf; + IntTnaEgressParserEmulator() parser_emulator; + IntEgress() int_egress; + apply { + fabric_md.egress.cpu_port = 0; + if (fabric_md.skip_egress) { + exit; + } + if (standard_md.instance_type == 2) { + fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md.recirc_preserved_drop_reason; + fabric_md.egress.bridged.int_bmd.report_type = fabric_md.recirc_preserved_report_type; + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + if ((bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) { + parser_emulator.apply(hdr, fabric_md.egress, standard_md); + } + pkt_io_egress.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_ingress_port); + stats.apply(fabric_md.egress.bridged.base.stats_flow_id, standard_md.egress_port, fabric_md.egress.bridged.bmd_type); + egress_next.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_drop_reason, fabric_md.drop_ctl); + upf.apply(hdr.ingress, fabric_md.egress); + int_egress.apply(hdr, fabric_md, standard_md); + dscp_rewriter.apply(fabric_md.egress, standard_md, hdr.ingress); + if (fabric_md.do_upf_uplink_recirc) { + recirculate_preserving_field_list(NO_PRESERVATION); + } + if (fabric_md.drop_ctl == 1) { + mark_to_drop(standard_md); + } + } +} + +V1Switch(FabricParser(), FabricVerifyChecksum(), FabricIngress(), FabricEgress(), FabricComputeChecksum(), FabricDeparser()) main; + diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json b/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json new file mode 100644 index 000000000..fe66f93e4 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json @@ -0,0 +1,28235 @@ +{ + "header_types" : [ + { + "name" : "scalars_0", + "id" : 0, + "fields" : [ + ["tmp_2", 16, false], + ["tmp_4", 1, false], + ["tmp_6", 16, false], + ["tmp_12", 3, false], + ["tmp_13", 8, false], + ["gtpu_ext_len_0", 8, false], + ["tmp_3", 16, false], + ["tmp_5", 16, false], + ["tmp_7", 4, false], + ["tmp_8", 112, false], + ["tmp_9", 112, false], + ["tmp_10", 112, false], + ["tmp_11", 64, false], + ["tmp_14", 32, false], + ["tmp_15", 32, false], + ["tmp_16", 32, false], + ["tmp_17", 32, false], + ["tmp_18", 8, false], + ["tmp_19", 32, false], + ["tmp_20", 32, false], + ["tmp_21", 32, false], + ["tmp_22", 32, false], + ["tmp_23", 48, false], + ["tmp_24", 48, false], + ["tmp_25", 16, false], + ["tmp_26", 32, false], + ["tmp_27", 32, false], + ["tmp_28", 8, false], + ["tmp_29", 16, false], + ["tmp_30", 16, false], + ["tmp_31", 32, false], + ["qos_packet_color", 2, false], + ["upf_is_uplink", 1, false], + ["upf_term_hit", 1, false], + ["upf_sess_hit", 1, false], + ["upf_app_ipv4_addr", 32, false], + ["upf_app_l4_port", 16, false], + ["upf_app_ip_proto", 8, false], + ["upf_internal_app_id", 8, false], + ["upf_ue_session_id", 32, false], + ["upf_session_meter_idx_internal", 15, false], + ["upf_app_meter_idx_internal", 15, false], + ["tmp_32", 32, false], + ["tmp_33", 32, false], + ["tmp_34", 32, false], + ["tmp_35", 32, false], + ["tmp_36", 32, false], + ["tmp_37", 32, false], + ["tmp_38", 32, false], + ["tmp_39", 32, false], + ["tmp_40", 32, false], + ["tmp_41", 32, false], + ["dscp_rewriter_tmp_dscp", 6, false], + ["int_egress_fabric_md_pkt_length", 16, false], + ["int_egress_egress_qid", 5, false], + ["int_egress_reg", 32, false], + ["key_0", 16, false], + ["key_1", 16, false], + ["userMetadata._skip_egress0", 1, false], + ["userMetadata._do_upf_uplink_recirc1", 1, false], + ["userMetadata._drop_ctl2", 1, false], + ["userMetadata._int_mirror_type3", 3, false], + ["userMetadata._ingress_ecmp_hash5", 32, false], + ["userMetadata._ingress_lkp_eth_dst6", 48, false], + ["userMetadata._ingress_lkp_eth_src7", 48, false], + ["userMetadata._ingress_lkp_eth_type8", 16, false], + ["userMetadata._ingress_lkp_vlan_id9", 12, false], + ["userMetadata._ingress_lkp_is_ipv410", 1, false], + ["userMetadata._ingress_lkp_ipv4_src11", 32, false], + ["userMetadata._ingress_lkp_ipv4_dst12", 32, false], + ["userMetadata._ingress_lkp_ip_proto13", 8, false], + ["userMetadata._ingress_lkp_l4_sport14", 16, false], + ["userMetadata._ingress_lkp_l4_dport15", 16, false], + ["userMetadata._ingress_lkp_icmp_type16", 8, false], + ["userMetadata._ingress_lkp_icmp_code17", 8, false], + ["userMetadata._ingress_routing_ipv4_dst18", 32, false], + ["userMetadata._ingress_skip_forwarding19", 1, false], + ["userMetadata._ingress_skip_next20", 1, false], + ["userMetadata._ingress_next_id21", 32, false], + ["userMetadata._ingress_egress_port_set22", 1, false], + ["userMetadata._ingress_punt_to_cpu23", 1, false], + ["userMetadata._ingress_ipv4_checksum_err24", 1, false], + ["userMetadata._ingress_inner_ipv4_checksum_err25", 1, false], + ["userMetadata._ingress_slice_id26", 4, false], + ["userMetadata._ingress_tc27", 2, false], + ["userMetadata._ingress_tc_unknown28", 1, false], + ["userMetadata._ingress_is_upf_hit29", 1, false], + ["userMetadata._ingress_upf_slice_id30", 4, false], + ["userMetadata._ingress_upf_tc31", 2, false], + ["userMetadata._ingress_upf_meter_color32", 2, false], + ["userMetadata._ingress_ig_port_type33", 2, false], + ["userMetadata._ingress_mirror_mirror_session_id34", 10, false], + ["userMetadata._ingress_mirror_bmd_type35", 8, false], + ["userMetadata._egress_cpu_port37", 9, false], + ["userMetadata._egress_inner_ipv4_checksum_err38", 1, false], + ["userMetadata._egress_int_md_hop_latency40", 32, false], + ["userMetadata._egress_int_md_timestamp41", 48, false], + ["userMetadata._egress_int_md_vlan_stripped42", 1, false], + ["userMetadata._egress_int_md_queue_report43", 1, false], + ["userMetadata._egress_int_ipv4_len44", 16, false], + ["userMetadata._egress_is_int_recirc45", 1, false], + ["userMetadata._egress_pkt_length46", 16, false], + ["userMetadata._recirc_preserved_report_type47", 3, false], + ["userMetadata._recirc_preserved_egress_port48", 9, false], + ["userMetadata._recirc_preserved_drop_reason49", 8, false], + ["userMetadata._recirc_preserved_ingress_port50", 9, false], + ["_padding_1", 3, false] + ] + }, + { + "name" : "fake_ethernet_t", + "id" : 1, + "fields" : [ + ["_pad0", 48, false], + ["_pad1", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "packet_out_header_t", + "id" : 2, + "fields" : [ + ["pad0", 7, false], + ["egress_port", 9, false], + ["pad1", 3, false], + ["queue_id", 5, false], + ["pad2", 5, false], + ["cpu_loopback_mode", 2, false], + ["do_forwarding", 1, false], + ["pad3", 16, false], + ["pad4", 48, false], + ["ether_type", 16, false] + ] + }, + { + "name" : "gtpu_t", + "id" : 3, + "fields" : [ + ["version", 3, false], + ["pt", 1, false], + ["spare", 1, false], + ["ex_flag", 1, false], + ["seq_flag", 1, false], + ["npdu_flag", 1, false], + ["msgtype", 8, false], + ["msglen", 16, false], + ["teid", 32, false] + ] + }, + { + "name" : "ethernet_t", + "id" : 4, + "fields" : [ + ["dst_addr", 48, false], + ["src_addr", 48, false] + ] + }, + { + "name" : "eth_type_t", + "id" : 5, + "fields" : [ + ["value", 16, false] + ] + }, + { + "name" : "ipv4_t", + "id" : 6, + "fields" : [ + ["version", 4, false], + ["ihl", 4, false], + ["dscp", 6, false], + ["ecn", 2, false], + ["total_len", 16, false], + ["identification", 16, false], + ["flags", 3, false], + ["frag_offset", 13, false], + ["ttl", 8, false], + ["protocol", 8, false], + ["hdr_checksum", 16, false], + ["src_addr", 32, false], + ["dst_addr", 32, false] + ] + }, + { + "name" : "udp_t", + "id" : 7, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false], + ["len", 16, false], + ["checksum", 16, false] + ] + }, + { + "name" : "report_fixed_header_t", + "id" : 8, + "fields" : [ + ["ver", 4, false], + ["nproto", 4, false], + ["dqf", 3, false], + ["rsvd", 15, false], + ["hw_id", 6, false], + ["seq_no", 32, false], + ["ig_tstamp", 32, false] + ] + }, + { + "name" : "common_report_header_t", + "id" : 9, + "fields" : [ + ["switch_id", 32, false], + ["pad1", 7, false], + ["ig_port", 9, false], + ["pad2", 7, false], + ["eg_port", 9, false], + ["pad3", 3, false], + ["queue_id", 5, false] + ] + }, + { + "name" : "local_report_header_t", + "id" : 10, + "fields" : [ + ["pad1", 5, false], + ["queue_occupancy", 19, false], + ["eg_tstamp", 32, false] + ] + }, + { + "name" : "drop_report_header_t", + "id" : 11, + "fields" : [ + ["drop_reason", 8, false], + ["pad", 16, false] + ] + }, + { + "name" : "mpls_t", + "id" : 12, + "fields" : [ + ["label", 20, false], + ["tc", 3, false], + ["bos", 1, false], + ["ttl", 8, false] + ] + }, + { + "name" : "bridged_metadata_t", + "id" : 13, + "fields" : [ + ["_bmd_type0", 8, false], + ["_base_inner_hash1", 32, false], + ["_base_mpls_label2", 20, false], + ["_base_ig_port3", 9, false], + ["_base_is_multicast4", 1, 0], + ["_base_fwd_type5", 3, false], + ["_base_vlan_id6", 12, false], + ["_base_encap_presence7", 2, false], + ["_base_mpls_ttl8", 8, false], + ["_base_ig_tstamp9", 48, false], + ["_base_ip_eth_type10", 16, false], + ["_base_stats_flow_id11", 10, false], + ["_base_slice_tc12", 6, false], + ["_upf_tun_peer_id13", 8, false], + ["_upf_upf_ctr_id14", 12, false], + ["_upf_qfi15", 6, false], + ["_upf_needs_gtpu_encap16", 1, 0], + ["_upf_skip_upf17", 1, 0], + ["_upf_skip_egress_upf_ctr18", 1, 0], + ["_upf_teid19", 32, false], + ["_upf__pad20", 4, false], + ["_int_bmd_report_type21", 3, false], + ["_int_bmd_mirror_session_id22", 10, false], + ["_int_bmd_drop_reason23", 8, false], + ["_int_bmd_queue_id24", 5, false], + ["_int_bmd_egress_port25", 9, false], + ["_int_bmd_wip_type26", 8, false], + ["__pad027", 1, false], + ["__pad128", 7, false], + ["__pad229", 5, false] + ] + }, + { + "name" : "int_report_metadata_t", + "id" : 14, + "fields" : [ + ["bmd_type", 8, false], + ["_pad0", 5, false], + ["mirror_type", 3, false], + ["_pad1", 7, false], + ["ig_port", 9, false], + ["_pad2", 7, false], + ["eg_port", 9, false], + ["_pad3", 3, false], + ["queue_id", 5, false], + ["_pad4", 5, false], + ["queue_occupancy", 19, false], + ["ig_tstamp", 32, false], + ["eg_tstamp", 32, false], + ["drop_reason", 8, false], + ["ip_eth_type", 16, false], + ["_pad5", 6, false], + ["encap_presence", 2, false], + ["report_type", 3, false], + ["_pad6", 5, false], + ["flow_hash", 32, false] + ] + }, + { + "name" : "int_metadata_t", + "id" : 15, + "fields" : [ + ["hop_latency", 32, false], + ["timestamp", 48, false], + ["vlan_stripped", 1, 0], + ["queue_report", 1, 0], + ["_padding", 6, false] + ] + }, + { + "name" : "standard_metadata", + "id" : 16, + "fields" : [ + ["ingress_port", 9, false], + ["egress_spec", 9, false], + ["egress_port", 9, false], + ["instance_type", 32, false], + ["packet_length", 32, false], + ["enq_timestamp", 32, false], + ["enq_qdepth", 19, false], + ["deq_timedelta", 32, false], + ["deq_qdepth", 19, false], + ["ingress_global_timestamp", 48, false], + ["egress_global_timestamp", 48, false], + ["mcast_grp", 16, false], + ["egress_rid", 16, false], + ["checksum_error", 1, false], + ["parser_error", 32, false], + ["priority", 3, false], + ["_padding_0", 3, false] + ] + }, + { + "name" : "packet_in_header_t", + "id" : 17, + "fields" : [ + ["ingress_port", 9, false], + ["_pad0", 7, false] + ] + }, + { + "name" : "vlan_tag_t", + "id" : 18, + "fields" : [ + ["eth_type", 16, false], + ["pri", 3, false], + ["cfi", 1, false], + ["vlan_id", 12, false] + ] + }, + { + "name" : "ipv6_t", + "id" : 19, + "fields" : [ + ["version", 4, false], + ["traffic_class", 8, false], + ["flow_label", 20, false], + ["payload_len", 16, false], + ["next_hdr", 8, false], + ["hop_limit", 8, false], + ["src_addr", 128, false], + ["dst_addr", 128, false] + ] + }, + { + "name" : "tcp_t", + "id" : 20, + "fields" : [ + ["sport", 16, false], + ["dport", 16, false] + ] + }, + { + "name" : "icmp_t", + "id" : 21, + "fields" : [ + ["icmp_type", 8, false], + ["icmp_code", 8, false] + ] + }, + { + "name" : "gtpu_options_t", + "id" : 22, + "fields" : [ + ["seq_num", 16, false], + ["n_pdu_num", 8, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "gtpu_ext_psc_t", + "id" : 23, + "fields" : [ + ["len", 8, false], + ["type", 4, false], + ["spare0", 4, false], + ["ppp", 1, false], + ["rqi", 1, false], + ["qfi", 6, false], + ["next_ext", 8, false] + ] + }, + { + "name" : "vxlan_t", + "id" : 24, + "fields" : [ + ["flags", 8, false], + ["reserved", 24, false], + ["vni", 24, false], + ["reserved_2", 8, false] + ] + } + ], + "headers" : [ + { + "name" : "tmp", + "id" : 0, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_0", + "id" : 1, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "tmp_1", + "id" : 2, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "gtpu_0", + "id" : 3, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ethernet", + "id" : 4, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_eth_type", + "id" : 5, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_ipv4", + "id" : 6, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_udp", + "id" : 7, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_report_fixed_header", + "id" : 8, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_common_report_header", + "id" : 9, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_local_report_header", + "id" : 10, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "parser_emulator_hdr_drop_report_header", + "id" : 11, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_eth_type", + "id" : 12, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_mpls", + "id" : 13, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_ipv4", + "id" : 14, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_udp", + "id" : 15, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_report_fixed_header", + "id" : 16, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_common_report_header", + "id" : 17, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_local_report_header", + "id" : 18, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_drop_report_header", + "id" : 19, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_hdr_eth_type", + "id" : 20, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_bridged", + "id" : 21, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_report_md", + "id" : 22, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "int_egress_fabric_md_int_md", + "id" : 23, + "header_type" : "int_metadata_t", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "scalars", + "id" : 24, + "header_type" : "scalars_0", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "standard_metadata", + "id" : 25, + "header_type" : "standard_metadata", + "metadata" : true, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_out0", + "id" : 26, + "header_type" : "packet_out_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_packet_in1", + "id" : 27, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_fake_ethernet2", + "id" : 28, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ethernet3", + "id" : 29, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vlan_tag4", + "id" : 30, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_eth_type5", + "id" : 31, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_mpls6", + "id" : 32, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv47", + "id" : 33, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_ipv68", + "id" : 34, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_tcp9", + "id" : 35, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_udp10", + "id" : 36, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_icmp11", + "id" : 37, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu12", + "id" : 38, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_options13", + "id" : 39, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_gtpu_ext_psc14", + "id" : 40, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_vxlan15", + "id" : 41, + "header_type" : "vxlan_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ethernet16", + "id" : 42, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_eth_type17", + "id" : 43, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_ipv418", + "id" : 44, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_tcp19", + "id" : 45, + "header_type" : "tcp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_udp20", + "id" : 46, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_inner_icmp21", + "id" : 47, + "header_type" : "icmp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_packet_in22", + "id" : 48, + "header_type" : "packet_in_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_fake_ethernet23", + "id" : 49, + "header_type" : "fake_ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ethernet24", + "id" : 50, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_eth_type25", + "id" : 51, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_mpls26", + "id" : 52, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_ipv427", + "id" : 53, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_udp28", + "id" : 54, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_report_fixed_header29", + "id" : 55, + "header_type" : "report_fixed_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_common_report_header30", + "id" : 56, + "header_type" : "common_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_local_report_header31", + "id" : 57, + "header_type" : "local_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_drop_report_header32", + "id" : 58, + "header_type" : "drop_report_header_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ethernet33", + "id" : 59, + "header_type" : "ethernet_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_vlan_tag34", + "id" : 60, + "header_type" : "vlan_tag_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_eth_type35", + "id" : 61, + "header_type" : "eth_type_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_mpls36", + "id" : 62, + "header_type" : "mpls_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_ipv437", + "id" : 63, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_udp38", + "id" : 64, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu39", + "id" : 65, + "header_type" : "gtpu_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_options40", + "id" : 66, + "header_type" : "gtpu_options_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_outer_gtpu_ext_psc41", + "id" : 67, + "header_type" : "gtpu_ext_psc_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv442", + "id" : 68, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv643", + "id" : 69, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_udp44", + "id" : 70, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_bridged4", + "id" : 71, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_bridged36", + "id" : 72, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_int_report_md39", + "id" : 73, + "header_type" : "int_report_metadata_t", + "metadata" : false, + "pi_omit" : true + } + ], + "header_stacks" : [], + "header_union_types" : [], + "header_unions" : [], + "header_union_stacks" : [], + "field_lists" : [ + { + "id" : 1, + "name" : "field_list241", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ] + }, + { + "id" : 2, + "name" : "field_list231", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ] + }, + { + "id" : 3, + "name" : "empty", + "elements" : [] + }, + { + "id" : 4, + "name" : "empty_0", + "elements" : [] + }, + { + "id" : 5, + "name" : "empty_1", + "elements" : [] + } + ], + "errors" : [ + ["NoError", 1], + ["PacketTooShort", 2], + ["NoMatch", 3], + ["StackOutOfBounds", 4], + ["HeaderTooShort", 5], + ["ParserTimeout", 6], + ["ParserInvalidArgument", 7], + ["PacketRejectedByParser", 8] + ], + "enums" : [], + "parsers" : [ + { + "name" : "parser", + "id" : 0, + "init_state" : "start", + "parse_states" : [ + { + "name" : "start", + "id" : 0, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_port"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_tstamp9"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "ingress_global_timestamp"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_8"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf02", + "mask" : null, + "next_state" : "parse_fake_ethernet" + }, + { + "type" : "hexstr", + "value" : "0xbf03", + "mask" : null, + "next_state" : "parse_fake_ethernet_and_accept" + }, + { + "type" : "hexstr", + "value" : "0xbf01", + "mask" : null, + "next_state" : "check_packet_out" + }, + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_2"] + } + ] + }, + { + "name" : "check_packet_out", + "id" : 1, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x69" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x7f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "egress_port"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x60" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x5d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "queue_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x58" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad2"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x53" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x1f" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "cpu_loopback_mode"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x51" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "do_forwarding"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad3"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "pad4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_0", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x50" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_packet_out_and_accept" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "strip_packet_out" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_4"] + } + ] + }, + { + "name" : "parse_int_wip_ipv4", + "id" : 2, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_int_wip_mpls", + "id" : 3, + "parser_ops" : [ + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ethernet3" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_eth_type5" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type26"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_mpls" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_packet_out_and_accept", + "id" : 4, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_packet_out0" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "strip_packet_out", + "id" : 5, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x00000070" + } + ], + "op" : "advance" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_fake_ethernet", + "id" : 6, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + { + "type" : "lookahead", + "value" : [0, 112] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "tmp_1" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x40" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "_pad1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["tmp_1", "ether_type"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_10"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0xbf04", + "mask" : null, + "next_state" : "parse_int_wip_ipv4" + }, + { + "type" : "hexstr", + "value" : "0xbf05", + "mask" : null, + "next_state" : "parse_int_wip_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_ethernet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_6"] + } + ] + }, + { + "name" : "parse_fake_ethernet_and_accept", + "id" : 7, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_fake_ethernet2" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_ethernet", + "id" : 8, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ethernet3" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x88a8", + "mask" : null, + "next_state" : "parse_vlan_tag" + }, + { + "type" : "hexstr", + "value" : "0x8100", + "mask" : "0xefff", + "next_state" : "parse_vlan_tag" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_untagged" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_3"] + } + ] + }, + { + "name" : "parse_vlan_tag", + "id" : 9, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vlan_tag4" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + }, + { + "type" : "lookahead", + "value" : [0, 16] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_5"] + } + ] + }, + { + "name" : "parse_untagged", + "id" : 10, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_eth_type" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_eth_type", + "id" : 11, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_eth_type5" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8847", + "mask" : null, + "next_state" : "parse_mpls" + }, + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_non_mpls" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_mpls", + "id" : 12, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_mpls6" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + }, + { + "type" : "lookahead", + "value" : [0, 4] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x04", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "reject_packet" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_7"] + } + ] + }, + { + "name" : "reject_packet", + "id" : 13, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "bool", + "value" : false + }, + { + "type" : "hexstr", + "value" : "0x8" + } + ], + "op" : "verify" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_non_mpls", + "id" : 14, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_ttl8"] + }, + { + "type" : "hexstr", + "value" : "0x41" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_ipv4" + }, + { + "type" : "hexstr", + "value" : "0x86dd", + "mask" : null, + "next_state" : "parse_ipv6" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ] + }, + { + "name" : "parse_ipv4", + "id" : 15, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv47" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ] + }, + { + "name" : "parse_ipv6", + "id" : 16, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_ipv68" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x86dd" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_udp" + }, + { + "type" : "hexstr", + "value" : "0x3a", + "mask" : null, + "next_state" : "parse_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "next_hdr"] + } + ] + }, + { + "name" : "parse_icmp", + "id" : 17, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_icmp11" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_tcp", + "id" : 18, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_tcp9" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_udp", + "id" : 19, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_udp10" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + { + "type" : "lookahead", + "value" : [0, 64] + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "parameters" : [ + { + "type" : "header", + "value" : "gtpu_0" + } + ], + "op" : "add_header" + } + ], + "op" : "primitive" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "version"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "pt"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3c" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "spare"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3b" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "ex_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3a" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "seq_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x39" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "npdu_flag"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x38" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msgtype"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x20" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["gtpu_0", "teid"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3d" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["scalars", "tmp_11"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x30" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffffffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x086801ff", + "mask" : null, + "next_state" : "parse_gtpu" + }, + { + "type" : "hexstr", + "value" : "0x12b50000", + "mask" : "0xffff0000", + "next_state" : "parse_vxlan" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_12"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_13"] + } + ] + }, + { + "name" : "parse_gtpu", + "id" : 20, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu12" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x000000", + "mask" : null, + "next_state" : "set_gtpu_only" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_gtpu_options" + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + } + ] + }, + { + "name" : "set_gtpu_only", + "id" : 21, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : "parse_inner_ipv4" + } + ], + "transition_key" : [] + }, + { + "name" : "parse_gtpu_options", + "id" : 22, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_options13" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + }, + { + "type" : "lookahead", + "value" : [0, 8] + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x8501", + "mask" : null, + "next_state" : "parse_gtpu_ext_psc" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "field", + "value" : ["scalars", "gtpu_ext_len_0"] + } + ] + }, + { + "name" : "parse_gtpu_ext_psc", + "id" : 23, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "op" : "set" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x00", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + } + ] + }, + { + "name" : "parse_vxlan", + "id" : 24, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_vxlan15" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x03" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ethernet16" + } + ], + "op" : "extract" + }, + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_eth_type17" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x0800", + "mask" : null, + "next_state" : "parse_inner_ipv4" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_eth_type17", "value"] + } + ] + }, + { + "name" : "parse_inner_ipv4", + "id" : 25, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_ipv418" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "hexstr", + "value" : "0x06", + "mask" : null, + "next_state" : "parse_inner_tcp" + }, + { + "type" : "hexstr", + "value" : "0x11", + "mask" : null, + "next_state" : "parse_inner_udp" + }, + { + "type" : "hexstr", + "value" : "0x01", + "mask" : null, + "next_state" : "parse_inner_icmp" + }, + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ] + }, + { + "name" : "parse_inner_tcp", + "id" : 26, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_tcp19" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_udp", + "id" : 27, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_udp20" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + }, + { + "name" : "parse_inner_icmp", + "id" : 28, + "parser_ops" : [ + { + "parameters" : [ + { + "type" : "regular", + "value" : "_ingress_inner_icmp21" + } + ], + "op" : "extract" + } + ], + "transitions" : [ + { + "type" : "default", + "value" : null, + "mask" : null, + "next_state" : null + } + ], + "transition_key" : [] + } + ] + } + ], + "parse_vsets" : [], + "deparsers" : [ + { + "name" : "deparser", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4", + "line" : 321, + "column" : 8, + "source_fragment" : "FabricDeparser" + }, + "order" : ["_ingress_fake_ethernet2", "_ingress_packet_in1", "_egress_report_ethernet24", "_egress_report_eth_type25", "_egress_report_mpls26", "_egress_report_ipv427", "_egress_report_udp28", "_egress_report_fixed_header29", "_egress_common_report_header30", "_egress_local_report_header31", "_egress_drop_report_header32", "_ingress_ethernet3", "_ingress_vlan_tag4", "_ingress_eth_type5", "_ingress_mpls6", "_ingress_ipv47", "_ingress_ipv68", "_ingress_tcp9", "_ingress_udp10", "_ingress_icmp11", "_ingress_gtpu12", "_ingress_gtpu_options13", "_ingress_gtpu_ext_psc14", "_ingress_vxlan15", "_ingress_inner_ethernet16", "_ingress_inner_eth_type17", "_ingress_inner_ipv418", "_ingress_inner_tcp19", "_ingress_inner_udp20", "_ingress_inner_icmp21"], + "primitives" : [] + } + ], + "meter_arrays" : [ + { + "name" : "FabricIngress.qos.slice_tc_meter", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 104, + "column" : 41, + "source_fragment" : "slice_tc_meter" + }, + "is_direct" : false, + "size" : 64, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.session_meter", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "session_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + }, + { + "name" : "FabricIngress.upf.app_meter", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 23, + "column" : 34, + "source_fragment" : "app_meter" + }, + "is_direct" : false, + "size" : 20000, + "rate_count" : 2, + "type" : "bytes" + } + ], + "counter_arrays" : [ + { + "name" : "FabricIngress.stats.flow_counter", + "id" : 0, + "is_direct" : true, + "binding" : "FabricIngress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 14, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan_counter", + "id" : 1, + "is_direct" : true, + "binding" : "FabricIngress.filtering.ingress_port_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 17, + "column" : 50, + "source_fragment" : "ingress_port_vlan_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier_counter", + "id" : 2, + "is_direct" : true, + "binding" : "FabricIngress.filtering.fwd_classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 71, + "column" : 50, + "source_fragment" : "fwd_classifier_counter" + } + }, + { + "name" : "FabricIngress.filtering.fwd_type_counter", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 78, + "column" : 46, + "source_fragment" : "fwd_type_counter" + }, + "size" : 8, + "is_direct" : false + }, + { + "name" : "FabricIngress.forwarding.bridging_counter", + "id" : 4, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.bridging", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 29, + "column" : 50, + "source_fragment" : "bridging_counter" + } + }, + { + "name" : "FabricIngress.forwarding.mpls_counter", + "id" : 5, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "mpls_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4_counter", + "id" : 6, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v4", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 98, + "column" : 50, + "source_fragment" : "routing_v4_counter" + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6_counter", + "id" : 7, + "is_direct" : true, + "binding" : "FabricIngress.forwarding.routing_v6", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 142, + "column" : 50, + "source_fragment" : "routing_v6_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls_counter", + "id" : 8, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_mpls", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "next_mpls_counter" + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan_counter", + "id" : 9, + "is_direct" : true, + "binding" : "FabricIngress.pre_next.next_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 39, + "column" : 50, + "source_fragment" : "next_vlan_counter" + } + }, + { + "name" : "FabricIngress.acl.acl_counter", + "id" : 10, + "is_direct" : true, + "binding" : "FabricIngress.acl.acl", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 19, + "column" : 50, + "source_fragment" : "acl_counter" + } + }, + { + "name" : "FabricIngress.next.hashed_counter", + "id" : 11, + "is_direct" : true, + "binding" : "FabricIngress.next.hashed", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 115, + "column" : 50, + "source_fragment" : "hashed_counter" + } + }, + { + "name" : "FabricIngress.next.multicast_counter", + "id" : 12, + "is_direct" : true, + "binding" : "FabricIngress.next.multicast", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 148, + "column" : 50, + "source_fragment" : "multicast_counter" + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier_stats", + "id" : 13, + "is_direct" : true, + "binding" : "FabricIngress.slice_tc_classifier.classifier", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 20, + "column" : 40, + "source_fragment" : "classifier_stats" + } + }, + { + "name" : "FabricIngress.qos.queues_stats", + "id" : 14, + "is_direct" : true, + "binding" : "FabricIngress.qos.queues", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 106, + "column" : 40, + "source_fragment" : "queues_stats" + } + }, + { + "name" : "FabricIngress.upf.terminations_counter", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 20, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricIngress.upf.recirc_stats", + "id" : 16, + "is_direct" : true, + "binding" : "FabricIngress.upf.uplink_recirc_rules", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 356, + "column" : 40, + "source_fragment" : "recirc_stats" + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist_counter", + "id" : 17, + "is_direct" : true, + "binding" : "FabricIngress.int_watchlist.watchlist", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 15, + "column" : 50, + "source_fragment" : "watchlist_counter" + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report_counter", + "id" : 18, + "is_direct" : true, + "binding" : "FabricIngress.int_ingress.drop_report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "drop_report_counter" + } + }, + { + "name" : "FabricEgress.stats.flow_counter", + "id" : 19, + "is_direct" : true, + "binding" : "FabricEgress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 47, + "column" : 50, + "source_fragment" : "flow_counter" + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan_counter", + "id" : 20, + "is_direct" : true, + "binding" : "FabricEgress.egress_next.egress_vlan", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 241, + "column" : 50, + "source_fragment" : "egress_vlan_counter" + } + }, + { + "name" : "FabricEgress.upf.terminations_counter", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 477, + "column" : 49, + "source_fragment" : "terminations_counter" + }, + "size" : 4096, + "is_direct" : false + }, + { + "name" : "FabricEgress.int_egress.report_counter", + "id" : 22, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.report", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 131, + "column" : 50, + "source_fragment" : "report_counter" + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata_counter", + "id" : 23, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.int_metadata", + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 132, + "column" : 50, + "source_fragment" : "int_metadata_counter" + } + } + ], + "register_arrays" : [ + { + "name" : "FabricEgress.int_egress.seq_number", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 138, + "column" : 28, + "source_fragment" : "seq_number" + }, + "size" : 1024, + "bitwidth" : 32 + } + ], + "calculations" : [ + { + "name" : "calc", + "id" : 0, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + } + ] + }, + { + "name" : "calc_0", + "id" : 1, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + } + ] + }, + { + "name" : "calc_1", + "id" : 2, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + } + ] + }, + { + "name" : "calc_2", + "id" : 3, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + } + ] + }, + { + "name" : "calc_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_4", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + }, + { + "name" : "calc_5", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_egress_report_ipv427", "version"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ihl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dscp"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ecn"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "total_len"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "identification"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "flags"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "protocol"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "src_addr"] + }, + { + "type" : "field", + "value" : ["_egress_report_ipv427", "dst_addr"] + } + ] + }, + { + "name" : "calc_6", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ] + }, + { + "name" : "calc_7", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "algo" : "csum16", + "input" : [ + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "version"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ihl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dscp"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ecn"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "identification"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "flags"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "frag_offset"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "ttl"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ] + } + ], + "learn_lists" : [], + "actions" : [ + { + "name" : "nop", + "id" : 0, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 1, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 2, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 3, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 4, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 5, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 6, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "NoAction", + "id" : 7, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.stats.count", + "id" : 8, + "runtime_data" : [ + { + "name" : "flow_id", + "bitwidth" : 10 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_stats_flow_id11"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 17, + "column" : 22, + "source_fragment" : "= flow_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pkt_io.do_packet_out", + "id" : 9, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 14, + "column" : 37, + "source_fragment" : "= hdr.packet_out.egress_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 15, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_out0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "hdr.packet_out.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 17, + "column" : 20, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 19, + "column" : 8, + "source_fragment" : "fabric_md.bridged.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "FabricIngress.filtering.deny", + "id" : 10, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 22, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 23, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 100, + "column" : 14, + "source_fragment" : "0x0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x37" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 250, + "column" : 41, + "source_fragment" : "55, ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit", + "id" : 11, + "runtime_data" : [ + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit_with_internal_vlan", + "id" : 12, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + }, + { + "name" : "port_type", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ig_port_type33"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.set_forwarding_type", + "id" : 13, + "runtime_data" : [ + { + "name" : "fwd_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.fwd_type = fwd_type" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 14, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 15, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 16, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_int_drop_reason", + "id" : 17, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason" + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_bridging", + "id" : 18, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.pop_mpls_and_next", + "id" : 19, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 68, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v4", + "id" : 20, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.nop_routing_v4", + "id" : 21, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v4", + "id" : 22, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 111, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 113, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.set_next_id_routing_v6", + "id" : 23, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v6", + "id" : 24, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 150, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 152, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_mpls_label", + "id" : 25, + "runtime_data" : [ + { + "name" : "label", + "bitwidth" : 20 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 18, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = label" + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_vlan", + "id" : 26, + "runtime_data" : [ + { + "name" : "vlan_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 42, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id" + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_next_id_acl", + "id" : 27, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_next_id21"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 22, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 26, + "column" : 28, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 27, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.copy_to_cpu", + "id" : 28, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.punt_to_cpu", + "id" : 29, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 40, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 41, + "column" : 30, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 42, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.drop", + "id" : 30, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 46, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 47, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x50" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 252, + "column" : 27, + "source_fragment" : "80, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_output_port", + "id" : 31, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 62, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t) port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 63, + "column" : 37, + "source_fragment" : "= port_num; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 64, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 65, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 66, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.nop_acl", + "id" : 32, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.next.output_hashed", + "id" : 33, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_hashed", + "id" : 34, + "runtime_data" : [ + { + "name" : "port_num", + "bitwidth" : 9 + }, + { + "name" : "smac", + "bitwidth" : 48 + }, + { + "name" : "dmac", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 23, + "column" : 8, + "source_fragment" : "hdr.ethernet.src_addr = smac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 28, + "column" : 8, + "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 16, + "column" : 8, + "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port48"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 17, + "column" : 37, + "source_fragment" : "= port_num; // Needed by INT. ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.set_mcast_group_id", + "id" : 35, + "runtime_data" : [ + { + "name" : "group_id", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = group_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 152, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = true" + } + } + ] + }, + { + "name" : "FabricIngress.next.reset_mcast_group_id", + "id" : 36, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 157, + "column" : 8, + "source_fragment" : "standard_md.mcast_grp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_is_multicast4"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 158, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.is_multicast = false" + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.set_slice_id_tc", + "id" : 37, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + }, + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 23, + "column" : 27, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 24, + "column" : 21, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.no_classification", + "id" : 38, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 57, + "column" : 36, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 58, + "column" : 24, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 31, + "column" : 29, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.trust_dscp", + "id" : 39, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 38, + "column" : 27, + "source_fragment" : "= hdr.ipv4.dscp[4 +2 -1:2]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 39, + "column" : 21, + "source_fragment" : "= hdr.ipv4.dscp[2 -1:0]; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 40, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_upf", + "id" : 40, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 81, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_default", + "id" : 41, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc27"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 86, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc" + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_queue", + "id" : 42, + "runtime_data" : [ + { + "name" : "qid", + "bitwidth" : 5 + } + ], + "primitives" : [] + }, + { + "name" : "FabricIngress.qos.meter_drop", + "id" : 43, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 115, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0xa0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 269, + "column" : 36, + "source_fragment" : "160, ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_default_tc", + "id" : 44, + "runtime_data" : [ + { + "name" : "tc", + "bitwidth" : 2 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "<<", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x0f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc" + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_access", + "id" : 45, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_core", + "id" : 46, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_dbuf", + "id" : 47, + "runtime_data" : [ + { + "name" : "slice_id", + "bitwidth" : 4 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = false" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_is_upf_hit29"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 86, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 87, + "column" : 31, + "source_fragment" : "= slice_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.iface_miss", + "id" : 48, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 104, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_miss", + "id" : 49, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x86" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 261, + "column" : 38, + "source_fragment" : "134, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session_drop", + "id" : 50, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 136, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x87" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 262, + "column" : 38, + "source_fragment" : "135, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_miss", + "id" : 51, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x84" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 259, + "column" : 38, + "source_fragment" : "132, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_drop", + "id" : 52, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 151, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 260, + "column" : 38, + "source_fragment" : "133, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session", + "id" : 53, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 159, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 161, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 162, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 163, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf", + "id" : 54, + "runtime_data" : [ + { + "name" : "tun_peer_id", + "bitwidth" : 8 + }, + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 167, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 169, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 170, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 171, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.tun_peer_id = tun_peer_id" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 175, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_downlink_session_buf_drop", + "id" : 55, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 182, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.routing_ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x88" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 263, + "column" : 43, + "source_fragment" : "136, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_uplink_session", + "id" : 56, + "runtime_data" : [ + { + "name" : "session_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 190, + "column" : 8, + "source_fragment" : "sess_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 192, + "column" : 8, + "source_fragment" : "ue_session_id = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 193, + "column" : 8, + "source_fragment" : "session_meter_idx_internal = session_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ip_eth_type10"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 62, + "column" : 35, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + }, + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 64, + "column" : 17, + "source_fragment" : "= hdr.inner_ipv4; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 65, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + }, + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 66, + "column" : 16, + "source_fragment" : "= hdr.inner_udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 67, + "column" : 8, + "source_fragment" : "hdr.inner_udp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + }, + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 68, + "column" : 16, + "source_fragment" : "= hdr.inner_tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 69, + "column" : 8, + "source_fragment" : "hdr.inner_tcp.setInvalid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + }, + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 70, + "column" : 17, + "source_fragment" : "= hdr.inner_icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.inner_icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 72, + "column" : 8, + "source_fragment" : "hdr.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 74, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 80, + "column" : 11, + "source_fragment" : "0x0, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop_miss", + "id" : 57, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8b" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 266, + "column" : 42, + "source_fragment" : "139, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop_miss", + "id" : 58, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x89" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 264, + "column" : 42, + "source_fragment" : "137, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.uplink_drop", + "id" : 59, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8c" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 267, + "column" : 42, + "source_fragment" : "140, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_drop", + "id" : 60, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 39, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 40, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 41, + "column" : 28, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x8a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 265, + "column" : 42, + "source_fragment" : "138, ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.app_fwd", + "id" : 61, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.downlink_fwd_encap", + "id" : 62, + "runtime_data" : [ + { + "name" : "ctr_id", + "bitwidth" : 12 + }, + { + "name" : "tc", + "bitwidth" : 2 + }, + { + "name" : "teid", + "bitwidth" : 32 + }, + { + "name" : "qfi", + "bitwidth" : 6 + }, + { + "name" : "app_meter_idx", + "bitwidth" : 15 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 46, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.upf_ctr_id = ctr_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 47, + "column" : 8, + "source_fragment" : "term_hit = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_tc31"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 265, + "column" : 25, + "source_fragment" : "= tc; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 266, + "column" : 8, + "source_fragment" : "app_meter_idx_internal = app_meter_idx; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_tc_unknown28"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 267, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.needs_gtpu_encap = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.teid = teid; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_qfi15"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 56, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.qfi = qfi; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_routing_ipv4_dst", + "id" : 63, + "runtime_data" : [ + { + "name" : "tun_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 314, + "column" : 35, + "source_fragment" : "= tun_dst_addr; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.set_app_id", + "id" : 64, + "runtime_data" : [ + { + "name" : "app_id", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 334, + "column" : 8, + "source_fragment" : "internal_app_id = app_id" + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_allow", + "id" : 65, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 364, + "column" : 29, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_egress_port_set22"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 365, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 366, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 367, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_deny", + "id" : 66, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason23"] + }, + { + "type" : "hexstr", + "value" : "0x96" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 268, + "column" : 41, + "source_fragment" : "150, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 375, + "column" : 29, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 376, + "column" : 34, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 377, + "column" : 28, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.upf.recirc_miss", + "id" : 67, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.int_watchlist.mark_to_report", + "id" : 68, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report", + "id" : 69, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report_collector", + "id" : 70, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_ingress.report_drop", + "id" : 71, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 79, + "column" : 17, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "fabric_v1model64", + "id" : 72, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model61", + "id" : 73, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model70", + "id" : 74, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "lookup_md_init21", + "id" : 75, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "= hdr.vlan_tag.vlan_id; ..." + } + } + ] + }, + { + "name" : "lookup_md_init15", + "id" : 76, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_dst6"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_src7"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 16, + "column" : 23, + "source_fragment" : "= hdr.ethernet.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_eth_type8"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 17, + "column" : 24, + "source_fragment" : "= hdr.eth_type.value; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 19, + "column" : 23, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "lookup_md_init38", + "id" : 77, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 39, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init41", + "id" : 78, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_udp20", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 42, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init44", + "id" : 79, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 45, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init33", + "id" : 80, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 34, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 35, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 36, + "column" : 28, + "source_fragment" : "= hdr.inner_ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init53", + "id" : 81, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_tcp9", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 54, + "column" : 32, + "source_fragment" : "= hdr.tcp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init56", + "id" : 82, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 57, + "column" : 32, + "source_fragment" : "= hdr.udp.dport; ..." + } + } + ] + }, + { + "name" : "lookup_md_init59", + "id" : 83, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "field", + "value" : ["_ingress_icmp11", "icmp_code"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 60, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_code; ..." + } + } + ] + }, + { + "name" : "lookup_md_init48", + "id" : 84, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 49, + "column" : 28, + "source_fragment" : "= hdr.ipv4.src_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 50, + "column" : 28, + "source_fragment" : "= hdr.ipv4.dst_addr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 51, + "column" : 28, + "source_fragment" : "= hdr.ipv4.protocol; ..." + } + } + ] + }, + { + "name" : "lookup_md_init24", + "id" : 85, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 25, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 26, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 27, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 29, + "column" : 24, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 30, + "column" : 25, + "source_fragment" : "= 0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 31, + "column" : 25, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "upf409", + "id" : 86, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 20, + "source_fragment" : "is_uplink = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 410, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_dst; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 411, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_dport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 412, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf418", + "id" : 87, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 419, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 420, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf424", + "id" : 88, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 20, + "source_fragment" : "app_ipv4_addr = fabric_md.lkp.ipv4_src; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 425, + "column" : 20, + "source_fragment" : "app_l4_port = fabric_md.lkp.l4_sport; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 426, + "column" : 20, + "source_fragment" : "app_ip_proto = fabric_md.lkp.ip_proto; ..." + } + } + ] + }, + { + "name" : "upf443", + "id" : 89, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_skip_egress_upf_ctr18"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 16, + "source_fragment" : "fabric_md.bridged.upf.skip_egress_upf_ctr = true" + } + } + ] + }, + { + "name" : "upf448", + "id" : 90, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 44, + "source_fragment" : "(bit<32>) session_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.session_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf445", + "id" : 91, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 36, + "source_fragment" : "(bit<32>) app_meter_idx_internal" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.upf.app_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + } + } + ] + }, + { + "name" : "upf461", + "id" : 92, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "upf25", + "id" : 93, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 26, + "column" : 4, + "source_fragment" : "bool term_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : false + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 27, + "column" : 4, + "source_fragment" : "bool sess_hit = false;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ipv4_addr"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 28, + "column" : 4, + "source_fragment" : "bit<32> app_ipv4_addr = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_l4_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 29, + "column" : 4, + "source_fragment" : "l4_port_t app_l4_port = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_ip_proto"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 30, + "column" : 4, + "source_fragment" : "bit<8> app_ip_proto = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_internal_app_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 55, + "column" : 30, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_ue_session_id"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 32, + "column" : 4, + "source_fragment" : "ue_session_id_t ue_session_id = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_session_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 72, + "column" : 54, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "upf_app_meter_idx_internal"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 73, + "column" : 46, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "filtering100", + "id" : 94, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 31, + "source_fragment" : "(bit<32>)fabric_md.bridged.base.fwd_type" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricIngress.filtering.fwd_type_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + } + } + ] + }, + { + "name" : "hasher28", + "id" : 95, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_tun_peer_id13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 32, + "column" : 52, + "source_fragment" : "fabric_md.bridged" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher39", + "id" : 96, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 17, + "source_fragment" : "hdr.ipv4.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 36, + "source_fragment" : "hdr.ipv4.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 43, + "column" : 55, + "source_fragment" : "hdr.gtpu.teid" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_0" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher50", + "id" : 97, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..." + } + } + ] + }, + { + "name" : "hasher66", + "id" : 98, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.inner_hash = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 17, + "source_fragment" : "hdr.ethernet.dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 40, + "source_fragment" : "hdr.ethernet.src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 71, + "column" : 63, + "source_fragment" : "hdr.eth_type.value" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_1" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher17", + "id" : 99, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_27"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_28"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_29"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_30"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "modify_field_with_hash_based_offset", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + }, + { + "type" : "calculation", + "value" : "calc_2" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "slicing174", + "id" : 100, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_slice_tc12"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 41, + "source_fragment" : "(bit<32>) fabric_md.bridged.base.slice_tc" + } + }, + { + "op" : "execute_meter", + "parameters" : [ + { + "type" : "meter_array", + "value" : "FabricIngress.qos.slice_tc_meter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_31"] + }, + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + } + } + ] + }, + { + "name" : "slicing177", + "id" : 101, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 25, + "column" : 10, + "source_fragment" : "2 ..." + } + } + ] + }, + { + "name" : "int112", + "id" : 102, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_egress_port25"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_queue_id24"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 113, + "column" : 8, + "source_fragment" : "fabric_md.bridged.int_bmd.queue_id = 0" + } + } + ] + }, + { + "name" : "fabric_v1model110", + "id" : 103, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model106", + "id" : 104, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 8, + "source_fragment" : "fabric_md.egress.bridged = fabric_md" + } + } + ] + }, + { + "name" : "nop", + "id" : 105, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 106, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 107, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 108, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 109, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 110, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 111, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.stats.count", + "id" : 112, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.pkt_io_egress.set_switch_info", + "id" : 113, + "runtime_data" : [ + { + "name" : "cpu_port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 36, + "column" : 27, + "source_fragment" : "= (PortId_t)cpu_port; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_mpls_if_present", + "id" : 114, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.mpls.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 200, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.set_mpls", + "id" : 115, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "label"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 206, + "column" : 8, + "source_fragment" : "hdr.mpls.label = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.mpls.tc = 3w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 208, + "column" : 8, + "source_fragment" : "hdr.mpls.bos = 1w1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_ttl8"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 209, + "column" : 8, + "source_fragment" : "hdr.mpls.ttl = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + }, + { + "type" : "hexstr", + "value" : "0x8847" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 112, + "column" : 31, + "source_fragment" : "0x8847; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.push_vlan", + "id" : 116, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 217, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x8100" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 111, + "column" : 31, + "source_fragment" : "0x8100; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "vlan_id"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 221, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.vlan_id = fabric_md.bridged" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.pop_vlan", + "id" : 117, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 249, + "column" : 8, + "source_fragment" : "hdr.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.drop", + "id" : 118, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 254, + "column" : 17, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x82" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 257, + "column" : 35, + "source_fragment" : "130, ..." + } + } + ] + }, + { + "name" : "FabricEgress.dscp_rewriter.rewrite", + "id" : 119, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.dscp_rewriter.clear", + "id" : 120, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "tmp_dscp = 0" + } + } + ] + }, + { + "name" : "FabricEgress.upf.load_tunnel_params", + "id" : 121, + "runtime_data" : [ + { + "name" : "tunnel_src_port", + "bitwidth" : 16 + }, + { + "name" : "tunnel_src_addr", + "bitwidth" : 32 + }, + { + "name" : "tunnel_dst_addr", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 486, + "column" : 8, + "source_fragment" : "hdr.ipv4.src_addr = tunnel_src_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 487, + "column" : 8, + "source_fragment" : "hdr.ipv4.dst_addr = tunnel_dst_addr" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "sport"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 488, + "column" : 8, + "source_fragment" : "hdr.udp.sport = tunnel_src_port" + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_only", + "id" : 122, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0024" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 563, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0010" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 565, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 567, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = hdr.inner_ipv4.total_len" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 81, + "column" : 16, + "source_fragment" : "0x1, ..." + } + } + ] + }, + { + "name" : "FabricEgress.upf.gtpu_with_psc", + "id" : 123, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 577, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 578, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 551, + "column" : 8, + "source_fragment" : "hdr.inner_ipv4.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ipv418" + }, + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 552, + "column" : 23, + "source_fragment" : "= hdr.ipv4; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 553, + "column" : 8, + "source_fragment" : "hdr.udp.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 554, + "column" : 8, + "source_fragment" : "hdr.gtpu.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 506, + "column" : 8, + "source_fragment" : "hdr.ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 507, + "column" : 8, + "source_fragment" : "hdr.ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 508, + "column" : 8, + "source_fragment" : "hdr.ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 509, + "column" : 8, + "source_fragment" : "hdr.ipv4.ecn = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x1513" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 511, + "column" : 8, + "source_fragment" : "hdr.ipv4.identification = 0x1513" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 512, + "column" : 8, + "source_fragment" : "hdr.ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 513, + "column" : 8, + "source_fragment" : "hdr.ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "dport"] + }, + { + "type" : "hexstr", + "value" : "0x0868" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 86, + "column" : 30, + "source_fragment" : "2152; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "version"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 87, + "column" : 22, + "source_fragment" : "3w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "pt"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 89, + "column" : 37, + "source_fragment" : "1w1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "spare"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 527, + "column" : 8, + "source_fragment" : "hdr.gtpu.spare = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "seq_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 529, + "column" : 8, + "source_fragment" : "hdr.gtpu.seq_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "npdu_flag"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 530, + "column" : 8, + "source_fragment" : "hdr.gtpu.npdu_flag = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msgtype"] + }, + { + "type" : "hexstr", + "value" : "0xff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 88, + "column" : 25, + "source_fragment" : "0xff; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_teid19"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 533, + "column" : 8, + "source_fragment" : "hdr.gtpu.teid = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "seq_num"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 535, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.seq_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "n_pdu_num"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 536, + "column" : 8, + "source_fragment" : "hdr.gtpu_options.n_pdu_num = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_options13", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x85" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 91, + "column" : 33, + "source_fragment" : "0x85; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "len"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 94, + "column" : 32, + "source_fragment" : "8w1; // 1*4-octets ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 92, + "column" : 36, + "source_fragment" : "4w0; // Downlink ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "spare0"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 541, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.spare0 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "ppp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 542, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.ppp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "rqi"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 543, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.rqi = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "next_ext"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 90, + "column" : 34, + "source_fragment" : "0x0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x002c" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 580, + "column" : 8, + "source_fragment" : "hdr.ipv4.total_len = 20 + 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0018" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 583, + "column" : 8, + "source_fragment" : "hdr.udp.len = 8 + 8 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "msglen"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "hexstr", + "value" : "0x0008" + }, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "total_len"] + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 586, + "column" : 8, + "source_fragment" : "hdr.gtpu.msglen = 4 + 4 ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu12", "ex_flag"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 588, + "column" : 8, + "source_fragment" : "hdr.gtpu.ex_flag = 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_gtpu_ext_psc14", "qfi"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_qfi15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 589, + "column" : 8, + "source_fragment" : "hdr.gtpu_ext_psc.qfi = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 82, + "column" : 20, + "source_fragment" : "0x2, ..." + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 124, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 125, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 79, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 85, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 93, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md39", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 94, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 97, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 99, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 101, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 102, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 103, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 126, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_report_mirror", + "id" : 127, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "hdr.report_ethernet.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 25, + "column" : 8, + "source_fragment" : "hdr.report_eth_type.setValid()" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 37, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "version"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.version = 4w4" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ihl"] + }, + { + "type" : "hexstr", + "value" : "0x05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 39, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ihl = 4w5" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 40, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dscp = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ecn"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 41, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.ecn = 2w0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "flags"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 44, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.flags = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 45, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.frag_offset = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 150, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_ipv4", "protocol"] + }, + { + "type" : "hexstr", + "value" : "0x11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 134, + "column" : 25, + "source_fragment" : "17; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 53, + "column" : 8, + "source_fragment" : "hdr.report_udp.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_udp", "sport"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 54, + "column" : 8, + "source_fragment" : "hdr.report_udp.sport = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 60, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ver"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ver = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 66, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.rsvd = 0" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 71, + "column" : 8, + "source_fragment" : "hdr.common_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 110, + "column" : 8, + "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_vlan_id6"] + }, + { + "type" : "hexstr", + "value" : "0x0ffe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 147, + "column" : 34, + "source_fragment" : "12w4094; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + { + "type" : "hexstr", + "value" : "0x000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 112, + "column" : 8, + "source_fragment" : "fabric_md.bridged.base.mpls_label = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 114, + "column" : 12, + "source_fragment" : "fabric_md.bridged.upf.skip_upf = true" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 118, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "ig_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 121, + "column" : 8, + "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "eg_port"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 122, + "column" : 8, + "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_common_report_header", "queue_id"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 123, + "column" : 8, + "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id" + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 126, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 127, + "column" : 8, + "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md39", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 128, + "column" : 8, + "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.check_quota", + "id" : 128, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.reset_quota", + "id" : 129, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.set_config", + "id" : 130, + "runtime_data" : [ + { + "name" : "hop_latency_mask", + "bitwidth" : 32 + }, + { + "name" : "timestamp_mask", + "bitwidth" : 48 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 179, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 180, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap", + "id" : 131, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_32"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_33"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_local_report_encap_mpls", + "id" : 132, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_34"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 203, + "column" : 52, + "source_fragment" : "2; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 218, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 226, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 227, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 228, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 230, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap", + "id" : 133, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_36"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_37"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.do_drop_report_encap_mpls", + "id" : 134, + "runtime_data" : [ + { + "name" : "src_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_ip", + "bitwidth" : 32 + }, + { + "name" : "mon_port", + "bitwidth" : 16 + }, + { + "name" : "mon_label", + "bitwidth" : 20 + }, + { + "name" : "switch_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "modify_field_rng_uniform", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "identification"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + }, + { + "type" : "hexstr", + "value" : "0xffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 195, + "column" : 8, + "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "src_addr"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 197, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_ipv4", "dst_addr"] + }, + { + "type" : "runtime_data", + "value" : 1 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_udp", "dport"] + }, + { + "type" : "runtime_data", + "value" : 2 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 199, + "column" : 8, + "source_fragment" : "hdr.report_udp.dport = mon_port; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_read", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_38"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 143, + "column" : 8, + "source_fragment" : "seq_number.read(reg, seq_number_idx)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000001" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 144, + "column" : 8, + "source_fragment" : "reg = reg + 1" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 200, + "column" : 23, + "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id" + } + }, + { + "op" : "register_write", + "parameters" : [ + { + "type" : "register_array", + "value" : "FabricEgress.int_egress.seq_number" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_39"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 146, + "column" : 8, + "source_fragment" : "seq_number.write(seq_number_idx, reg)" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "seq_no"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ] + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "dqf"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 201, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "switch_id"] + }, + { + "type" : "runtime_data", + "value" : 4 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 202, + "column" : 8, + "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad1"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 203, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad1 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 204, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad2 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_common_report_header", "pad3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 205, + "column" : 8, + "source_fragment" : "hdr.common_report_header.pad3 = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_eth_type", "value"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 207, + "column" : 8, + "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 178, + "column" : 14, + "source_fragment" : "0, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 125, + "column" : 39, + "source_fragment" : "0xBF04; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "nproto"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 202, + "column" : 44, + "source_fragment" : "1; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 238, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.setValid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 241, + "column" : 8, + "source_fragment" : "hdr.local_report_header.setInvalid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_drop_report_header", "drop_reason"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason23"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 243, + "column" : 8, + "source_fragment" : "hdr.drop_report_header.drop_reason =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_eth_type", "value"] + }, + { + "type" : "hexstr", + "value" : "0xbf05" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 126, + "column" : 39, + "source_fragment" : "0xBF05; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 251, + "column" : 8, + "source_fragment" : "hdr.report_mpls.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "tc"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 252, + "column" : 8, + "source_fragment" : "hdr.report_mpls.tc = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "bos"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 253, + "column" : 8, + "source_fragment" : "hdr.report_mpls.bos = 0" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "ttl"] + }, + { + "type" : "hexstr", + "value" : "0x40" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 149, + "column" : 32, + "source_fragment" : "64; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_mpls", "label"] + }, + { + "type" : "runtime_data", + "value" : 3 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 256, + "column" : 8, + "source_fragment" : "hdr.report_mpls.label = mon_label" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.init_int_metadata", + "id" : 135, + "runtime_data" : [ + { + "name" : "report_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + { + "type" : "hexstr", + "value" : "0x01fa" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 208, + "column" : 43, + "source_fragment" : "0x1FA; ..." + } + }, + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 293, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._int_mirror_type3"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 167, + "column" : 20, + "source_fragment" : "2, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 179, + "column" : 17, + "source_fragment" : "1, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_port"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_port3"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 299, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_port =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_port"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 300, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_id"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 301, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_id = egress_qid" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "queue_occupancy"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "deq_qdepth"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 302, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ig_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 303, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "eg_tstamp"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 304, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ip_eth_type10"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 305, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.ip_eth_type =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "flow_hash"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 306, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.flow_hash =" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "report_type"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 309, + "column" : 8, + "source_fragment" : "fabric_md.int_report_md.report_type = report_type" + } + } + ] + }, + { + "name" : "FabricEgress.int_egress.adjust_ip_udp_len", + "id" : 136, + "runtime_data" : [ + { + "name" : "adjust_ip", + "bitwidth" : 16 + }, + { + "name" : "adjust_udp", + "bitwidth" : 16 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "total_len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 0 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 342, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_udp10", "len"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + "right" : { + "type" : "local", + "value" : 1 + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 343, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp" + } + } + ] + }, + { + "name" : "fabric_v1model136", + "id" : 137, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model133", + "id" : 138, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 8, + "source_fragment" : "fabric_md.egress.cpu_port = 0" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148", + "id" : 139, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14", + "id" : 140, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason23"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 144, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 145, + "column" : 12, + "source_fragment" : "fabric_md.egress.bridged.int_bmd.report_type = fabric_md" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166", + "id" : 141, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x3" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169", + "id" : 142, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173", + "id" : 143, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "int_tna_parser_emulator148_0", + "id" : 144, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 149, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 150, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 151, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vxlan15" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 153, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_ethernet16" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 154, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_eth_type17" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 155, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu12" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 157, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_options13" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 158, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()" + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_gtpu_ext_psc14" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 159, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator14_0", + "id" : 145, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + }, + { + "type" : "header", + "value" : "_egress_report_ethernet24" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 134, + "column" : 32, + "source_fragment" : "= true; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 140, + "column" : 8, + "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator166_0", + "id" : 146, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator169_0", + "id" : 147, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + } + } + ] + }, + { + "name" : "int_tna_parser_emulator173_0", + "id" : 148, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ethernet24" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "parser_emulator_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "packetio51", + "id" : 149, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_in1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid()" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_packet_in1", "ingress_port"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port50"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 52, + "column" : 12, + "source_fragment" : "hdr.packet_in.ingress_port = preserved_ig_port; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_fake_ethernet2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 53, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.setInvalid()" + } + }, + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 54, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "packetio60", + "id" : 150, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "packet_length"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x0000ffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xfff2" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "= (bit<16>)standard_md.packet_length - 14; ..." + } + } + ] + }, + { + "name" : "next283", + "id" : 151, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 285, + "column" : 21, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "next325", + "id" : 152, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x83" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 258, + "column" : 32, + "source_fragment" : "131, ..." + } + } + ] + }, + { + "name" : "next323", + "id" : 153, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 12, + "source_fragment" : "hdr.mpls.ttl = hdr.mpls.ttl - 1" + } + } + ] + }, + { + "name" : "next333", + "id" : 154, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1" + } + } + ] + }, + { + "name" : "next336", + "id" : 155, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "next343", + "id" : 156, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "+", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1" + } + } + ] + }, + { + "name" : "next346", + "id" : 157, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason49"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "upf610", + "id" : 158, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_udp20" + }, + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 611, + "column" : 34, + "source_fragment" : "= hdr.udp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_udp10" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 612, + "column" : 20, + "source_fragment" : "hdr.udp.setInvalid()" + } + } + ] + }, + { + "name" : "upf615", + "id" : 159, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_tcp19" + }, + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 616, + "column" : 34, + "source_fragment" : "= hdr.tcp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_tcp9" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 617, + "column" : 20, + "source_fragment" : "hdr.tcp.setInvalid()" + } + } + ] + }, + { + "name" : "upf620", + "id" : 160, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid()" + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_inner_icmp21" + }, + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 621, + "column" : 35, + "source_fragment" : "= hdr.icmp; ..." + } + }, + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_icmp11" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 622, + "column" : 20, + "source_fragment" : "hdr.icmp.setInvalid()" + } + } + ] + }, + { + "name" : "upf628", + "id" : 161, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_upf_ctr_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 43, + "source_fragment" : "(bit<32>)fabric_md.bridged.upf.upf_ctr_id" + } + }, + { + "op" : "count", + "parameters" : [ + { + "type" : "counter_array", + "value" : "FabricEgress.upf.terminations_counter" + }, + { + "type" : "field", + "value" : ["scalars", "tmp_40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + } + } + ] + }, + { + "name" : "int128", + "id" : 162, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + }, + { + "type" : "header", + "value" : "_egress_report_eth_type25" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + }, + { + "type" : "header", + "value" : "_egress_report_mpls26" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + }, + { + "type" : "header", + "value" : "_egress_report_ipv427" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + }, + { + "type" : "header", + "value" : "_egress_report_udp28" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + }, + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + }, + { + "type" : "header", + "value" : "_egress_common_report_header30" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + }, + { + "type" : "header", + "value" : "_egress_local_report_header31" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + }, + { + "type" : "header", + "value" : "_egress_drop_report_header32" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + }, + { + "type" : "header", + "value" : "_egress_eth_type35" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + }, + { + "type" : "header", + "value" : "_egress_bridged36" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + }, + { + "type" : "header", + "value" : "_egress_int_report_md39" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "vlan_stripped"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_vlan_stripped42"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "queue_report"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_queue_report43"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_fabric_md_pkt_length"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length46"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 129, + "column" : 4, + "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "int_egress_egress_qid"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 135, + "column" : 4, + "source_fragment" : "QueueId_t egress_qid = 0;" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 365, + "column" : 8, + "source_fragment" : "fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 366, + "column" : 8, + "source_fragment" : "fabric_md.int_md.timestamp = standard_md.egress_global_timestamp" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_0"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x10" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 166, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[31:16]: range @name(\\\"hop_latency_upper\\\");" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "key_1"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "-", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_global_timestamp"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0xffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 167, + "column" : 12, + "source_fragment" : " fabric_md.int_md.hop_latency[15:0]: range @name(\\\"hop_latency_lower\\\");" + } + } + ] + }, + { + "name" : "int383", + "id" : 163, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id22"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 384, + "column" : 20, + "source_fragment" : "(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id" + } + }, + { + "op" : "clone_egress_pkt_to_egress", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_41"] + }, + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + } + } + ] + }, + { + "name" : "int373", + "id" : 164, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_hdr_report_fixed_header", "hw_id"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "|", + "left" : { + "type" : "hexstr", + "value" : "0x00" + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "expression", + "value" : { + "op" : ">>", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x7" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x01ff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x3f" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x07" + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 8, + "source_fragment" : "hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]" + } + } + ] + }, + { + "name" : "slicing217", + "id" : 165, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_ipv47", "dscp"] + }, + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 16, + "source_fragment" : "hdr.ipv4.dscp = tmp_dscp" + } + } + ] + }, + { + "name" : "slicing189", + "id" : 166, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_bridged" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_int_report_md39" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_hop_latency40"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_int_md_timestamp41"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 391, + "column" : 30, + "source_fragment" : "= fabric_md; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_eth_type25" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_mpls26" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_mpls" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_ipv427" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_ipv4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_udp28" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_udp" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_report_fixed_header29" + }, + { + "type" : "header", + "value" : "int_egress_hdr_report_fixed_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_common_report_header30" + }, + { + "type" : "header", + "value" : "int_egress_hdr_common_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_local_report_header31" + }, + { + "type" : "header", + "value" : "int_egress_hdr_local_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_drop_report_header32" + }, + { + "type" : "header", + "value" : "int_egress_hdr_drop_report_header" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_eth_type35" + }, + { + "type" : "header", + "value" : "int_egress_hdr_eth_type" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 392, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_slice_tc12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;" + } + } + ] + }, + { + "name" : "fabric_v1model170", + "id" : 167, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x5" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "fabric_v1model174", + "id" : 168, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + } + ], + "pipelines" : [ + { + "name" : "ingress", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 35, + "column" : 8, + "source_fragment" : "FabricIngress" + }, + "init_table" : "tbl_fabric_v1model61", + "tables" : [ + { + "name" : "tbl_fabric_v1model61", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [73], + "actions" : ["fabric_v1model61"], + "base_default_next" : "node_3", + "next_tables" : { + "fabric_v1model61" : "node_3" + }, + "default_entry" : { + "action_id" : 73, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model64", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [72], + "actions" : ["fabric_v1model64"], + "base_default_next" : "node_5", + "next_tables" : { + "fabric_v1model64" : "node_5" + }, + "default_entry" : { + "action_id" : 72, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model70", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 70, + "column" : 51, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [74], + "actions" : ["fabric_v1model70"], + "base_default_next" : "tbl_lookup_md_init15", + "next_tables" : { + "fabric_v1model70" : "tbl_lookup_md_init15" + }, + "default_entry" : { + "action_id" : 74, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init15", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 15, + "column" : 23, + "source_fragment" : "= hdr.ethernet.dst_addr; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [76], + "actions" : ["lookup_md_init15"], + "base_default_next" : "node_8", + "next_tables" : { + "lookup_md_init15" : "node_8" + }, + "default_entry" : { + "action_id" : 76, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init21", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 21, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [75], + "actions" : ["lookup_md_init21"], + "base_default_next" : "tbl_lookup_md_init24", + "next_tables" : { + "lookup_md_init21" : "tbl_lookup_md_init24" + }, + "default_entry" : { + "action_id" : 75, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init24", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 24, + "column" : 23, + "source_fragment" : "= false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [85], + "actions" : ["lookup_md_init24"], + "base_default_next" : "node_11", + "next_tables" : { + "lookup_md_init24" : "node_11" + }, + "default_entry" : { + "action_id" : 85, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init33", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 33, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [80], + "actions" : ["lookup_md_init33"], + "base_default_next" : "node_13", + "next_tables" : { + "lookup_md_init33" : "node_13" + }, + "default_entry" : { + "action_id" : 80, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init38", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 38, + "column" : 32, + "source_fragment" : "= hdr.inner_tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [77], + "actions" : ["lookup_md_init38"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init38" : "node_27" + }, + "default_entry" : { + "action_id" : 77, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init41", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 41, + "column" : 32, + "source_fragment" : "= hdr.inner_udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [78], + "actions" : ["lookup_md_init41"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init41" : "node_27" + }, + "default_entry" : { + "action_id" : 78, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init44", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 44, + "column" : 33, + "source_fragment" : "= hdr.inner_icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [79], + "actions" : ["lookup_md_init44"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init44" : "node_27" + }, + "default_entry" : { + "action_id" : 79, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init48", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 48, + "column" : 27, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [84], + "actions" : ["lookup_md_init48"], + "base_default_next" : "node_21", + "next_tables" : { + "lookup_md_init48" : "node_21" + }, + "default_entry" : { + "action_id" : 84, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init53", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 53, + "column" : 32, + "source_fragment" : "= hdr.tcp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [81], + "actions" : ["lookup_md_init53"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init53" : "node_27" + }, + "default_entry" : { + "action_id" : 81, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init56", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 56, + "column" : 32, + "source_fragment" : "= hdr.udp.sport; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [82], + "actions" : ["lookup_md_init56"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init56" : "node_27" + }, + "default_entry" : { + "action_id" : 82, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init59", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 59, + "column" : 33, + "source_fragment" : "= hdr.icmp.icmp_type; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [83], + "actions" : ["lookup_md_init59"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init59" : "node_27" + }, + "default_entry" : { + "action_id" : 83, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_pkt_io_do_packet_out", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 25, + "column" : 12, + "source_fragment" : "do_packet_out()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [9], + "actions" : ["FabricIngress.pkt_io.do_packet_out"], + "base_default_next" : "FabricIngress.int_watchlist.watchlist", + "next_tables" : { + "FabricIngress.pkt_io.do_packet_out" : "FabricIngress.int_watchlist.watchlist" + }, + "default_entry" : { + "action_id" : 9, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 34, + "column" : 10, + "source_fragment" : "watchlist" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ipv4_valid", + "target" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [68, 70, 69], + "actions" : ["FabricIngress.int_watchlist.mark_to_report", "FabricIngress.int_watchlist.no_report_collector", "FabricIngress.int_watchlist.no_report"], + "base_default_next" : "FabricIngress.stats.flows", + "next_tables" : { + "FabricIngress.int_watchlist.mark_to_report" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report_collector" : "FabricIngress.stats.flows", + "FabricIngress.int_watchlist.no_report" : "FabricIngress.stats.flows" + }, + "default_entry" : { + "action_id" : 69, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.stats.flows", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 21, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [8], + "actions" : ["FabricIngress.stats.count"], + "base_default_next" : "FabricIngress.slice_tc_classifier.classifier", + "next_tables" : { + "FabricIngress.stats.count" : "FabricIngress.slice_tc_classifier.classifier" + }, + "default_entry" : { + "action_id" : 8, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 44, + "column" : 10, + "source_fragment" : "classifier" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 512, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [37, 39, 38], + "actions" : ["FabricIngress.slice_tc_classifier.set_slice_id_tc", "FabricIngress.slice_tc_classifier.trust_dscp", "FabricIngress.slice_tc_classifier.no_classification"], + "base_default_next" : "FabricIngress.filtering.ingress_port_vlan", + "next_tables" : { + "FabricIngress.slice_tc_classifier.set_slice_id_tc" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.trust_dscp" : "FabricIngress.filtering.ingress_port_vlan", + "FabricIngress.slice_tc_classifier.no_classification" : "FabricIngress.filtering.ingress_port_vlan" + }, + "default_entry" : { + "action_id" : 38, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 42, + "column" : 10, + "source_fragment" : "ingress_port_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "vlan_is_valid", + "target" : ["_ingress_vlan_tag4", "$valid$"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["_ingress_vlan_tag4", "vlan_id"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [10, 11, 12], + "actions" : ["FabricIngress.filtering.deny", "FabricIngress.filtering.permit", "FabricIngress.filtering.permit_with_internal_vlan"], + "base_default_next" : "FabricIngress.filtering.fwd_classifier", + "next_tables" : { + "FabricIngress.filtering.deny" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit" : "FabricIngress.filtering.fwd_classifier", + "FabricIngress.filtering.permit_with_internal_vlan" : "FabricIngress.filtering.fwd_classifier" + }, + "default_entry" : { + "action_id" : 10, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 80, + "column" : 10, + "source_fragment" : "fwd_classifier" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["_ingress_eth_type5", "value"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "ip_eth_type", + "target" : ["_ingress_bridged4", "_base_ip_eth_type10"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [13], + "actions" : ["FabricIngress.filtering.set_forwarding_type"], + "base_default_next" : "tbl_filtering100", + "next_tables" : { + "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100" + }, + "default_entry" : { + "action_id" : 13, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_filtering100", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 100, + "column" : 8, + "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [94], + "actions" : ["filtering100"], + "base_default_next" : "node_35", + "next_tables" : { + "filtering100" : "node_35" + }, + "default_entry" : { + "action_id" : 94, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf25", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 25, + "column" : 4, + "source_fragment" : "bool is_uplink = false; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [93], + "actions" : ["upf25"], + "base_default_next" : "node_37", + "next_tables" : { + "upf25" : "node_37" + }, + "default_entry" : { + "action_id" : 93, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.interfaces", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 107, + "column" : 10, + "source_fragment" : "interfaces" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst_addr", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "gtpu_is_valid", + "target" : ["_ingress_gtpu12", "$valid$"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 64, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [45, 46, 47, 48], + "actions" : ["FabricIngress.upf.iface_access", "FabricIngress.upf.iface_core", "FabricIngress.upf.iface_dbuf", "FabricIngress.upf.iface_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.iface_access" : "tbl_upf409", + "FabricIngress.upf.iface_core" : "tbl_upf418", + "FabricIngress.upf.iface_dbuf" : "tbl_upf424", + "FabricIngress.upf.iface_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 48, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf409", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 409, + "column" : 30, + "source_fragment" : "= true; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [86], + "actions" : ["upf409"], + "base_default_next" : "node_40", + "next_tables" : { + "upf409" : "node_40" + }, + "default_entry" : { + "action_id" : 86, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_sessions", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 213, + "column" : 10, + "source_fragment" : "uplink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tunnel_ipv4_dst", + "target" : ["_ingress_ipv47", "dst_addr"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "teid", + "target" : ["_ingress_gtpu12", "teid"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [56, 50, 49], + "actions" : ["FabricIngress.upf.set_uplink_session", "FabricIngress.upf.set_uplink_session_drop", "FabricIngress.upf.set_uplink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_uplink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_uplink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 49, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf418", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 418, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [87], + "actions" : ["upf418"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf418" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 87, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_sessions", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 198, + "column" : 10, + "source_fragment" : "downlink_sessions" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_addr", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [53, 54, 55, 52, 51], + "actions" : ["FabricIngress.upf.set_downlink_session", "FabricIngress.upf.set_downlink_session_buf", "FabricIngress.upf.set_downlink_session_buf_drop", "FabricIngress.upf.set_downlink_session_drop", "FabricIngress.upf.set_downlink_session_miss"], + "base_default_next" : "FabricIngress.upf.applications", + "next_tables" : { + "FabricIngress.upf.set_downlink_session" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_buf_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_drop" : "FabricIngress.upf.applications", + "FabricIngress.upf.set_downlink_session_miss" : "FabricIngress.upf.applications" + }, + "default_entry" : { + "action_id" : 51, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf424", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 424, + "column" : 34, + "source_fragment" : "= fabric_md.lkp.ipv4_src; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [88], + "actions" : ["upf424"], + "base_default_next" : "FabricIngress.upf.downlink_sessions", + "next_tables" : { + "upf424" : "FabricIngress.upf.downlink_sessions" + }, + "default_entry" : { + "action_id" : 88, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.applications", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 337, + "column" : 10, + "source_fragment" : "applications" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_id", + "target" : ["scalars", "userMetadata._ingress_upf_slice_id30"], + "mask" : null + }, + { + "match_type" : "lpm", + "name" : "app_ipv4_addr", + "target" : ["scalars", "upf_app_ipv4_addr"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "app_l4_port", + "target" : ["scalars", "upf_app_l4_port"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "app_ip_proto", + "target" : ["scalars", "upf_app_ip_proto"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 5, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [64, 5], + "actions" : ["FabricIngress.upf.set_app_id", "nop"], + "base_default_next" : "node_47", + "next_tables" : { + "FabricIngress.upf.set_app_id" : "node_47", + "nop" : "node_47" + }, + "default_entry" : { + "action_id" : 5, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_terminations", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 280, + "column" : 10, + "source_fragment" : "uplink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [61, 59, 57], + "actions" : ["FabricIngress.upf.app_fwd", "FabricIngress.upf.uplink_drop", "FabricIngress.upf.uplink_drop_miss"], + "base_default_next" : "FabricIngress.upf.uplink_recirc_rules", + "next_tables" : { + "FabricIngress.upf.app_fwd" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop" : "FabricIngress.upf.uplink_recirc_rules", + "FabricIngress.upf.uplink_drop_miss" : "FabricIngress.upf.uplink_recirc_rules" + }, + "default_entry" : { + "action_id" : 57, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.uplink_recirc_rules", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 387, + "column" : 10, + "source_fragment" : "uplink_recirc_rules" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 64, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [65, 66, 67], + "actions" : ["FabricIngress.upf.recirc_allow", "FabricIngress.upf.recirc_deny", "FabricIngress.upf.recirc_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.recirc_allow" : "tbl_upf445", + "FabricIngress.upf.recirc_deny" : "tbl_upf445", + "FabricIngress.upf.recirc_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 67, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.downlink_terminations", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 295, + "column" : 10, + "source_fragment" : "downlink_terminations" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "ue_session_id", + "target" : ["scalars", "upf_ue_session_id"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "app_id", + "target" : ["scalars", "upf_internal_app_id"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 100000, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [62, 60, 58], + "actions" : ["FabricIngress.upf.downlink_fwd_encap", "FabricIngress.upf.downlink_drop", "FabricIngress.upf.downlink_drop_miss"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "FabricIngress.upf.downlink_fwd_encap" : "tbl_upf445", + "FabricIngress.upf.downlink_drop" : "tbl_upf445", + "FabricIngress.upf.downlink_drop_miss" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 58, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf443", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 443, + "column" : 58, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [89], + "actions" : ["upf443"], + "base_default_next" : "tbl_upf445", + "next_tables" : { + "upf443" : "tbl_upf445" + }, + "default_entry" : { + "action_id" : 89, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf445", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 445, + "column" : 12, + "source_fragment" : "app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [91], + "actions" : ["upf445"], + "base_default_next" : "node_54", + "next_tables" : { + "upf445" : "node_54" + }, + "default_entry" : { + "action_id" : 91, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf448", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 448, + "column" : 16, + "source_fragment" : "session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [90], + "actions" : ["upf448"], + "base_default_next" : "FabricIngress.upf.ig_tunnel_peers", + "next_tables" : { + "upf448" : "FabricIngress.upf.ig_tunnel_peers" + }, + "default_entry" : { + "action_id" : 90, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.upf.ig_tunnel_peers", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 317, + "column" : 10, + "source_fragment" : "ig_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_ingress_bridged4", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [63, 4], + "actions" : ["FabricIngress.upf.set_routing_ipv4_dst", "nop"], + "base_default_next" : "node_57", + "next_tables" : { + "FabricIngress.upf.set_routing_ipv4_dst" : "node_57", + "nop" : "node_57" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf461", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 461, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [92], + "actions" : ["upf461"], + "base_default_next" : "node_59", + "next_tables" : { + "upf461" : "node_59" + }, + "default_entry" : { + "action_id" : 92, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.bridging", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "bridging" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_ingress_bridged4", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [18, 14], + "actions" : ["FabricIngress.forwarding.set_next_id_bridging", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_bridging" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 14, + "action_const" : true, + "action_data" : ["0x59"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.mpls", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "mpls_label", + "target" : ["_ingress_bridged4", "_base_mpls_label2"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [19, 15], + "actions" : ["FabricIngress.forwarding.pop_mpls_and_next", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.pop_mpls_and_next" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 15, + "action_const" : true, + "action_data" : ["0x81"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 116, + "column" : 10, + "source_fragment" : "routing_v4" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [20, 21, 22, 16], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v4", "FabricIngress.forwarding.nop_routing_v4", "FabricIngress.forwarding.drop_routing_v4", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.nop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v4" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 16, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 155, + "column" : 10, + "source_fragment" : "routing_v6" + }, + "key" : [ + { + "match_type" : "lpm", + "name" : "ipv6_dst", + "target" : ["_ingress_ipv68", "dst_addr"], + "mask" : null + } + ], + "match_type" : "lpm", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [23, 24, 17], + "actions" : ["FabricIngress.forwarding.set_next_id_routing_v6", "FabricIngress.forwarding.drop_routing_v6", "FabricIngress.forwarding.set_int_drop_reason"], + "base_default_next" : "tbl_hasher17", + "next_tables" : { + "FabricIngress.forwarding.set_next_id_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.drop_routing_v6" : "tbl_hasher17", + "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17" + }, + "default_entry" : { + "action_id" : 17, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_hasher17", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [99], + "actions" : ["hasher17"], + "base_default_next" : "node_69", + "next_tables" : { + "hasher17" : "node_69" + }, + "default_entry" : { + "action_id" : 99, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher28", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 28, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [95], + "actions" : ["hasher28"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher28" : "node_76" + }, + "default_entry" : { + "action_id" : 95, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher39", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [96], + "actions" : ["hasher39"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher39" : "node_76" + }, + "default_entry" : { + "action_id" : 96, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher50", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [97], + "actions" : ["hasher50"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher50" : "node_76" + }, + "default_entry" : { + "action_id" : 97, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher66", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 66, + "column" : 46, + "source_fragment" : "= 0; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [98], + "actions" : ["hasher66"], + "base_default_next" : "node_76", + "next_tables" : { + "hasher66" : "node_76" + }, + "default_entry" : { + "action_id" : 98, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 22, + "column" : 10, + "source_fragment" : "next_mpls" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [25, 0], + "actions" : ["FabricIngress.pre_next.set_mpls_label", "nop"], + "base_default_next" : "FabricIngress.pre_next.next_vlan", + "next_tables" : { + "FabricIngress.pre_next.set_mpls_label" : "FabricIngress.pre_next.next_vlan", + "nop" : "FabricIngress.pre_next.next_vlan" + }, + "default_entry" : { + "action_id" : 0, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_vlan", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4", + "line" : 54, + "column" : 10, + "source_fragment" : "next_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [26, 1], + "actions" : ["FabricIngress.pre_next.set_vlan", "nop"], + "base_default_next" : "FabricIngress.acl.acl", + "next_tables" : { + "FabricIngress.pre_next.set_vlan" : "FabricIngress.acl.acl", + "nop" : "FabricIngress.acl.acl" + }, + "default_entry" : { + "action_id" : 1, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.acl.acl", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 74, + "column" : 10, + "source_fragment" : "acl" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "ig_port", + "target" : ["_ingress_bridged4", "_base_ig_port3"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_dst", + "target" : ["_ingress_ethernet3", "dst_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_src", + "target" : ["_ingress_ethernet3", "src_addr"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "vlan_id", + "target" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "eth_type", + "target" : ["scalars", "userMetadata._ingress_lkp_eth_type8"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_src", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ipv4_dst", + "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ip_proto", + "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_type", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "icmp_code", + "target" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_sport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "l4_dport", + "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "ig_port_type", + "target" : ["scalars", "userMetadata._ingress_ig_port_type33"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [27, 29, 28, 30, 31, 32], + "actions" : ["FabricIngress.acl.set_next_id_acl", "FabricIngress.acl.punt_to_cpu", "FabricIngress.acl.copy_to_cpu", "FabricIngress.acl.drop", "FabricIngress.acl.set_output_port", "FabricIngress.acl.nop_acl"], + "base_default_next" : "node_80", + "next_tables" : { + "FabricIngress.acl.set_next_id_acl" : "node_80", + "FabricIngress.acl.punt_to_cpu" : "node_80", + "FabricIngress.acl.copy_to_cpu" : "node_80", + "FabricIngress.acl.drop" : "node_80", + "FabricIngress.acl.set_output_port" : "node_80", + "FabricIngress.acl.nop_acl" : "node_80" + }, + "default_entry" : { + "action_id" : 32, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.hashed", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 127, + "column" : 10, + "source_fragment" : "hashed" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "indirect_ws", + "action_profile" : "FabricIngress.next.hashed_profile", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [33, 34, 2], + "actions" : ["FabricIngress.next.output_hashed", "FabricIngress.next.routing_hashed", "nop"], + "base_default_next" : "FabricIngress.next.multicast", + "next_tables" : { + "FabricIngress.next.output_hashed" : "FabricIngress.next.multicast", + "FabricIngress.next.routing_hashed" : "FabricIngress.next.multicast", + "nop" : "FabricIngress.next.multicast" + } + }, + { + "name" : "FabricIngress.next.multicast", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 161, + "column" : 10, + "source_fragment" : "multicast" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "next_id", + "target" : ["scalars", "userMetadata._ingress_next_id21"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [35, 36], + "actions" : ["FabricIngress.next.set_mcast_group_id", "FabricIngress.next.reset_mcast_group_id"], + "base_default_next" : "FabricIngress.qos.set_slice_tc", + "next_tables" : { + "FabricIngress.next.set_mcast_group_id" : "FabricIngress.qos.set_slice_tc", + "FabricIngress.next.reset_mcast_group_id" : "FabricIngress.qos.set_slice_tc" + }, + "default_entry" : { + "action_id" : 36, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.set_slice_tc", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 91, + "column" : 10, + "source_fragment" : "set_slice_tc" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "fabric_md.is_upf_hit", + "target" : ["scalars", "userMetadata._ingress_is_upf_hit29"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [40, 41, 7], + "actions" : ["FabricIngress.qos.use_upf", "FabricIngress.qos.use_default", "NoAction"], + "base_default_next" : "FabricIngress.qos.default_tc", + "next_tables" : { + "FabricIngress.qos.use_upf" : "FabricIngress.qos.default_tc", + "FabricIngress.qos.use_default" : "FabricIngress.qos.default_tc", + "NoAction" : "FabricIngress.qos.default_tc" + }, + "default_entry" : { + "action_id" : 7, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 96, + "column" : 12, + "source_fragment" : "true: use_upf" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 40, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 97, + "column" : 12, + "source_fragment" : "false: use_default" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 41, + "action_data" : [] + }, + "priority" : 2 + } + ] + }, + { + "name" : "FabricIngress.qos.default_tc", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 150, + "column" : 10, + "source_fragment" : "default_tc" + }, + "key" : [ + { + "match_type" : "ternary", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "tc_unknown", + "target" : ["scalars", "userMetadata._ingress_tc_unknown28"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 16, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [44, 3], + "actions" : ["FabricIngress.qos.set_default_tc", "nop"], + "base_default_next" : "node_85", + "next_tables" : { + "FabricIngress.qos.set_default_tc" : "node_85", + "nop" : "node_85" + }, + "default_entry" : { + "action_id" : 3, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing174", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [100], + "actions" : ["slicing174"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing174" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 100, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing177", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 177, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [101], + "actions" : ["slicing177"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing177" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 101, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.queues", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 122, + "column" : 10, + "source_fragment" : "queues" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "slice_tc", + "target" : ["_ingress_bridged4", "_base_slice_tc12"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "color", + "target" : ["scalars", "qos_packet_color"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 128, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [42, 43], + "actions" : ["FabricIngress.qos.set_queue", "FabricIngress.qos.meter_drop"], + "base_default_next" : "tbl_int112", + "next_tables" : { + "FabricIngress.qos.set_queue" : "tbl_int112", + "FabricIngress.qos.meter_drop" : "tbl_int112" + }, + "default_entry" : { + "action_id" : 42, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int112", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 112, + "column" : 46, + "source_fragment" : "= standard_md.egress_spec; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [102], + "actions" : ["int112"], + "base_default_next" : "FabricIngress.int_ingress.drop_report", + "next_tables" : { + "int112" : "FabricIngress.int_ingress.drop_report" + }, + "default_entry" : { + "action_id" : 102, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 86, + "column" : 10, + "source_fragment" : "drop_report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_ingress_bridged4", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "punt_to_cpu", + "target" : ["scalars", "userMetadata._ingress_punt_to_cpu23"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "egress_port_set", + "target" : ["scalars", "userMetadata._ingress_egress_port_set22"], + "mask" : null + }, + { + "match_type" : "ternary", + "name" : "mcast_group_id", + "target" : ["standard_metadata", "mcast_grp"], + "mask" : null + } + ], + "match_type" : "ternary", + "type" : "simple", + "max_size" : 3, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [71, 6], + "actions" : ["FabricIngress.int_ingress.report_drop", "nop"], + "base_default_next" : "tbl_fabric_v1model106", + "next_tables" : { + "FabricIngress.int_ingress.report_drop" : "tbl_fabric_v1model106", + "nop" : "tbl_fabric_v1model106" + }, + "default_entry" : { + "action_id" : 6, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 101, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 102, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0x0000" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 2 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 104, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "ternary", + "key" : "0x0000", + "mask" : "0xffff" + } + ], + "action_entry" : { + "action_id" : 71, + "action_data" : [] + }, + "priority" : 3 + } + ] + }, + { + "name" : "tbl_fabric_v1model106", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [104], + "actions" : ["fabric_v1model106"], + "base_default_next" : "node_92", + "next_tables" : { + "fabric_v1model106" : "node_92" + }, + "default_entry" : { + "action_id" : 104, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model110", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [103], + "actions" : ["fabric_v1model110"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model110" : null + }, + "default_entry" : { + "action_id" : 103, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [ + { + "name" : "FabricIngress.next.hashed_profile", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 112, + "column" : 15, + "source_fragment" : "hashed_profile" + }, + "max_size" : 16, + "selector" : { + "algo" : "crc16", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"] + } + ] + } + } + ], + "conditionals" : [ + { + "name" : "node_3", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 62, + "column" : 12, + "source_fragment" : "standard_md.parser_error == error.PacketRejectedByParser" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "parser_error"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x8" + } + } + }, + "true_next" : "tbl_fabric_v1model64", + "false_next" : "node_5" + }, + { + "name" : "node_5", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 67, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 4" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000004" + } + } + }, + "true_next" : "tbl_fabric_v1model70", + "false_next" : "tbl_lookup_md_init15" + }, + { + "name" : "node_8", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 20, + "column" : 12, + "source_fragment" : "hdr.vlan_tag.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vlan_tag4", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init21", + "false_next" : "tbl_lookup_md_init24" + }, + { + "name" : "node_11", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 32, + "column" : 12, + "source_fragment" : "hdr.inner_ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init33", + "false_next" : "node_19" + }, + { + "name" : "node_13", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 37, + "column" : 16, + "source_fragment" : "hdr.inner_tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_tcp19", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init38", + "false_next" : "node_15" + }, + { + "name" : "node_15", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 40, + "column" : 23, + "source_fragment" : "hdr.inner_udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_udp20", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init41", + "false_next" : "node_17" + }, + { + "name" : "node_17", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 43, + "column" : 23, + "source_fragment" : "hdr.inner_icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_icmp21", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init44", + "false_next" : "node_27" + }, + { + "name" : "node_19", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 47, + "column" : 19, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init48", + "false_next" : "node_27" + }, + { + "name" : "node_21", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 52, + "column" : 16, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init53", + "false_next" : "node_23" + }, + { + "name" : "node_23", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 55, + "column" : 23, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init56", + "false_next" : "node_25" + }, + { + "name" : "node_25", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 58, + "column" : 23, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_lookup_md_init59", + "false_next" : "node_27" + }, + { + "name" : "node_27", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 24, + "column" : 12, + "source_fragment" : "hdr.packet_out.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_packet_out0", "$valid$"] + } + } + }, + "true_next" : "tbl_pkt_io_do_packet_out", + "false_next" : "FabricIngress.int_watchlist.watchlist" + }, + { + "name" : "node_35", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 84, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "tbl_upf25", + "true_next" : "node_59" + }, + { + "name" : "node_37", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 406, + "column" : 12, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "FabricIngress.upf.interfaces", + "false_next" : "node_59" + }, + { + "name" : "node_40", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 413, + "column" : 24, + "source_fragment" : "fabric_md.bridged.base.encap_presence != EncapPresence.NONE" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_encap_presence7"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "FabricIngress.upf.uplink_sessions", + "false_next" : "FabricIngress.upf.applications" + }, + { + "name" : "node_47", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 433, + "column" : 16, + "source_fragment" : "sess_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_sess_hit"] + } + } + }, + "true_next" : "node_48", + "false_next" : "tbl_upf443" + }, + { + "name" : "node_48", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 434, + "column" : 20, + "source_fragment" : "is_uplink" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_is_uplink"] + } + } + }, + "true_next" : "FabricIngress.upf.uplink_terminations", + "false_next" : "FabricIngress.upf.downlink_terminations" + }, + { + "name" : "node_54", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 446, + "column" : 16, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_upf448", + "false_next" : "FabricIngress.upf.ig_tunnel_peers" + }, + { + "name" : "node_57", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 451, + "column" : 16, + "source_fragment" : "term_hit" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "upf_term_hit"] + } + } + }, + "true_next" : "tbl_upf461", + "false_next" : "node_59" + }, + { + "name" : "node_59", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 88, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"] + } + } + }, + "false_next" : "node_60", + "true_next" : "tbl_hasher17" + }, + { + "name" : "node_60", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 178, + "column" : 12, + "source_fragment" : "hdr.ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ethernet3", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.bridging", + "false_next" : "node_62" + }, + { + "name" : "node_62", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 181, + "column" : 19, + "source_fragment" : "hdr.mpls.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.mpls", + "false_next" : "node_64" + }, + { + "name" : "node_64", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 184, + "column" : 19, + "source_fragment" : "fabric_md.lkp.is_ipv4 && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x03" + } + } + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v4", + "false_next" : "node_66" + }, + { + "name" : "node_66", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 188, + "column" : 19, + "source_fragment" : "hdr.ipv6.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + } + } + }, + "true_next" : "FabricIngress.forwarding.routing_v6", + "false_next" : "tbl_hasher17" + }, + { + "name" : "node_69", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 27, + "column" : 12, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_bridged4", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "tbl_hasher28", + "false_next" : "node_71" + }, + { + "name" : "node_71", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 38, + "column" : 12, + "source_fragment" : "hdr.gtpu.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "true_next" : "tbl_hasher39", + "false_next" : "node_73" + }, + { + "name" : "node_73", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"] + } + } + }, + "true_next" : "tbl_hasher50", + "false_next" : "tbl_hasher66" + }, + { + "name" : "node_76", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 92, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.pre_next.next_mpls", + "true_next" : "FabricIngress.acl.acl" + }, + { + "name" : "node_80", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 96, + "column" : 13, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_skip_next20"] + } + } + }, + "false_next" : "FabricIngress.next.hashed", + "true_next" : "FabricIngress.qos.set_slice_tc" + }, + { + "name" : "node_85", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + }, + "true_next" : "tbl_slicing174", + "false_next" : "tbl_slicing177" + }, + { + "name" : "node_92", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 109, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model110" + } + ] + }, + { + "name" : "egress", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 115, + "column" : 8, + "source_fragment" : "FabricEgress" + }, + "init_table" : "tbl_fabric_v1model133", + "tables" : [ + { + "name" : "tbl_fabric_v1model133", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 133, + "column" : 34, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [138], + "actions" : ["fabric_v1model133"], + "base_default_next" : "node_97", + "next_tables" : { + "fabric_v1model133" : "node_97" + }, + "default_entry" : { + "action_id" : 138, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model136", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [137], + "actions" : ["fabric_v1model136"], + "base_default_next" : "node_99", + "next_tables" : { + "fabric_v1model136" : "node_99" + }, + "default_entry" : { + "action_id" : 137, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [140], + "actions" : ["int_tna_parser_emulator14"], + "base_default_next" : "node_101", + "next_tables" : { + "int_tna_parser_emulator14" : "node_101" + }, + "default_entry" : { + "action_id" : 140, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148", + "id" : 63, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [139], + "actions" : ["int_tna_parser_emulator148"], + "base_default_next" : "node_103", + "next_tables" : { + "int_tna_parser_emulator148" : "node_103" + }, + "default_entry" : { + "action_id" : 139, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop", + "id" : 64, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [124], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166" + }, + "default_entry" : { + "action_id" : 124, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166", + "id" : 65, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [141], + "actions" : ["int_tna_parser_emulator166"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator166" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 141, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror", + "id" : 66, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [126], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169" + }, + "default_entry" : { + "action_id" : 126, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169", + "id" : 67, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [142], + "actions" : ["int_tna_parser_emulator169"], + "base_default_next" : "tbl_int_tna_parser_emulator173", + "next_tables" : { + "int_tna_parser_emulator169" : "tbl_int_tna_parser_emulator173" + }, + "default_entry" : { + "action_id" : 142, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173", + "id" : 68, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [143], + "actions" : ["int_tna_parser_emulator173"], + "base_default_next" : "node_109", + "next_tables" : { + "int_tna_parser_emulator173" : "node_109" + }, + "default_entry" : { + "action_id" : 143, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14_0", + "id" : 69, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 14, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [145], + "actions" : ["int_tna_parser_emulator14_0"], + "base_default_next" : "node_111", + "next_tables" : { + "int_tna_parser_emulator14_0" : "node_111" + }, + "default_entry" : { + "action_id" : 145, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148_0", + "id" : 70, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 148, + "column" : 12, + "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [144], + "actions" : ["int_tna_parser_emulator148_0"], + "base_default_next" : "node_113", + "next_tables" : { + "int_tna_parser_emulator148_0" : "node_113" + }, + "default_entry" : { + "action_id" : 144, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "id" : 71, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 165, + "column" : 12, + "source_fragment" : "parse_int_ingress_drop()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [125], + "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"], + "base_default_next" : "tbl_int_tna_parser_emulator166_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166_0" + }, + "default_entry" : { + "action_id" : 125, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166_0", + "id" : 72, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 166, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [146], + "actions" : ["int_tna_parser_emulator166_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator166_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 146, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror_0", + "id" : 73, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "parse_int_report_mirror()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [127], + "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"], + "base_default_next" : "tbl_int_tna_parser_emulator169_0", + "next_tables" : { + "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169_0" + }, + "default_entry" : { + "action_id" : 127, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169_0", + "id" : 74, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 169, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [147], + "actions" : ["int_tna_parser_emulator169_0"], + "base_default_next" : "tbl_int_tna_parser_emulator173_0", + "next_tables" : { + "int_tna_parser_emulator169_0" : "tbl_int_tna_parser_emulator173_0" + }, + "default_entry" : { + "action_id" : 147, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173_0", + "id" : 75, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [148], + "actions" : ["int_tna_parser_emulator173_0"], + "base_default_next" : "FabricEgress.pkt_io_egress.switch_info", + "next_tables" : { + "int_tna_parser_emulator173_0" : "FabricEgress.pkt_io_egress.switch_info" + }, + "default_entry" : { + "action_id" : 148, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.pkt_io_egress.switch_info", + "id" : 76, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 39, + "column" : 10, + "source_fragment" : "switch_info" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [113, 105], + "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"], + "base_default_next" : "node_120", + "next_tables" : { + "FabricEgress.pkt_io_egress.set_switch_info" : "node_120", + "nop" : "node_120" + }, + "default_entry" : { + "action_id" : 105, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "tbl_packetio51", + "id" : 77, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 51, + "column" : 12, + "source_fragment" : "hdr.packet_in.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [149], + "actions" : ["packetio51"], + "base_default_next" : "node_122", + "next_tables" : { + "packetio51" : "node_122" + }, + "default_entry" : { + "action_id" : 149, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_packetio60", + "id" : 78, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 60, + "column" : 37, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [150], + "actions" : ["packetio60"], + "base_default_next" : "node_124", + "next_tables" : { + "packetio60" : "node_124" + }, + "default_entry" : { + "action_id" : 150, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.stats.flows", + "id" : 79, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 53, + "column" : 10, + "source_fragment" : "flows" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "stats_flow_id", + "target" : ["_egress_bridged36", "_base_stats_flow_id11"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [112], + "actions" : ["FabricEgress.stats.count"], + "base_default_next" : "node_126", + "next_tables" : { + "FabricEgress.stats.count" : "node_126" + }, + "default_entry" : { + "action_id" : 112, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next283", + "id" : 80, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 283, + "column" : 50, + "source_fragment" : "= INT_REPORT_TYPE_NO_REPORT; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [151], + "actions" : ["next283"], + "base_default_next" : "node_128", + "next_tables" : { + "next283" : "node_128" + }, + "default_entry" : { + "action_id" : 151, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_pop_mpls_if_present", + "id" : 81, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 36, + "source_fragment" : "pop_mpls_if_present()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [114], + "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.pop_mpls_if_present" : "node_132" + }, + "default_entry" : { + "action_id" : 114, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_set_mpls", + "id" : 82, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 291, + "column" : 12, + "source_fragment" : "set_mpls()" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [115], + "actions" : ["FabricEgress.egress_next.set_mpls"], + "base_default_next" : "node_132", + "next_tables" : { + "FabricEgress.egress_next.set_mpls" : "node_132" + }, + "default_entry" : { + "action_id" : 115, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan", + "id" : 83, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 264, + "column" : 10, + "source_fragment" : "egress_vlan" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "vlan_id", + "target" : ["_egress_bridged36", "_base_vlan_id6"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [116, 117, 118], + "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"], + "base_default_next" : "node_134", + "next_tables" : { + "FabricEgress.egress_next.push_vlan" : "node_134", + "FabricEgress.egress_next.pop_vlan" : "node_134", + "FabricEgress.egress_next.drop" : "node_134" + }, + "default_entry" : { + "action_id" : 118, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next323", + "id" : 84, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 323, + "column" : 25, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [153], + "actions" : ["next323"], + "base_default_next" : "node_136", + "next_tables" : { + "next323" : "node_136" + }, + "default_entry" : { + "action_id" : 153, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next325", + "id" : 85, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 325, + "column" : 25, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [152], + "actions" : ["next325"], + "base_default_next" : "node_148", + "next_tables" : { + "next325" : "node_148" + }, + "default_entry" : { + "action_id" : 152, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next333", + "id" : 86, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 333, + "column" : 33, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [154], + "actions" : ["next333"], + "base_default_next" : "node_141", + "next_tables" : { + "next333" : "node_141" + }, + "default_entry" : { + "action_id" : 154, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next336", + "id" : 87, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 336, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [155], + "actions" : ["next336"], + "base_default_next" : "node_148", + "next_tables" : { + "next336" : "node_148" + }, + "default_entry" : { + "action_id" : 155, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next343", + "id" : 88, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 343, + "column" : 39, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [156], + "actions" : ["next343"], + "base_default_next" : "node_146", + "next_tables" : { + "next343" : "node_146" + }, + "default_entry" : { + "action_id" : 156, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next346", + "id" : 89, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 346, + "column" : 29, + "source_fragment" : "= 1; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [157], + "actions" : ["next346"], + "base_default_next" : "node_148", + "next_tables" : { + "next346" : "node_148" + }, + "default_entry" : { + "action_id" : 157, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf610", + "id" : 90, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 610, + "column" : 20, + "source_fragment" : "hdr.inner_udp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [158], + "actions" : ["upf610"], + "base_default_next" : "node_152", + "next_tables" : { + "upf610" : "node_152" + }, + "default_entry" : { + "action_id" : 158, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf615", + "id" : 91, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 615, + "column" : 20, + "source_fragment" : "hdr.inner_tcp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [159], + "actions" : ["upf615"], + "base_default_next" : "node_154", + "next_tables" : { + "upf615" : "node_154" + }, + "default_entry" : { + "action_id" : 159, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf620", + "id" : 92, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 620, + "column" : 20, + "source_fragment" : "hdr.inner_icmp.setValid(); ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [160], + "actions" : ["upf620"], + "base_default_next" : "FabricEgress.upf.gtpu_encap", + "next_tables" : { + "upf620" : "FabricEgress.upf.gtpu_encap" + }, + "default_entry" : { + "action_id" : 160, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.upf.gtpu_encap", + "id" : 93, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 597, + "column" : 10, + "source_fragment" : "gtpu_encap" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [122, 123], + "actions" : ["FabricEgress.upf.gtpu_only", "FabricEgress.upf.gtpu_with_psc"], + "base_default_next" : "FabricEgress.upf.eg_tunnel_peers", + "next_tables" : { + "FabricEgress.upf.gtpu_only" : "FabricEgress.upf.eg_tunnel_peers", + "FabricEgress.upf.gtpu_with_psc" : "FabricEgress.upf.eg_tunnel_peers" + }, + "default_entry" : { + "action_id" : 122, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.upf.eg_tunnel_peers", + "id" : 94, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 491, + "column" : 10, + "source_fragment" : "eg_tunnel_peers" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "tun_peer_id", + "target" : ["_egress_bridged36", "_upf_tun_peer_id13"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 256, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [121, 107], + "actions" : ["FabricEgress.upf.load_tunnel_params", "nop"], + "base_default_next" : "node_158", + "next_tables" : { + "FabricEgress.upf.load_tunnel_params" : "node_158", + "nop" : "node_158" + }, + "default_entry" : { + "action_id" : 107, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_upf628", + "id" : 95, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 628, + "column" : 16, + "source_fragment" : "terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [161], + "actions" : ["upf628"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "upf628" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 161, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int128", + "id" : 96, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 128, + "column" : 4, + "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [162], + "actions" : ["int128"], + "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds", + "next_tables" : { + "int128" : "FabricEgress.int_egress.queue_latency_thresholds" + }, + "default_entry" : { + "action_id" : 162, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.queue_latency_thresholds", + "id" : 97, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 159, + "column" : 10, + "source_fragment" : "queue_latency_thresholds" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "egress_qid", + "target" : ["scalars", "int_egress_egress_qid"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_upper", + "target" : ["scalars", "key_0"], + "mask" : null + }, + { + "match_type" : "range", + "name" : "hop_latency_lower", + "target" : ["scalars", "key_1"], + "mask" : null + } + ], + "match_type" : "range", + "type" : "simple", + "max_size" : 128, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [128, 129, 108], + "actions" : ["FabricEgress.int_egress.check_quota", "FabricEgress.int_egress.reset_quota", "nop"], + "base_default_next" : "FabricEgress.int_egress.config", + "next_tables" : { + "FabricEgress.int_egress.check_quota" : "FabricEgress.int_egress.config", + "FabricEgress.int_egress.reset_quota" : "FabricEgress.int_egress.config", + "nop" : "FabricEgress.int_egress.config" + }, + "default_entry" : { + "action_id" : 108, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.config", + "id" : 98, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 183, + "column" : 10, + "source_fragment" : "config" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [130], + "actions" : ["FabricEgress.int_egress.set_config"], + "base_default_next" : "tbl_int373", + "next_tables" : { + "FabricEgress.int_egress.set_config" : "tbl_int373" + }, + "default_entry" : { + "action_id" : 130, + "action_const" : false, + "action_data" : ["0xffffff00", "0xffffc0000000"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_int373", + "id" : 99, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 373, + "column" : 38, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [164], + "actions" : ["int373"], + "base_default_next" : "node_164", + "next_tables" : { + "int373" : "node_164" + }, + "default_entry" : { + "action_id" : 164, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.report", + "id" : 100, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 260, + "column" : 10, + "source_fragment" : "report" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "bmd_type", + "target" : ["int_egress_fabric_md_int_report_md", "bmd_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "mirror_type", + "target" : ["int_egress_fabric_md_int_report_md", "mirror_type"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["int_egress_fabric_md_int_report_md", "report_type"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 6, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [131, 132, 133, 134, 109], + "actions" : ["FabricEgress.int_egress.do_local_report_encap", "FabricEgress.int_egress.do_local_report_encap_mpls", "FabricEgress.int_egress.do_drop_report_encap", "FabricEgress.int_egress.do_drop_report_encap_mpls", "nop"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "FabricEgress.int_egress.do_local_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_local_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "FabricEgress.int_egress.do_drop_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "nop" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 109, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata", + "id" : 101, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 315, + "column" : 10, + "source_fragment" : "int_metadata" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "int_report_type", + "target" : ["_egress_bridged36", "_int_bmd_report_type21"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "drop_ctl", + "target" : ["scalars", "userMetadata._drop_ctl2"], + "mask" : null + }, + { + "match_type" : "exact", + "name" : "queue_report", + "target" : ["scalars", "userMetadata._egress_int_md_queue_report43"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [135, 110], + "actions" : ["FabricEgress.int_egress.init_int_metadata", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "tbl_int383", + "__MISS__" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 110, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 327, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x1"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 329, + "column" : 12, + "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x01" + }, + { + "match_type" : "exact", + "key" : "0x00" + } + ], + "action_entry" : { + "action_id" : 135, + "action_data" : ["0x4"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_int383", + "id" : 102, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [163], + "actions" : ["int383"], + "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "next_tables" : { + "int383" : "FabricEgress.int_egress.adjust_int_report_hdr_length" + }, + "default_entry" : { + "action_id" : 163, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "id" : 103, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 347, + "column" : 10, + "source_fragment" : "adjust_int_report_hdr_length" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "is_int_wip", + "target" : ["int_egress_fabric_md_bridged", "_int_bmd_wip_type26"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [111, 136], + "actions" : ["nop", "FabricEgress.int_egress.adjust_ip_udp_len"], + "base_default_next" : "tbl_slicing189", + "next_tables" : { + "nop" : "tbl_slicing189", + "FabricEgress.int_egress.adjust_ip_udp_len" : "tbl_slicing189" + }, + "default_entry" : { + "action_id" : 111, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 358, + "column" : 12, + "source_fragment" : "INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x01" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xfff2", "0xffde"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 359, + "column" : 12, + "source_fragment" : "INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)" + }, + "match_key" : [ + { + "match_type" : "exact", + "key" : "0x02" + } + ], + "action_entry" : { + "action_id" : 136, + "action_data" : ["0xffee", "0xffda"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_slicing189", + "id" : 104, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 189, + "column" : 4, + "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ..." + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [166], + "actions" : ["slicing189"], + "base_default_next" : "FabricEgress.dscp_rewriter.rewriter", + "next_tables" : { + "slicing189" : "FabricEgress.dscp_rewriter.rewriter" + }, + "default_entry" : { + "action_id" : 166, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.dscp_rewriter.rewriter", + "id" : 105, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 201, + "column" : 10, + "source_fragment" : "rewriter" + }, + "key" : [ + { + "match_type" : "exact", + "name" : "eg_port", + "target" : ["standard_metadata", "egress_port"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 512, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [119, 120, 106], + "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "node_171", + "__MISS__" : "node_173" + }, + "default_entry" : { + "action_id" : 106, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing217", + "id" : 106, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 30, + "source_fragment" : "=" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [165], + "actions" : ["slicing217"], + "base_default_next" : "node_173", + "next_tables" : { + "slicing217" : "node_173" + }, + "default_entry" : { + "action_id" : 165, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model170", + "id" : 107, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [167], + "actions" : ["fabric_v1model170"], + "base_default_next" : "node_175", + "next_tables" : { + "fabric_v1model170" : "node_175" + }, + "default_entry" : { + "action_id" : 167, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model174", + "id" : 108, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 174, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + }, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [168], + "actions" : ["fabric_v1model174"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model174" : null + }, + "default_entry" : { + "action_id" : 168, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [], + "conditionals" : [ + { + "name" : "node_97", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 135, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._skip_egress0"] + } + } + }, + "true_next" : "tbl_fabric_v1model136", + "false_next" : "node_99" + }, + { + "name" : "node_99", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 140, + "column" : 13, + "source_fragment" : "standard_md.instance_type == 2" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "instance_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00000002" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14", + "false_next" : "node_109" + }, + { + "name" : "node_101", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148", + "false_next" : "node_103" + }, + { + "name" : "node_103", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type47"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror" + }, + { + "name" : "node_109", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 150, + "column" : 11, + "source_fragment" : "(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator14_0", + "false_next" : "FabricEgress.pkt_io_egress.switch_info" + }, + { + "name" : "node_111", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 145, + "column" : 11, + "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_gtpu12", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_vxlan15", "$valid$"] + } + } + } + } + }, + "true_next" : "tbl_int_tna_parser_emulator148_0", + "false_next" : "node_113" + }, + { + "name" : "node_113", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 164, + "column" : 12, + "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type21"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "true_next" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "false_next" : "tbl_parser_emulator_parse_int_report_mirror_0" + }, + { + "name" : "node_120", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 50, + "column" : 12, + "source_fragment" : "standard_md.egress_port == fabric_md.cpu_port" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + }, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + } + } + }, + "true_next" : "tbl_packetio51", + "false_next" : "node_122" + }, + { + "name" : "node_122", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 58, + "column" : 12, + "source_fragment" : "hdr.fake_ethernet.isValid() && ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_fake_ethernet2", "ether_type"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xbf03" + } + } + } + } + }, + "true_next" : "tbl_packetio60", + "false_next" : "node_124" + }, + { + "name" : "node_124", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "true_next" : "FabricEgress.stats.flows", + "false_next" : "node_126" + }, + { + "name" : "node_126", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 280, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.is_multicast ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_is_multicast4"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_ig_port3"] + }, + "right" : { + "type" : "field", + "value" : ["standard_metadata", "egress_port"] + } + } + } + } + }, + "true_next" : "tbl_next283", + "false_next" : "node_128" + }, + { + "name" : "node_128", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 288, + "column" : 12, + "source_fragment" : "fabric_md.bridged.base.mpls_label == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_mpls_label2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x000000" + } + } + }, + "true_next" : "node_129", + "false_next" : "tbl_egress_next_set_mpls" + }, + { + "name" : "node_129", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 289, + "column" : 16, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_egress_next_pop_mpls_if_present", + "false_next" : "node_132" + }, + { + "name" : "node_132", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 159, + "column" : 39, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_is_int_recirc45"] + } + } + }, + "false_next" : "FabricEgress.egress_next.egress_vlan", + "true_next" : "node_134" + }, + { + "name" : "node_134", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 322, + "column" : 12, + "source_fragment" : "hdr.mpls.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_mpls6", "$valid$"] + } + } + }, + "true_next" : "tbl_next323", + "false_next" : "node_138" + }, + { + "name" : "node_136", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 324, + "column" : 16, + "source_fragment" : "hdr.mpls.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_mpls6", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next325", + "false_next" : "node_148" + }, + { + "name" : "node_138", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 331, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_139", + "false_next" : "node_143" + }, + { + "name" : "node_139", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next333", + "true_next" : "node_141" + }, + { + "name" : "node_141", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 335, + "column" : 20, + "source_fragment" : "hdr.ipv4.ttl == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv47", "ttl"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next336", + "false_next" : "node_148" + }, + { + "name" : "node_143", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 341, + "column" : 23, + "source_fragment" : "hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "and", + "left" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv68", "$valid$"] + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "!=", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_base_fwd_type5"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + } + } + }, + "true_next" : "node_144", + "false_next" : "node_148" + }, + { + "name" : "node_144", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 319, + "column" : 28, + "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..." + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "or", + "left" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x04" + } + } + }, + "right" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_egress_bridged36", "_bmd_type0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" + } + } + } + } + }, + "false_next" : "tbl_next343", + "true_next" : "node_146" + }, + { + "name" : "node_146", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 345, + "column" : 20, + "source_fragment" : "hdr.ipv6.hop_limit == 0" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["_ingress_ipv68", "hop_limit"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x00" + } + } + }, + "true_next" : "tbl_next346", + "false_next" : "node_148" + }, + { + "name" : "node_148", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 607, + "column" : 13, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_upf17"] + } + } + }, + "false_next" : "node_149", + "true_next" : "tbl_int128" + }, + { + "name" : "node_149", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 608, + "column" : 16, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_needs_gtpu_encap16"] + } + } + }, + "true_next" : "node_150", + "false_next" : "node_158" + }, + { + "name" : "node_150", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 609, + "column" : 20, + "source_fragment" : "hdr.udp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_udp10", "$valid$"] + } + } + }, + "true_next" : "tbl_upf610", + "false_next" : "node_152" + }, + { + "name" : "node_152", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 614, + "column" : 20, + "source_fragment" : "hdr.tcp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_tcp9", "$valid$"] + } + } + }, + "true_next" : "tbl_upf615", + "false_next" : "node_154" + }, + { + "name" : "node_154", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 619, + "column" : 20, + "source_fragment" : "hdr.icmp.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_icmp11", "$valid$"] + } + } + }, + "true_next" : "tbl_upf620", + "false_next" : "FabricEgress.upf.gtpu_encap" + }, + { + "name" : "node_158", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4", + "line" : 627, + "column" : 17, + "source_fragment" : "fabric_md.bridged" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_bridged36", "_upf_skip_egress_upf_ctr18"] + } + } + }, + "false_next" : "tbl_upf628", + "true_next" : "tbl_int128" + }, + { + "name" : "node_164", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 375, + "column" : 12, + "source_fragment" : "fabric_md.int_report_md.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["int_egress_fabric_md_int_report_md", "$valid$"] + } + } + }, + "true_next" : "FabricEgress.int_egress.report", + "false_next" : "FabricEgress.int_egress.int_metadata" + }, + { + "name" : "node_171", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 216, + "column" : 16, + "source_fragment" : "hdr.ipv4.isValid()" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + }, + "true_next" : "tbl_slicing217", + "false_next" : "node_173" + }, + { + "name" : "node_173", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 168, + "column" : 12, + "source_fragment" : "fabric_md" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"] + } + } + }, + "true_next" : "tbl_fabric_v1model170", + "false_next" : "node_175" + }, + { + "name" : "node_175", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 173, + "column" : 12, + "source_fragment" : "fabric_md.drop_ctl == 1" + }, + "expression" : { + "type" : "expression", + "value" : { + "op" : "==", + "left" : { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x01" + } + } + }, + "false_next" : null, + "true_next" : "tbl_fabric_v1model174" + } + ] + } + ], + "checksums" : [ + { + "name" : "cksum", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 55, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_3", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_0", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 73, + "column" : 8, + "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_4", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + }, + { + "name" : "cksum_1", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 92, + "column" : 8, + "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..." + }, + "target" : ["_egress_report_ipv427", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_5", + "verify" : false, + "update" : true, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_egress_report_ipv427", "$valid$"] + } + } + } + }, + { + "name" : "cksum_2", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 13, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..." + }, + "target" : ["_ingress_ipv47", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_6", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_ipv47", "$valid$"] + } + } + } + }, + { + "name" : "cksum_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..." + }, + "target" : ["_ingress_inner_ipv418", "hdr_checksum"], + "type" : "generic", + "calculation" : "calc_7", + "verify" : true, + "update" : false, + "if_cond" : { + "type" : "expression", + "value" : { + "op" : "d2b", + "left" : null, + "right" : { + "type" : "field", + "value" : ["_ingress_inner_ipv418", "$valid$"] + } + } + } + } + ], + "force_arith" : [], + "extern_instances" : [], + "field_aliases" : [ + [ + "queueing_metadata.enq_timestamp", + ["standard_metadata", "enq_timestamp"] + ], + [ + "queueing_metadata.enq_qdepth", + ["standard_metadata", "enq_qdepth"] + ], + [ + "queueing_metadata.deq_timedelta", + ["standard_metadata", "deq_timedelta"] + ], + [ + "queueing_metadata.deq_qdepth", + ["standard_metadata", "deq_qdepth"] + ], + [ + "intrinsic_metadata.ingress_global_timestamp", + ["standard_metadata", "ingress_global_timestamp"] + ], + [ + "intrinsic_metadata.egress_global_timestamp", + ["standard_metadata", "egress_global_timestamp"] + ], + [ + "intrinsic_metadata.mcast_grp", + ["standard_metadata", "mcast_grp"] + ], + [ + "intrinsic_metadata.egress_rid", + ["standard_metadata", "egress_rid"] + ], + [ + "intrinsic_metadata.priority", + ["standard_metadata", "priority"] + ] + ], + "program" : "/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4", + "__meta__" : { + "version" : [2, 23], + "compiler" : "https://github.com/p4lang/p4c" + } +} \ No newline at end of file diff --git a/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt b/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt new file mode 100644 index 000000000..d502367c0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt @@ -0,0 +1,2482 @@ +pkg_info { + arch: "v1model" +} +tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 +} +tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 +} +tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 +} +tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 +} +tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 +} +tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 +} +tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 +} +tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 +} +tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 +} +tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 +} +tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 +} +tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 +} +tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 +} +tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 +} +tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 +} +tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 +} +tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 +} +tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 +} +tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 +} +tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 +} +tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 +} +tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 +} +tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 +} +tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 +} +tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 +} +tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 +} +tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 +} +tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 +} +tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 +} +tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 +} +tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 +} +actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } +} +actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } +} +actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } +} +actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } +} +actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } +} +actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } +} +actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } +} +actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } +} +actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } +} +actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } +} +actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } +} +actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } +} +actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } +} +actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } +} +actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } +} +actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } +} +actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } +} +actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } +} +actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } +} +actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } +} +actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } +} +actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } +} +actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } +} +actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } +} +actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } +} +actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } +} +actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } +} +actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } +} +actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } +} +actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } +} +actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } +} +actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } +} +actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } +} +actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } +} +actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } +} +actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } +} +actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } +} +actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } +} +actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } +} +actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } +} +actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } +} +actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } +} +actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } +} +actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } +} +actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } +} +actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } +} +actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } +} +actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } +} +actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } +} +actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } +} +actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } +} +actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } +} +actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } +} +actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } +} +actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } +} +action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 +} +counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 +} +counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 +} +direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 +} +direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 +} +direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 +} +direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 +} +direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 +} +direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 +} +direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 +} +direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 +} +direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 +} +direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 +} +direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 +} +direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 +} +direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 +} +direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 +} +direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 +} +direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 +} +direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 +} +direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 +} +direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 +} +meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 +} +meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 +} +controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } +} +controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } +} +registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 +} +type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } +} diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh new file mode 100755 index 000000000..ee3121da0 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_01_bootstrap.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# make sure to source the following scripts: +# - my_deploy.sh +# - tfs_runtime_env_vars.sh + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py diff --git a/src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh similarity index 77% rename from src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh rename to src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh index 4bd4edb45..22cfd65de 100755 --- a/src/tests/p4-fabric-tna/run_test_03b_service_deprovision_l2.sh +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_02_service_provision_upf.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ # limitations under the License. source tfs_runtime_env_vars.sh -python3 -m pytest --verbose src/tests/p4-fabric-tna/tests-service/test_functional_service_deprovision_l2.py +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh new file mode 100755 index 000000000..248b09f3f --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_03_service_deprovision_upf.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh new file mode 100755 index 000000000..caf69ba61 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_04_cleanup.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py diff --git a/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh b/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh new file mode 100755 index 000000000..fa46662be --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/run_test_05_purge.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +source tfs_runtime_env_vars.sh +python3 -m pytest --verbose src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py diff --git a/src/tests/p4-sd-fabric-svc-upf/setup.sh b/src/tests/p4-sd-fabric-svc-upf/setup.sh new file mode 100755 index 000000000..d4979ff45 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/setup.sh @@ -0,0 +1,22 @@ +#! /bin/bash +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}') + +kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4 + +kubectl cp src/tests/p4-sd-fabric-svc-upf/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-sd-fabric-svc-upf/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py new file mode 100644 index 000000000..1a6825e17 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py @@ -0,0 +1,88 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, service_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DEV_NB = 5 +P4_DEV_NB = 1 +UE_NB = 1 + +BASIC_UPF_RULES = 22 +PER_UE_RULES = 4 + +def test_service_deletion_upf( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + # Get the current number of devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + # Total devices + dev_nb = len(response.devices) + assert dev_nb == DEV_NB + + # P4 devices + p4_dev_nb = identify_number_of_p4_devices(response.devices) + assert p4_dev_nb == P4_DEV_NB + + # Get the current number of rules in the P4 devices + p4_rules_before_deletion = get_number_of_rules(response.devices) + + # Get the current number of services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_before_deletion = len(response.services) + assert verify_active_service_type(response.services, ServiceTypeEnum.SERVICETYPE_UPF) + + for service in response.services: + # Ignore services of other types + if service.service_type != ServiceTypeEnum.SERVICETYPE_UPF: + continue + + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete L2 service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + + # Get an updated view of the services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_after_deletion = len(response.services) + assert services_nb_after_deletion == services_nb_before_deletion - 1, "Exactly one service must be deleted" + + # Get an updated view of the devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + p4_rules_after_deletion = get_number_of_rules(response.devices) + + rules_diff = p4_rules_before_deletion - p4_rules_after_deletion + + desired_rules = (P4_DEV_NB * BASIC_UPF_RULES) + (UE_NB * PER_UE_RULES) + + assert p4_rules_after_deletion < p4_rules_before_deletion, "UPF service must contain some rules" + assert rules_diff == desired_rules, \ + "UPF service must contain {} rules per device".format(desired_rules) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py new file mode 100644 index 000000000..dfbd7567d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py @@ -0,0 +1,94 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +from common.proto.context_pb2 import ServiceTypeEnum +from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.grpc.Tools import grpc_message_to_json_string +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DEV_NB = 5 +P4_DEV_NB = 1 +UE_NB = 1 + +BASIC_UPF_RULES = 22 +PER_UE_RULES = 4 + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +DESC_FILE_SERVICE_P4_UPF = os.path.join(TEST_PATH, 'service-upf-ui.json') +assert os.path.exists(DESC_FILE_SERVICE_P4_UPF),\ + "Invalid path to the UPF service descriptor" + +def test_service_creation_upf( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + # Get the current number of services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_before = len(response.services) + + # Get the current number of devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + # Total devices + dev_nb = len(response.devices) + assert dev_nb == DEV_NB + + # P4 devices + p4_dev_nb = identify_number_of_p4_devices(response.devices) + assert p4_dev_nb == P4_DEV_NB + + # Get the current number of rules in the P4 devices + p4_rules_before = get_number_of_rules(response.devices) + + # Load service + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_SERVICE_P4_UPF, + context_client=context_client, device_client=device_client, service_client=service_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + + # Get an updated view of the services + response = context_client.ListServices(ADMIN_CONTEXT_ID) + services_nb_after = len(response.services) + assert services_nb_after == services_nb_before + 1, "Exactly one service must be in place" + assert verify_active_service_type(response.services, ServiceTypeEnum.SERVICETYPE_UPF) + + # Get an updated view of the devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + p4_rules_after = get_number_of_rules(response.devices) + + rules_diff = p4_rules_after - p4_rules_before + + desired_rules = (P4_DEV_NB * BASIC_UPF_RULES) + (UE_NB * PER_UE_RULES) + + assert p4_rules_after > p4_rules_before, "UPF service must install some rules" + assert rules_diff == desired_rules, \ + "UPF service must install {} rules per device".format(desired_rules) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py new file mode 100644 index 000000000..b4438d605 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py @@ -0,0 +1,80 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging, os, time +from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty +from common.tools.descriptor.Loader import DescriptorLoader, \ + check_descriptor_load_results, validate_empty_scenario +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.Fixtures import context_client, device_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'all.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_bootstrap( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test assumes that the environment is in a clean state (empty) + before bootstrapping the P4 topology. + It loads the topology descriptor and verifies that no other services + or slices are created. + """ + validate_empty_scenario(context_client) + + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + +def test_scenario_devices_enabled( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + """ + This test validates that the devices are enabled. + """ + DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + num_devices = -1 + num_devices_enabled, num_retry = 0, 0 + while (num_devices != num_devices_enabled) and (num_retry < 10): + time.sleep(1.0) + response = context_client.ListDevices(Empty()) + num_devices = len(response.devices) + num_devices_enabled = 0 + for device in response.devices: + if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue + num_devices_enabled += 1 + LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices)) + num_retry += 1 + assert num_devices_enabled == num_devices diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py new file mode 100644 index 000000000..fe4b48493 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py @@ -0,0 +1,48 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import logging +from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.Fixtures import context_client, device_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +TEST_PATH = os.path.join( + os.path.dirname(os.path.dirname( + os.path.abspath(__file__) + )) + '/descriptors') +assert os.path.exists(TEST_PATH), "Invalid path to tests" + +# Topology descriptor +DESC_TOPOLOGY = os.path.join(TEST_PATH, 'all.json') +assert os.path.exists(DESC_TOPOLOGY), "Invalid path to the topology descriptor" + +def test_scenario_cleanup( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + + # Unload topology and validate empty scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_TOPOLOGY, context_client=context_client, device_client=device_client) + descriptor_loader.validate() + descriptor_loader.unload() + validate_empty_scenario(context_client) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py new file mode 100644 index 000000000..94e2e2388 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py @@ -0,0 +1,83 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Service import json_service_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_clean_services( + context_client : ContextClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + + for service in response.services: + service_id = service.service_id + assert service_id + + service_uuid = service_id.service_uuid.uuid + context_uuid = service_id.context_id.context_uuid.uuid + assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE + + # Delete service + service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid)))) + +def test_clean_links( + context_client : ContextClient, # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListLinks(ADMIN_CONTEXT_ID) + + for link in response.links: + link_id = link.link_id + + # Delete link + context_client.RemoveLink(LinkId(**link_id)) + +def test_clean_devices( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + + for device in response.devices: + device_uuid = device.device_id.device_uuid.uuid + device_json = json_device_id(device_uuid) + + # Delete device + device_client.DeleteDevice(DeviceId(**device_json)) + +def test_clean_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has no services/slices + response = context_client.ListTopologies(ADMIN_CONTEXT_ID) + + for topology in response.topologies: + topology_id = topology.topology_id + response = context_client.RemoveTopology(topology_id) + + response = context_client.RemoveContext(ADMIN_CONTEXT_ID) diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/README.md b/src/tests/p4-sd-fabric-svc-upf/topology/README.md new file mode 100644 index 000000000..1ce9cb1dc --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/README.md @@ -0,0 +1,135 @@ +# P4 5G UPF + +For a P4 switch to act as a 5G UPF, you need a machine with at least 3 network interfaces as follows: + +- a management interface `mgmt` for the switch to communicate with the control plane (i.e., TFS controller) +- a left-hand side data plane interface `dp-1` towards the 5G gNB +- a right-hand side data plane interface `dp-2` towards the Data Network + +Also, due to Stratum's restrictions, the desired OS of the machine shall be `Ubuntu server 20.04 LTS`. + +To build Stratum on this machine, follow the steps [here](https://github.com/stratum/stratum/blob/main/stratum/hal/bin/bmv2/README.md). +It is preferred to run Stratum as a binary. + +### Steps to setup the 5G UPF P4 switch + +Follow the steps below to prepare the P4 switch to act as a UPF. + +```bash +nano p4-switch-conf-common.sh + +HOST_IFACE_EXT="mgmt" # Interface towards TFS (management, not part of the switch) +SW_IFACE_DATA_LEFT="dp-1" # Switch interface towards the 5G gNB +SW_IFACE_DATA_RIGHT="dp-2" # Switch interface towards the Data Network +``` + +### 1: Setup environment + +Edit the `p4-switch-setup.sh` script to modify the subnets' information according to your network setup: + +```bash +nano p4-switch-setup.sh + +# Subnets managed by the switch +DOMAIN_IP_LEFT="10.10.1.1/24" # Left-hand side subnet (5G gNB) +DOMAIN_IP_RIGHT="10.10.2.1/24" # Right-hand side subnet (DNN) +``` + +Once your network setup is applied, run the `p4-switch-setup.sh` script as follows: + +```bash +sudo bash p4-switch-setup.sh +``` + +### 2: Deploy Stratum + +First you need to configure the chassis configuration file with the correct network interfaces names. +Ensure that the interface names listed in the chassis configuration file agree with the ones you added in `p4-switch-conf-common.sh`. + +```bash +cat p4-switch-three-port-chassis-config-phy.pb.txt + +# Copyright 2018-present Open Networking Foundation +# SPDX-License-Identifier: Apache-2.0 + +description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports" +chassis { + platform: PLT_P4_SOFT_SWITCH + name: "bmv2-1" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "dp-1" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "dp-2" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "mgmt" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +``` + +To deploy Stratum, do: + +```bash +sudo bash run-stratum.sh +``` + +To run Stratum will verbose logging, open the `run-stratum.sh` and change: + +```bash +LOG_LEVEL="debug" +``` + +Then, re-deploy Stratum as shown above. + +To verify that Stratum has been correctly deployed, you should see the following output: + +``` + config_monitoring_service.cc:94] Pushing the saved chassis config read from p4-switch-three-port-chassis-config-phy.pb.txt... + bmv2_chassis_manager.cc:519] Registered port status callbacks successfully for node 1. + bmv2_chassis_manager.cc:453] State of port 1 in node 1: UP. + bmv2_chassis_manager.cc:453] State of port 2 in node 1: UP. + bmv2_chassis_manager.cc:453] State of port 3 in node 1: UP. + bmv2_switch.cc:74] P4-based forwarding pipeline config pushed successfully to node with ID 1. + hal.cc:220] Stratum external facing services are listening to 0.0.0.0:50000, 0.0.0.0:50001, 0.0.0.0:50101... +``` + +### 3: Restore to the original setup + +When your tests with Stratum and TFS are over, you may want to tear the switch down and kill Stratum. + +```bash +sudo bash p4-switch-tear-down.sh +``` diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh new file mode 100644 index 000000000..d961b920d --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-conf-common.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Physical interfaces +HOST_IFACE_EXT="mgmt" # Interface towards TFS (management) +SW_IFACE_DATA_LEFT="dp-1" # Interface towards the 5G gNB (data plane) +SW_IFACE_DATA_RIGHT="dp-2" # Interface towards the Data Network (data plane) + +# Subnets managed by the switch +DOMAIN_IP_LEFT="10.10.1.1/24" # Left-hand side subnet (5G gNB) +DOMAIN_IP_RIGHT="10.10.2.1/24" # Right-hand side subnet (DNN) + +# Transport port where the P4Runtime gRPC server is deployed on the switch +SW_P4RT_GRPC_PORT="50001" + +# Transport port where the P4Runtime gNMI server is deployed on the switch +SW_P4RT_GNMI_PORT="50000" + +# Transport port where Stratum listens to local calls +SW_P4RT_LOCAL_PORT="50101" diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh new file mode 100644 index 000000000..55d104f6e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-setup.sh @@ -0,0 +1,23 @@ +#!bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +kill_stratum() { + pkill stratum +} + +disable_csum_offloading() { + ethtool -K ${SW_IFACE_DATA_LEFT} rx off tx off + ethtool -K ${SW_IFACE_DATA_RIGHT} rx off tx off +} + +kill_stratum +disable_csum_offloading + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh new file mode 100644 index 000000000..77551c612 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-tear-down.sh @@ -0,0 +1,17 @@ +#!bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +kill_stratum() { + pkill stratum +} + +kill_stratum + +exit 0 diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt new file mode 100644 index 000000000..474196ef9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/p4-switch-three-port-chassis-config-phy.pb.txt @@ -0,0 +1,46 @@ +description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports" +chassis { + platform: PLT_P4_SOFT_SWITCH + name: "bmv2-1" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "dp-1" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "dp-2" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "mgmt" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt b/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt new file mode 100644 index 000000000..e127e8344 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/pipeline_config.pb.txt @@ -0,0 +1,2490 @@ +node_id_to_config { + key: 1 + value { + p4info { + pkg_info { + arch: "v1model" + } + tables { + preamble { + id: 41243186 + name: "FabricIngress.stats.flows" + alias: "FabricIngress.stats.flows" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 4 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 21929788 + } + const_default_action_id: 21929788 + direct_resource_ids: 333776332 + size: 1024 + } + tables { + preamble { + id: 43310977 + name: "FabricIngress.filtering.ingress_port_vlan" + alias: "ingress_port_vlan" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "vlan_is_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 3 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + action_refs { + id: 17164167 + } + action_refs { + id: 24158268 + } + action_refs { + id: 24266015 + } + const_default_action_id: 17164167 + direct_resource_ids: 326221069 + size: 1024 + } + tables { + preamble { + id: 49718154 + name: "FabricIngress.filtering.fwd_classifier" + alias: "fwd_classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_eth_type" + bitwidth: 16 + match_type: EXACT + } + action_refs { + id: 25032921 + } + const_default_action_id: 25032921 + direct_resource_ids: 335473470 + size: 1024 + } + tables { + preamble { + id: 43623757 + name: "FabricIngress.forwarding.bridging" + alias: "bridging" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + action_refs { + id: 21791748 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 330959985 + size: 1024 + } + tables { + preamble { + id: 37768578 + name: "FabricIngress.forwarding.mpls" + alias: "mpls" + } + match_fields { + id: 1 + name: "mpls_label" + bitwidth: 20 + match_type: EXACT + } + action_refs { + id: 30066030 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29734112 + direct_resource_ids: 318961579 + size: 1024 + } + tables { + preamble { + id: 41754650 + name: "FabricIngress.forwarding.routing_v4" + alias: "routing_v4" + } + match_fields { + id: 1 + name: "ipv4_dst" + bitwidth: 32 + match_type: LPM + } + action_refs { + id: 19792090 + } + action_refs { + id: 29124955 + } + action_refs { + id: 17639597 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 333425635 + size: 1024 + } + tables { + preamble { + id: 49342721 + name: "FabricIngress.forwarding.routing_v6" + alias: "routing_v6" + } + match_fields { + id: 1 + name: "ipv6_dst" + bitwidth: 128 + match_type: LPM + } + action_refs { + id: 21856023 + } + action_refs { + id: 24646532 + } + action_refs { + id: 29734112 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 324042090 + size: 1024 + } + tables { + preamble { + id: 36626242 + name: "FabricIngress.pre_next.next_mpls" + alias: "next_mpls" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 22765924 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 330020245 + size: 1024 + } + tables { + preamble { + id: 48011802 + name: "FabricIngress.pre_next.next_vlan" + alias: "next_vlan" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 33475378 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 333692067 + size: 1024 + } + tables { + preamble { + id: 44104738 + name: "FabricIngress.acl.acl" + alias: "acl" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "eth_dst" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 3 + name: "eth_src" + bitwidth: 48 + match_type: TERNARY + } + match_fields { + id: 4 + name: "vlan_id" + bitwidth: 12 + match_type: TERNARY + } + match_fields { + id: 5 + name: "eth_type" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 7 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 8 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 9 + name: "icmp_type" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 10 + name: "icmp_code" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 11 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 12 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 13 + name: "ig_port_type" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 23623126 + } + action_refs { + id: 23579892 + } + action_refs { + id: 21161133 + } + action_refs { + id: 23570973 + } + action_refs { + id: 24507494 + } + action_refs { + id: 29607214 + } + const_default_action_id: 29607214 + direct_resource_ids: 319194241 + size: 1024 + } + tables { + preamble { + id: 47960972 + name: "FabricIngress.next.hashed" + alias: "hashed" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 27301117 + } + action_refs { + id: 20985706 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + implementation_id: 289544276 + direct_resource_ids: 322798228 + size: 1024 + } + tables { + preamble { + id: 40619180 + name: "FabricIngress.next.multicast" + alias: "multicast" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 21629581 + } + action_refs { + id: 23637707 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 23637707 + direct_resource_ids: 319194968 + size: 1024 + } + tables { + preamble { + id: 34606298 + name: "FabricIngress.slice_tc_classifier.classifier" + alias: "classifier" + } + match_fields { + id: 1 + name: "ig_port" + bitwidth: 9 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: TERNARY + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: TERNARY + } + action_refs { + id: 23786376 + } + action_refs { + id: 25983516 + } + action_refs { + id: 30111108 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30111108 + direct_resource_ids: 334706097 + size: 512 + } + tables { + preamble { + id: 36435258 + name: "FabricIngress.qos.queues" + alias: "queues" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: EXACT + } + match_fields { + id: 2 + name: "color" + bitwidth: 2 + match_type: TERNARY + } + action_refs { + id: 32116918 + } + action_refs { + id: 28214351 + } + const_default_action_id: 32116918 + direct_resource_ids: 327743278 + size: 128 + } + tables { + preamble { + id: 43965782 + name: "FabricIngress.qos.default_tc" + alias: "default_tc" + } + match_fields { + id: 1 + name: "slice_tc" + bitwidth: 6 + match_type: TERNARY + } + match_fields { + id: 2 + name: "tc_unknown" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 23587909 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 16 + } + tables { + preamble { + id: 41155994 + name: "FabricIngress.upf.interfaces" + alias: "interfaces" + } + match_fields { + id: 1 + name: "ipv4_dst_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 2 + name: "gtpu_is_valid" + bitwidth: 1 + match_type: EXACT + } + action_refs { + id: 30131500 + } + action_refs { + id: 19786139 + } + action_refs { + id: 19466514 + } + action_refs { + id: 30204657 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30204657 + size: 64 + } + tables { + preamble { + id: 37952203 + name: "FabricIngress.upf.downlink_sessions" + alias: "downlink_sessions" + } + match_fields { + id: 1 + name: "ue_addr" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 16984383 + } + action_refs { + id: 31195396 + } + action_refs { + id: 21581660 + } + action_refs { + id: 24509779 + } + action_refs { + id: 32013192 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 32013192 + size: 100000 + } + tables { + preamble { + id: 45463032 + name: "FabricIngress.upf.uplink_sessions" + alias: "uplink_sessions" + } + match_fields { + id: 1 + name: "tunnel_ipv4_dst" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "teid" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 31219743 + } + action_refs { + id: 24328070 + } + action_refs { + id: 20368148 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20368148 + size: 100000 + } + tables { + preamble { + id: 50169666 + name: "FabricIngress.upf.uplink_terminations" + alias: "uplink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 25805419 + } + action_refs { + id: 28764209 + } + action_refs { + id: 20624836 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 20624836 + size: 100000 + } + tables { + preamble { + id: 35221941 + name: "FabricIngress.upf.downlink_terminations" + alias: "downlink_terminations" + } + match_fields { + id: 1 + name: "ue_session_id" + bitwidth: 32 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 23536134 + } + action_refs { + id: 30742995 + } + action_refs { + id: 26608757 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 26608757 + size: 100000 + } + tables { + preamble { + id: 48831175 + name: "FabricIngress.upf.ig_tunnel_peers" + alias: "ig_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 26011763 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 + } + tables { + preamble { + id: 46184415 + name: "FabricIngress.upf.applications" + alias: "applications" + } + match_fields { + id: 1 + name: "slice_id" + bitwidth: 4 + match_type: EXACT + } + match_fields { + id: 2 + name: "app_ipv4_addr" + bitwidth: 32 + match_type: LPM + } + match_fields { + id: 3 + name: "app_l4_port" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 4 + name: "app_ip_proto" + bitwidth: 8 + match_type: TERNARY + } + action_refs { + id: 26631629 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 5 + } + tables { + preamble { + id: 34400315 + name: "FabricIngress.upf.uplink_recirc_rules" + alias: "uplink_recirc_rules" + } + match_fields { + id: 1 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 2 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + action_refs { + id: 28119063 + } + action_refs { + id: 19222227 + } + action_refs { + id: 29186084 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 29186084 + direct_resource_ids: 335275671 + size: 64 + } + tables { + preamble { + id: 40748488 + name: "FabricIngress.int_watchlist.watchlist" + alias: "watchlist" + } + match_fields { + id: 1 + name: "ipv4_valid" + bitwidth: 1 + match_type: EXACT + } + match_fields { + id: 2 + name: "ipv4_src" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 3 + name: "ipv4_dst" + bitwidth: 32 + match_type: TERNARY + } + match_fields { + id: 4 + name: "ip_proto" + bitwidth: 8 + match_type: TERNARY + } + match_fields { + id: 5 + name: "l4_sport" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 6 + name: "l4_dport" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 25078550 + } + action_refs { + id: 20118842 + } + action_refs { + id: 28396787 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28396787 + direct_resource_ids: 328581521 + size: 64 + } + tables { + preamble { + id: 43851059 + name: "FabricEgress.stats.flows" + alias: "FabricEgress.stats.flows" + } + match_fields { + id: 1 + name: "stats_flow_id" + bitwidth: 10 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 26838724 + } + const_default_action_id: 26838724 + direct_resource_ids: 334508337 + size: 1024 + } + tables { + preamble { + id: 35217901 + name: "FabricEgress.pkt_io_egress.switch_info" + alias: "switch_info" + } + action_refs { + id: 32804382 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 + } + tables { + preamble { + id: 49262446 + name: "FabricEgress.egress_next.egress_vlan" + alias: "egress_vlan" + } + match_fields { + id: 1 + name: "vlan_id" + bitwidth: 12 + match_type: EXACT + } + match_fields { + id: 2 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 30307755 + } + action_refs { + id: 17183246 + } + action_refs { + id: 30812542 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 30812542 + direct_resource_ids: 318892680 + size: 1024 + } + tables { + preamble { + id: 49970092 + name: "FabricEgress.dscp_rewriter.rewriter" + alias: "rewriter" + } + match_fields { + id: 1 + name: "eg_port" + bitwidth: 9 + match_type: EXACT + } + action_refs { + id: 27951287 + } + action_refs { + id: 24120545 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 512 + } + tables { + preamble { + id: 37756041 + name: "FabricEgress.upf.eg_tunnel_peers" + alias: "eg_tunnel_peers" + } + match_fields { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + match_type: EXACT + } + action_refs { + id: 28490145 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + size: 256 + } + tables { + preamble { + id: 35202849 + name: "FabricEgress.upf.gtpu_encap" + alias: "gtpu_encap" + } + action_refs { + id: 18154440 + } + action_refs { + id: 25872588 + } + size: 1 + } + tables { + preamble { + id: 36860953 + name: "FabricEgress.int_egress.queue_latency_thresholds" + alias: "queue_latency_thresholds" + } + match_fields { + id: 1 + name: "egress_qid" + bitwidth: 5 + match_type: EXACT + } + match_fields { + id: 2 + name: "hop_latency_upper" + bitwidth: 16 + match_type: RANGE + } + match_fields { + id: 3 + name: "hop_latency_lower" + bitwidth: 16 + match_type: RANGE + } + action_refs { + id: 22415037 + } + action_refs { + id: 19702294 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 128 + } + tables { + preamble { + id: 40475827 + name: "FabricEgress.int_egress.config" + alias: "config" + } + action_refs { + id: 22425991 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + size: 1 + } + tables { + preamble { + id: 46071383 + name: "FabricEgress.int_egress.report" + alias: "report" + } + match_fields { + id: 1 + name: "bmd_type" + bitwidth: 8 + match_type: EXACT + } + match_fields { + id: 2 + name: "mirror_type" + bitwidth: 3 + match_type: EXACT + } + match_fields { + id: 3 + name: "int_report_type" + bitwidth: 3 + match_type: EXACT + } + action_refs { + id: 30783845 + } + action_refs { + id: 22769901 + } + action_refs { + id: 32486459 + } + action_refs { + id: 25343592 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + direct_resource_ids: 325056546 + size: 6 + } + actions { + preamble { + id: 28485346 + name: "nop" + alias: "nop" + } + } + actions { + preamble { + id: 21257015 + name: "NoAction" + alias: "NoAction" + annotations: "@noWarn(\"unused\")" + } + } + actions { + preamble { + id: 21929788 + name: "FabricIngress.stats.count" + alias: "FabricIngress.stats.count" + } + params { + id: 1 + name: "flow_id" + bitwidth: 10 + } + } + actions { + preamble { + id: 17164167 + name: "FabricIngress.filtering.deny" + alias: "deny" + } + } + actions { + preamble { + id: 24158268 + name: "FabricIngress.filtering.permit" + alias: "permit" + } + params { + id: 1 + name: "port_type" + bitwidth: 2 + } + } + actions { + preamble { + id: 24266015 + name: "FabricIngress.filtering.permit_with_internal_vlan" + alias: "permit_with_internal_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + params { + id: 2 + name: "port_type" + bitwidth: 2 + } + } + actions { + preamble { + id: 25032921 + name: "FabricIngress.filtering.set_forwarding_type" + alias: "set_forwarding_type" + } + params { + id: 1 + name: "fwd_type" + bitwidth: 3 + } + } + actions { + preamble { + id: 29734112 + name: "FabricIngress.forwarding.set_int_drop_reason" + alias: "set_int_drop_reason" + } + params { + id: 1 + name: "drop_reason" + bitwidth: 8 + } + } + actions { + preamble { + id: 21791748 + name: "FabricIngress.forwarding.set_next_id_bridging" + alias: "set_next_id_bridging" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 30066030 + name: "FabricIngress.forwarding.pop_mpls_and_next" + alias: "pop_mpls_and_next" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 19792090 + name: "FabricIngress.forwarding.set_next_id_routing_v4" + alias: "set_next_id_routing_v4" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 29124955 + name: "FabricIngress.forwarding.nop_routing_v4" + alias: "nop_routing_v4" + } + } + actions { + preamble { + id: 17639597 + name: "FabricIngress.forwarding.drop_routing_v4" + alias: "drop_routing_v4" + } + } + actions { + preamble { + id: 21856023 + name: "FabricIngress.forwarding.set_next_id_routing_v6" + alias: "set_next_id_routing_v6" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 24646532 + name: "FabricIngress.forwarding.drop_routing_v6" + alias: "drop_routing_v6" + } + } + actions { + preamble { + id: 22765924 + name: "FabricIngress.pre_next.set_mpls_label" + alias: "set_mpls_label" + } + params { + id: 1 + name: "label" + bitwidth: 20 + } + } + actions { + preamble { + id: 33475378 + name: "FabricIngress.pre_next.set_vlan" + alias: "set_vlan" + } + params { + id: 1 + name: "vlan_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 23623126 + name: "FabricIngress.acl.set_next_id_acl" + alias: "set_next_id_acl" + } + params { + id: 1 + name: "next_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 21161133 + name: "FabricIngress.acl.copy_to_cpu" + alias: "copy_to_cpu" + } + } + actions { + preamble { + id: 23579892 + name: "FabricIngress.acl.punt_to_cpu" + alias: "punt_to_cpu" + } + } + actions { + preamble { + id: 23570973 + name: "FabricIngress.acl.drop" + alias: "acl.drop" + } + } + actions { + preamble { + id: 24507494 + name: "FabricIngress.acl.set_output_port" + alias: "set_output_port" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 29607214 + name: "FabricIngress.acl.nop_acl" + alias: "nop_acl" + } + } + actions { + preamble { + id: 27301117 + name: "FabricIngress.next.output_hashed" + alias: "output_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 20985706 + name: "FabricIngress.next.routing_hashed" + alias: "routing_hashed" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + params { + id: 2 + name: "smac" + bitwidth: 48 + } + params { + id: 3 + name: "dmac" + bitwidth: 48 + } + } + actions { + preamble { + id: 21629581 + name: "FabricIngress.next.set_mcast_group_id" + alias: "set_mcast_group_id" + } + params { + id: 1 + name: "group_id" + bitwidth: 16 + } + } + actions { + preamble { + id: 23637707 + name: "FabricIngress.next.reset_mcast_group_id" + alias: "reset_mcast_group_id" + } + } + actions { + preamble { + id: 23786376 + name: "FabricIngress.slice_tc_classifier.set_slice_id_tc" + alias: "set_slice_id_tc" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + } + actions { + preamble { + id: 30111108 + name: "FabricIngress.slice_tc_classifier.no_classification" + alias: "no_classification" + } + } + actions { + preamble { + id: 25983516 + name: "FabricIngress.slice_tc_classifier.trust_dscp" + alias: "trust_dscp" + } + } + actions { + preamble { + id: 32116918 + name: "FabricIngress.qos.set_queue" + alias: "set_queue" + } + params { + id: 1 + name: "qid" + bitwidth: 5 + } + } + actions { + preamble { + id: 28214351 + name: "FabricIngress.qos.meter_drop" + alias: "meter_drop" + } + } + actions { + preamble { + id: 23587909 + name: "FabricIngress.qos.set_default_tc" + alias: "set_default_tc" + } + params { + id: 1 + name: "tc" + bitwidth: 2 + } + } + actions { + preamble { + id: 30131500 + name: "FabricIngress.upf.iface_access" + alias: "iface_access" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 19786139 + name: "FabricIngress.upf.iface_core" + alias: "iface_core" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 19466514 + name: "FabricIngress.upf.iface_dbuf" + alias: "iface_dbuf" + } + params { + id: 1 + name: "slice_id" + bitwidth: 4 + } + } + actions { + preamble { + id: 30204657 + name: "FabricIngress.upf.iface_miss" + alias: "iface_miss" + } + } + actions { + preamble { + id: 20368148 + name: "FabricIngress.upf.set_uplink_session_miss" + alias: "set_uplink_session_miss" + } + } + actions { + preamble { + id: 24328070 + name: "FabricIngress.upf.set_uplink_session_drop" + alias: "set_uplink_session_drop" + } + } + actions { + preamble { + id: 32013192 + name: "FabricIngress.upf.set_downlink_session_miss" + alias: "set_downlink_session_miss" + } + } + actions { + preamble { + id: 24509779 + name: "FabricIngress.upf.set_downlink_session_drop" + alias: "set_downlink_session_drop" + } + } + actions { + preamble { + id: 16984383 + name: "FabricIngress.upf.set_downlink_session" + alias: "set_downlink_session" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 31195396 + name: "FabricIngress.upf.set_downlink_session_buf" + alias: "set_downlink_session_buf" + } + params { + id: 1 + name: "tun_peer_id" + bitwidth: 8 + } + params { + id: 2 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 21581660 + name: "FabricIngress.upf.set_downlink_session_buf_drop" + alias: "set_downlink_session_buf_drop" + } + } + actions { + preamble { + id: 31219743 + name: "FabricIngress.upf.set_uplink_session" + alias: "set_uplink_session" + } + params { + id: 1 + name: "session_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 20624836 + name: "FabricIngress.upf.uplink_drop_miss" + alias: "uplink_drop_miss" + } + } + actions { + preamble { + id: 26608757 + name: "FabricIngress.upf.downlink_drop_miss" + alias: "downlink_drop_miss" + } + } + actions { + preamble { + id: 28764209 + name: "FabricIngress.upf.uplink_drop" + alias: "uplink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 30742995 + name: "FabricIngress.upf.downlink_drop" + alias: "downlink_drop" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + } + actions { + preamble { + id: 25805419 + name: "FabricIngress.upf.app_fwd" + alias: "app_fwd" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "app_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 23536134 + name: "FabricIngress.upf.downlink_fwd_encap" + alias: "downlink_fwd_encap" + } + params { + id: 1 + name: "ctr_id" + bitwidth: 12 + } + params { + id: 2 + name: "tc" + bitwidth: 2 + } + params { + id: 3 + name: "teid" + bitwidth: 32 + } + params { + id: 4 + name: "qfi" + bitwidth: 6 + } + params { + id: 5 + name: "app_meter_idx" + bitwidth: 15 + } + } + actions { + preamble { + id: 26011763 + name: "FabricIngress.upf.set_routing_ipv4_dst" + alias: "set_routing_ipv4_dst" + } + params { + id: 1 + name: "tun_dst_addr" + bitwidth: 32 + } + } + actions { + preamble { + id: 26631629 + name: "FabricIngress.upf.set_app_id" + alias: "set_app_id" + } + params { + id: 1 + name: "app_id" + bitwidth: 8 + } + } + actions { + preamble { + id: 28119063 + name: "FabricIngress.upf.recirc_allow" + alias: "recirc_allow" + } + } + actions { + preamble { + id: 19222227 + name: "FabricIngress.upf.recirc_deny" + alias: "recirc_deny" + } + } + actions { + preamble { + id: 29186084 + name: "FabricIngress.upf.recirc_miss" + alias: "recirc_miss" + } + } + actions { + preamble { + id: 25078550 + name: "FabricIngress.int_watchlist.mark_to_report" + alias: "mark_to_report" + } + } + actions { + preamble { + id: 28396787 + name: "FabricIngress.int_watchlist.no_report" + alias: "no_report" + } + } + actions { + preamble { + id: 20118842 + name: "FabricIngress.int_watchlist.no_report_collector" + alias: "no_report_collector" + } + } + actions { + preamble { + id: 26838724 + name: "FabricEgress.stats.count" + alias: "FabricEgress.stats.count" + } + } + actions { + preamble { + id: 32804382 + name: "FabricEgress.pkt_io_egress.set_switch_info" + alias: "set_switch_info" + } + params { + id: 1 + name: "cpu_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + } + actions { + preamble { + id: 30307755 + name: "FabricEgress.egress_next.push_vlan" + alias: "push_vlan" + } + } + actions { + preamble { + id: 17183246 + name: "FabricEgress.egress_next.pop_vlan" + alias: "pop_vlan" + } + } + actions { + preamble { + id: 30812542 + name: "FabricEgress.egress_next.drop" + alias: "egress_next.drop" + } + } + actions { + preamble { + id: 27951287 + name: "FabricEgress.dscp_rewriter.rewrite" + alias: "rewrite" + } + } + actions { + preamble { + id: 24120545 + name: "FabricEgress.dscp_rewriter.clear" + alias: "clear" + } + } + actions { + preamble { + id: 28490145 + name: "FabricEgress.upf.load_tunnel_params" + alias: "load_tunnel_params" + } + params { + id: 1 + name: "tunnel_src_port" + bitwidth: 16 + } + params { + id: 2 + name: "tunnel_src_addr" + bitwidth: 32 + } + params { + id: 3 + name: "tunnel_dst_addr" + bitwidth: 32 + } + } + actions { + preamble { + id: 18154440 + name: "FabricEgress.upf.gtpu_only" + alias: "gtpu_only" + } + } + actions { + preamble { + id: 25872588 + name: "FabricEgress.upf.gtpu_with_psc" + alias: "gtpu_with_psc" + } + } + actions { + preamble { + id: 22415037 + name: "FabricEgress.int_egress.check_quota" + alias: "check_quota" + } + } + actions { + preamble { + id: 19702294 + name: "FabricEgress.int_egress.reset_quota" + alias: "reset_quota" + } + } + actions { + preamble { + id: 22425991 + name: "FabricEgress.int_egress.set_config" + alias: "set_config" + } + params { + id: 1 + name: "hop_latency_mask" + bitwidth: 32 + } + params { + id: 2 + name: "timestamp_mask" + bitwidth: 48 + } + } + actions { + preamble { + id: 30783845 + name: "FabricEgress.int_egress.do_local_report_encap" + alias: "do_local_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 22769901 + name: "FabricEgress.int_egress.do_local_report_encap_mpls" + alias: "do_local_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 32486459 + name: "FabricEgress.int_egress.do_drop_report_encap" + alias: "do_drop_report_encap" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "switch_id" + bitwidth: 32 + } + } + actions { + preamble { + id: 25343592 + name: "FabricEgress.int_egress.do_drop_report_encap_mpls" + alias: "do_drop_report_encap_mpls" + } + params { + id: 1 + name: "src_ip" + bitwidth: 32 + } + params { + id: 2 + name: "mon_ip" + bitwidth: 32 + } + params { + id: 3 + name: "mon_port" + bitwidth: 16 + } + params { + id: 4 + name: "mon_label" + bitwidth: 20 + } + params { + id: 5 + name: "switch_id" + bitwidth: 32 + } + } + action_profiles { + preamble { + id: 289544276 + name: "FabricIngress.next.hashed_profile" + alias: "hashed_profile" + } + table_ids: 47960972 + with_selector: true + size: 16 + max_group_size: 16 + } + counters { + preamble { + id: 309010261 + name: "FabricIngress.filtering.fwd_type_counter" + alias: "fwd_type_counter" + } + spec { + unit: BOTH + } + size: 8 + } + counters { + preamble { + id: 316677328 + name: "FabricIngress.upf.terminations_counter" + alias: "FabricIngress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 + } + counters { + preamble { + id: 314209362 + name: "FabricEgress.upf.terminations_counter" + alias: "FabricEgress.upf.terminations_counter" + } + spec { + unit: BOTH + } + size: 4096 + } + direct_counters { + preamble { + id: 333776332 + name: "FabricIngress.stats.flow_counter" + alias: "FabricIngress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41243186 + } + direct_counters { + preamble { + id: 326221069 + name: "FabricIngress.filtering.ingress_port_vlan_counter" + alias: "ingress_port_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43310977 + } + direct_counters { + preamble { + id: 335473470 + name: "FabricIngress.filtering.fwd_classifier_counter" + alias: "fwd_classifier_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49718154 + } + direct_counters { + preamble { + id: 330959985 + name: "FabricIngress.forwarding.bridging_counter" + alias: "bridging_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43623757 + } + direct_counters { + preamble { + id: 318961579 + name: "FabricIngress.forwarding.mpls_counter" + alias: "mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 37768578 + } + direct_counters { + preamble { + id: 333425635 + name: "FabricIngress.forwarding.routing_v4_counter" + alias: "routing_v4_counter" + } + spec { + unit: BOTH + } + direct_table_id: 41754650 + } + direct_counters { + preamble { + id: 324042090 + name: "FabricIngress.forwarding.routing_v6_counter" + alias: "routing_v6_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49342721 + } + direct_counters { + preamble { + id: 330020245 + name: "FabricIngress.pre_next.next_mpls_counter" + alias: "next_mpls_counter" + } + spec { + unit: BOTH + } + direct_table_id: 36626242 + } + direct_counters { + preamble { + id: 333692067 + name: "FabricIngress.pre_next.next_vlan_counter" + alias: "next_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 48011802 + } + direct_counters { + preamble { + id: 319194241 + name: "FabricIngress.acl.acl_counter" + alias: "acl_counter" + } + spec { + unit: BOTH + } + direct_table_id: 44104738 + } + direct_counters { + preamble { + id: 322798228 + name: "FabricIngress.next.hashed_counter" + alias: "hashed_counter" + } + spec { + unit: BOTH + } + direct_table_id: 47960972 + } + direct_counters { + preamble { + id: 319194968 + name: "FabricIngress.next.multicast_counter" + alias: "multicast_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40619180 + } + direct_counters { + preamble { + id: 334706097 + name: "FabricIngress.slice_tc_classifier.classifier_stats" + alias: "classifier_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34606298 + } + direct_counters { + preamble { + id: 327743278 + name: "FabricIngress.qos.queues_stats" + alias: "queues_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 36435258 + } + direct_counters { + preamble { + id: 335275671 + name: "FabricIngress.upf.recirc_stats" + alias: "recirc_stats" + } + spec { + unit: PACKETS + } + direct_table_id: 34400315 + } + direct_counters { + preamble { + id: 328581521 + name: "FabricIngress.int_watchlist.watchlist_counter" + alias: "watchlist_counter" + } + spec { + unit: BOTH + } + direct_table_id: 40748488 + } + direct_counters { + preamble { + id: 334508337 + name: "FabricEgress.stats.flow_counter" + alias: "FabricEgress.stats.flow_counter" + } + spec { + unit: BOTH + } + direct_table_id: 43851059 + } + direct_counters { + preamble { + id: 318892680 + name: "FabricEgress.egress_next.egress_vlan_counter" + alias: "egress_vlan_counter" + } + spec { + unit: BOTH + } + direct_table_id: 49262446 + } + direct_counters { + preamble { + id: 325056546 + name: "FabricEgress.int_egress.report_counter" + alias: "report_counter" + } + spec { + unit: BOTH + } + direct_table_id: 46071383 + } + meters { + preamble { + id: 348573637 + name: "FabricIngress.qos.slice_tc_meter" + alias: "slice_tc_meter" + } + spec { + unit: BYTES + } + size: 64 + } + meters { + preamble { + id: 345152250 + name: "FabricIngress.upf.session_meter" + alias: "session_meter" + } + spec { + unit: BYTES + } + size: 20000 + } + meters { + preamble { + id: 343216442 + name: "FabricIngress.upf.app_meter" + alias: "app_meter" + } + spec { + unit: BYTES + } + size: 20000 + } + controller_packet_metadata { + preamble { + id: 81826293 + name: "packet_in" + alias: "packet_in" + annotations: "@controller_header(\"packet_in\")" + } + metadata { + id: 1 + name: "ingress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 2 + name: "_pad0" + bitwidth: 7 + } + } + controller_packet_metadata { + preamble { + id: 76689799 + name: "packet_out" + alias: "packet_out" + annotations: "@controller_header(\"packet_out\")" + } + metadata { + id: 1 + name: "pad0" + annotations: "@padding" + bitwidth: 7 + } + metadata { + id: 2 + name: "egress_port" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } + metadata { + id: 3 + name: "pad1" + annotations: "@padding" + bitwidth: 3 + } + metadata { + id: 4 + name: "queue_id" + bitwidth: 5 + } + metadata { + id: 5 + name: "pad2" + annotations: "@padding" + bitwidth: 5 + } + metadata { + id: 6 + name: "cpu_loopback_mode" + bitwidth: 2 + } + metadata { + id: 7 + name: "do_forwarding" + bitwidth: 1 + } + metadata { + id: 8 + name: "pad3" + annotations: "@padding" + bitwidth: 16 + } + metadata { + id: 9 + name: "pad4" + annotations: "@padding" + bitwidth: 48 + } + metadata { + id: 10 + name: "ether_type" + bitwidth: 16 + } + } + registers { + preamble { + id: 376533241 + name: "FabricEgress.int_egress.seq_number" + alias: "seq_number" + annotations: "@hidden" + } + type_spec { + bitstring { + bit { + bitwidth: 32 + } + } + } + size: 1024 + } + type_info { + serializable_enums { + key: "BridgedMdType_t" + value { + underlying_type { + bitwidth: 8 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INGRESS_TO_EGRESS" + value: "\001" + } + members { + name: "EGRESS_MIRROR" + value: "\002" + } + members { + name: "INGRESS_MIRROR" + value: "\003" + } + members { + name: "INT_INGRESS_DROP" + value: "\004" + } + members { + name: "DEFLECTED" + value: "\005" + } + } + } + serializable_enums { + key: "CpuLoopbackMode_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "DISABLED" + value: "\000" + } + members { + name: "DIRECT" + value: "\001" + } + members { + name: "INGRESS" + value: "\002" + } + } + } + serializable_enums { + key: "FabricMirrorType_t" + value { + underlying_type { + bitwidth: 3 + } + members { + name: "INVALID" + value: "\000" + } + members { + name: "INT_REPORT" + value: "\001" + } + members { + name: "PACKET_IN" + value: "\002" + } + } + } + serializable_enums { + key: "PortType_t" + value { + underlying_type { + bitwidth: 2 + } + members { + name: "UNKNOWN" + value: "\000" + } + members { + name: "EDGE" + value: "\001" + } + members { + name: "INFRA" + value: "\002" + } + members { + name: "INTERNAL" + value: "\003" + } + } + } + new_types { + key: "FabricPortId_t" + value { + original_type { + bitstring { + bit { + bitwidth: 9 + } + } + } + } + } + } + } + p4_device_config: "{\n \"header_types\" : [\n {\n \"name\" : \"scalars_0\",\n \"id\" : 0,\n \"fields\" : [\n [\"tmp_2\", 16, false],\n [\"tmp_4\", 1, false],\n [\"tmp_6\", 16, false],\n [\"tmp_12\", 3, false],\n [\"tmp_13\", 8, false],\n [\"gtpu_ext_len_0\", 8, false],\n [\"tmp_3\", 16, false],\n [\"tmp_5\", 16, false],\n [\"tmp_7\", 4, false],\n [\"tmp_8\", 112, false],\n [\"tmp_9\", 112, false],\n [\"tmp_10\", 112, false],\n [\"tmp_11\", 64, false],\n [\"tmp_14\", 32, false],\n [\"tmp_15\", 32, false],\n [\"tmp_16\", 32, false],\n [\"tmp_17\", 32, false],\n [\"tmp_18\", 8, false],\n [\"tmp_19\", 32, false],\n [\"tmp_20\", 32, false],\n [\"tmp_21\", 32, false],\n [\"tmp_22\", 32, false],\n [\"tmp_23\", 48, false],\n [\"tmp_24\", 48, false],\n [\"tmp_25\", 16, false],\n [\"tmp_26\", 32, false],\n [\"tmp_27\", 32, false],\n [\"tmp_28\", 8, false],\n [\"tmp_29\", 16, false],\n [\"tmp_30\", 16, false],\n [\"tmp_31\", 32, false],\n [\"qos_packet_color\", 2, false],\n [\"upf_is_uplink\", 1, false],\n [\"upf_term_hit\", 1, false],\n [\"upf_sess_hit\", 1, false],\n [\"upf_app_ipv4_addr\", 32, false],\n [\"upf_app_l4_port\", 16, false],\n [\"upf_app_ip_proto\", 8, false],\n [\"upf_internal_app_id\", 8, false],\n [\"upf_ue_session_id\", 32, false],\n [\"upf_session_meter_idx_internal\", 15, false],\n [\"upf_app_meter_idx_internal\", 15, false],\n [\"tmp_32\", 32, false],\n [\"tmp_33\", 32, false],\n [\"tmp_34\", 32, false],\n [\"tmp_35\", 32, false],\n [\"tmp_36\", 32, false],\n [\"tmp_37\", 32, false],\n [\"tmp_38\", 32, false],\n [\"tmp_39\", 32, false],\n [\"tmp_40\", 32, false],\n [\"tmp_41\", 32, false],\n [\"dscp_rewriter_tmp_dscp\", 6, false],\n [\"int_egress_fabric_md_pkt_length\", 16, false],\n [\"int_egress_egress_qid\", 5, false],\n [\"int_egress_reg\", 32, false],\n [\"key_0\", 16, false],\n [\"key_1\", 16, false],\n [\"userMetadata._skip_egress0\", 1, false],\n [\"userMetadata._do_upf_uplink_recirc1\", 1, false],\n [\"userMetadata._drop_ctl2\", 1, false],\n [\"userMetadata._int_mirror_type3\", 3, false],\n [\"userMetadata._ingress_ecmp_hash5\", 32, false],\n [\"userMetadata._ingress_lkp_eth_dst6\", 48, false],\n [\"userMetadata._ingress_lkp_eth_src7\", 48, false],\n [\"userMetadata._ingress_lkp_eth_type8\", 16, false],\n [\"userMetadata._ingress_lkp_vlan_id9\", 12, false],\n [\"userMetadata._ingress_lkp_is_ipv410\", 1, false],\n [\"userMetadata._ingress_lkp_ipv4_src11\", 32, false],\n [\"userMetadata._ingress_lkp_ipv4_dst12\", 32, false],\n [\"userMetadata._ingress_lkp_ip_proto13\", 8, false],\n [\"userMetadata._ingress_lkp_l4_sport14\", 16, false],\n [\"userMetadata._ingress_lkp_l4_dport15\", 16, false],\n [\"userMetadata._ingress_lkp_icmp_type16\", 8, false],\n [\"userMetadata._ingress_lkp_icmp_code17\", 8, false],\n [\"userMetadata._ingress_routing_ipv4_dst18\", 32, false],\n [\"userMetadata._ingress_skip_forwarding19\", 1, false],\n [\"userMetadata._ingress_skip_next20\", 1, false],\n [\"userMetadata._ingress_next_id21\", 32, false],\n [\"userMetadata._ingress_egress_port_set22\", 1, false],\n [\"userMetadata._ingress_punt_to_cpu23\", 1, false],\n [\"userMetadata._ingress_ipv4_checksum_err24\", 1, false],\n [\"userMetadata._ingress_inner_ipv4_checksum_err25\", 1, false],\n [\"userMetadata._ingress_slice_id26\", 4, false],\n [\"userMetadata._ingress_tc27\", 2, false],\n [\"userMetadata._ingress_tc_unknown28\", 1, false],\n [\"userMetadata._ingress_is_upf_hit29\", 1, false],\n [\"userMetadata._ingress_upf_slice_id30\", 4, false],\n [\"userMetadata._ingress_upf_tc31\", 2, false],\n [\"userMetadata._ingress_upf_meter_color32\", 2, false],\n [\"userMetadata._ingress_ig_port_type33\", 2, false],\n [\"userMetadata._ingress_mirror_mirror_session_id34\", 10, false],\n [\"userMetadata._ingress_mirror_bmd_type35\", 8, false],\n [\"userMetadata._egress_cpu_port37\", 9, false],\n [\"userMetadata._egress_inner_ipv4_checksum_err38\", 1, false],\n [\"userMetadata._egress_int_md_hop_latency40\", 32, false],\n [\"userMetadata._egress_int_md_timestamp41\", 48, false],\n [\"userMetadata._egress_int_md_vlan_stripped42\", 1, false],\n [\"userMetadata._egress_int_md_queue_report43\", 1, false],\n [\"userMetadata._egress_int_ipv4_len44\", 16, false],\n [\"userMetadata._egress_is_int_recirc45\", 1, false],\n [\"userMetadata._egress_pkt_length46\", 16, false],\n [\"userMetadata._recirc_preserved_report_type47\", 3, false],\n [\"userMetadata._recirc_preserved_egress_port48\", 9, false],\n [\"userMetadata._recirc_preserved_drop_reason49\", 8, false],\n [\"userMetadata._recirc_preserved_ingress_port50\", 9, false],\n [\"_padding_1\", 3, false]\n ]\n },\n {\n \"name\" : \"fake_ethernet_t\",\n \"id\" : 1,\n \"fields\" : [\n [\"_pad0\", 48, false],\n [\"_pad1\", 48, false],\n [\"ether_type\", 16, false]\n ]\n },\n {\n \"name\" : \"packet_out_header_t\",\n \"id\" : 2,\n \"fields\" : [\n [\"pad0\", 7, false],\n [\"egress_port\", 9, false],\n [\"pad1\", 3, false],\n [\"queue_id\", 5, false],\n [\"pad2\", 5, false],\n [\"cpu_loopback_mode\", 2, false],\n [\"do_forwarding\", 1, false],\n [\"pad3\", 16, false],\n [\"pad4\", 48, false],\n [\"ether_type\", 16, false]\n ]\n },\n {\n \"name\" : \"gtpu_t\",\n \"id\" : 3,\n \"fields\" : [\n [\"version\", 3, false],\n [\"pt\", 1, false],\n [\"spare\", 1, false],\n [\"ex_flag\", 1, false],\n [\"seq_flag\", 1, false],\n [\"npdu_flag\", 1, false],\n [\"msgtype\", 8, false],\n [\"msglen\", 16, false],\n [\"teid\", 32, false]\n ]\n },\n {\n \"name\" : \"ethernet_t\",\n \"id\" : 4,\n \"fields\" : [\n [\"dst_addr\", 48, false],\n [\"src_addr\", 48, false]\n ]\n },\n {\n \"name\" : \"eth_type_t\",\n \"id\" : 5,\n \"fields\" : [\n [\"value\", 16, false]\n ]\n },\n {\n \"name\" : \"ipv4_t\",\n \"id\" : 6,\n \"fields\" : [\n [\"version\", 4, false],\n [\"ihl\", 4, false],\n [\"dscp\", 6, false],\n [\"ecn\", 2, false],\n [\"total_len\", 16, false],\n [\"identification\", 16, false],\n [\"flags\", 3, false],\n [\"frag_offset\", 13, false],\n [\"ttl\", 8, false],\n [\"protocol\", 8, false],\n [\"hdr_checksum\", 16, false],\n [\"src_addr\", 32, false],\n [\"dst_addr\", 32, false]\n ]\n },\n {\n \"name\" : \"udp_t\",\n \"id\" : 7,\n \"fields\" : [\n [\"sport\", 16, false],\n [\"dport\", 16, false],\n [\"len\", 16, false],\n [\"checksum\", 16, false]\n ]\n },\n {\n \"name\" : \"report_fixed_header_t\",\n \"id\" : 8,\n \"fields\" : [\n [\"ver\", 4, false],\n [\"nproto\", 4, false],\n [\"dqf\", 3, false],\n [\"rsvd\", 15, false],\n [\"hw_id\", 6, false],\n [\"seq_no\", 32, false],\n [\"ig_tstamp\", 32, false]\n ]\n },\n {\n \"name\" : \"common_report_header_t\",\n \"id\" : 9,\n \"fields\" : [\n [\"switch_id\", 32, false],\n [\"pad1\", 7, false],\n [\"ig_port\", 9, false],\n [\"pad2\", 7, false],\n [\"eg_port\", 9, false],\n [\"pad3\", 3, false],\n [\"queue_id\", 5, false]\n ]\n },\n {\n \"name\" : \"local_report_header_t\",\n \"id\" : 10,\n \"fields\" : [\n [\"pad1\", 5, false],\n [\"queue_occupancy\", 19, false],\n [\"eg_tstamp\", 32, false]\n ]\n },\n {\n \"name\" : \"drop_report_header_t\",\n \"id\" : 11,\n \"fields\" : [\n [\"drop_reason\", 8, false],\n [\"pad\", 16, false]\n ]\n },\n {\n \"name\" : \"mpls_t\",\n \"id\" : 12,\n \"fields\" : [\n [\"label\", 20, false],\n [\"tc\", 3, false],\n [\"bos\", 1, false],\n [\"ttl\", 8, false]\n ]\n },\n {\n \"name\" : \"bridged_metadata_t\",\n \"id\" : 13,\n \"fields\" : [\n [\"_bmd_type0\", 8, false],\n [\"_base_inner_hash1\", 32, false],\n [\"_base_mpls_label2\", 20, false],\n [\"_base_ig_port3\", 9, false],\n [\"_base_is_multicast4\", 1, 0],\n [\"_base_fwd_type5\", 3, false],\n [\"_base_vlan_id6\", 12, false],\n [\"_base_encap_presence7\", 2, false],\n [\"_base_mpls_ttl8\", 8, false],\n [\"_base_ig_tstamp9\", 48, false],\n [\"_base_ip_eth_type10\", 16, false],\n [\"_base_stats_flow_id11\", 10, false],\n [\"_base_slice_tc12\", 6, false],\n [\"_upf_tun_peer_id13\", 8, false],\n [\"_upf_upf_ctr_id14\", 12, false],\n [\"_upf_qfi15\", 6, false],\n [\"_upf_needs_gtpu_encap16\", 1, 0],\n [\"_upf_skip_upf17\", 1, 0],\n [\"_upf_skip_egress_upf_ctr18\", 1, 0],\n [\"_upf_teid19\", 32, false],\n [\"_upf__pad20\", 4, false],\n [\"_int_bmd_report_type21\", 3, false],\n [\"_int_bmd_mirror_session_id22\", 10, false],\n [\"_int_bmd_drop_reason23\", 8, false],\n [\"_int_bmd_queue_id24\", 5, false],\n [\"_int_bmd_egress_port25\", 9, false],\n [\"_int_bmd_wip_type26\", 8, false],\n [\"__pad027\", 1, false],\n [\"__pad128\", 7, false],\n [\"__pad229\", 5, false]\n ]\n },\n {\n \"name\" : \"int_report_metadata_t\",\n \"id\" : 14,\n \"fields\" : [\n [\"bmd_type\", 8, false],\n [\"_pad0\", 5, false],\n [\"mirror_type\", 3, false],\n [\"_pad1\", 7, false],\n [\"ig_port\", 9, false],\n [\"_pad2\", 7, false],\n [\"eg_port\", 9, false],\n [\"_pad3\", 3, false],\n [\"queue_id\", 5, false],\n [\"_pad4\", 5, false],\n [\"queue_occupancy\", 19, false],\n [\"ig_tstamp\", 32, false],\n [\"eg_tstamp\", 32, false],\n [\"drop_reason\", 8, false],\n [\"ip_eth_type\", 16, false],\n [\"_pad5\", 6, false],\n [\"encap_presence\", 2, false],\n [\"report_type\", 3, false],\n [\"_pad6\", 5, false],\n [\"flow_hash\", 32, false]\n ]\n },\n {\n \"name\" : \"int_metadata_t\",\n \"id\" : 15,\n \"fields\" : [\n [\"hop_latency\", 32, false],\n [\"timestamp\", 48, false],\n [\"vlan_stripped\", 1, 0],\n [\"queue_report\", 1, 0],\n [\"_padding\", 6, false]\n ]\n },\n {\n \"name\" : \"standard_metadata\",\n \"id\" : 16,\n \"fields\" : [\n [\"ingress_port\", 9, false],\n [\"egress_spec\", 9, false],\n [\"egress_port\", 9, false],\n [\"instance_type\", 32, false],\n [\"packet_length\", 32, false],\n [\"enq_timestamp\", 32, false],\n [\"enq_qdepth\", 19, false],\n [\"deq_timedelta\", 32, false],\n [\"deq_qdepth\", 19, false],\n [\"ingress_global_timestamp\", 48, false],\n [\"egress_global_timestamp\", 48, false],\n [\"mcast_grp\", 16, false],\n [\"egress_rid\", 16, false],\n [\"checksum_error\", 1, false],\n [\"parser_error\", 32, false],\n [\"priority\", 3, false],\n [\"_padding_0\", 3, false]\n ]\n },\n {\n \"name\" : \"packet_in_header_t\",\n \"id\" : 17,\n \"fields\" : [\n [\"ingress_port\", 9, false],\n [\"_pad0\", 7, false]\n ]\n },\n {\n \"name\" : \"vlan_tag_t\",\n \"id\" : 18,\n \"fields\" : [\n [\"eth_type\", 16, false],\n [\"pri\", 3, false],\n [\"cfi\", 1, false],\n [\"vlan_id\", 12, false]\n ]\n },\n {\n \"name\" : \"ipv6_t\",\n \"id\" : 19,\n \"fields\" : [\n [\"version\", 4, false],\n [\"traffic_class\", 8, false],\n [\"flow_label\", 20, false],\n [\"payload_len\", 16, false],\n [\"next_hdr\", 8, false],\n [\"hop_limit\", 8, false],\n [\"src_addr\", 128, false],\n [\"dst_addr\", 128, false]\n ]\n },\n {\n \"name\" : \"tcp_t\",\n \"id\" : 20,\n \"fields\" : [\n [\"sport\", 16, false],\n [\"dport\", 16, false]\n ]\n },\n {\n \"name\" : \"icmp_t\",\n \"id\" : 21,\n \"fields\" : [\n [\"icmp_type\", 8, false],\n [\"icmp_code\", 8, false]\n ]\n },\n {\n \"name\" : \"gtpu_options_t\",\n \"id\" : 22,\n \"fields\" : [\n [\"seq_num\", 16, false],\n [\"n_pdu_num\", 8, false],\n [\"next_ext\", 8, false]\n ]\n },\n {\n \"name\" : \"gtpu_ext_psc_t\",\n \"id\" : 23,\n \"fields\" : [\n [\"len\", 8, false],\n [\"type\", 4, false],\n [\"spare0\", 4, false],\n [\"ppp\", 1, false],\n [\"rqi\", 1, false],\n [\"qfi\", 6, false],\n [\"next_ext\", 8, false]\n ]\n },\n {\n \"name\" : \"vxlan_t\",\n \"id\" : 24,\n \"fields\" : [\n [\"flags\", 8, false],\n [\"reserved\", 24, false],\n [\"vni\", 24, false],\n [\"reserved_2\", 8, false]\n ]\n }\n ],\n \"headers\" : [\n {\n \"name\" : \"tmp\",\n \"id\" : 0,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"tmp_0\",\n \"id\" : 1,\n \"header_type\" : \"packet_out_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"tmp_1\",\n \"id\" : 2,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"gtpu_0\",\n \"id\" : 3,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_ethernet\",\n \"id\" : 4,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_eth_type\",\n \"id\" : 5,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_ipv4\",\n \"id\" : 6,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_udp\",\n \"id\" : 7,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_report_fixed_header\",\n \"id\" : 8,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_common_report_header\",\n \"id\" : 9,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_local_report_header\",\n \"id\" : 10,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"parser_emulator_hdr_drop_report_header\",\n \"id\" : 11,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_eth_type\",\n \"id\" : 12,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_mpls\",\n \"id\" : 13,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_ipv4\",\n \"id\" : 14,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_udp\",\n \"id\" : 15,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_report_fixed_header\",\n \"id\" : 16,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_common_report_header\",\n \"id\" : 17,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_local_report_header\",\n \"id\" : 18,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_drop_report_header\",\n \"id\" : 19,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_hdr_eth_type\",\n \"id\" : 20,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_bridged\",\n \"id\" : 21,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_int_report_md\",\n \"id\" : 22,\n \"header_type\" : \"int_report_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"int_egress_fabric_md_int_md\",\n \"id\" : 23,\n \"header_type\" : \"int_metadata_t\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"scalars\",\n \"id\" : 24,\n \"header_type\" : \"scalars_0\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"standard_metadata\",\n \"id\" : 25,\n \"header_type\" : \"standard_metadata\",\n \"metadata\" : true,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_packet_out0\",\n \"id\" : 26,\n \"header_type\" : \"packet_out_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_packet_in1\",\n \"id\" : 27,\n \"header_type\" : \"packet_in_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_fake_ethernet2\",\n \"id\" : 28,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ethernet3\",\n \"id\" : 29,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_vlan_tag4\",\n \"id\" : 30,\n \"header_type\" : \"vlan_tag_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_eth_type5\",\n \"id\" : 31,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_mpls6\",\n \"id\" : 32,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ipv47\",\n \"id\" : 33,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_ipv68\",\n \"id\" : 34,\n \"header_type\" : \"ipv6_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_tcp9\",\n \"id\" : 35,\n \"header_type\" : \"tcp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_udp10\",\n \"id\" : 36,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_icmp11\",\n \"id\" : 37,\n \"header_type\" : \"icmp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu12\",\n \"id\" : 38,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu_options13\",\n \"id\" : 39,\n \"header_type\" : \"gtpu_options_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_gtpu_ext_psc14\",\n \"id\" : 40,\n \"header_type\" : \"gtpu_ext_psc_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_vxlan15\",\n \"id\" : 41,\n \"header_type\" : \"vxlan_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_ethernet16\",\n \"id\" : 42,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_eth_type17\",\n \"id\" : 43,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_ipv418\",\n \"id\" : 44,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_tcp19\",\n \"id\" : 45,\n \"header_type\" : \"tcp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_udp20\",\n \"id\" : 46,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_inner_icmp21\",\n \"id\" : 47,\n \"header_type\" : \"icmp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_packet_in22\",\n \"id\" : 48,\n \"header_type\" : \"packet_in_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_fake_ethernet23\",\n \"id\" : 49,\n \"header_type\" : \"fake_ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_ethernet24\",\n \"id\" : 50,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_eth_type25\",\n \"id\" : 51,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_mpls26\",\n \"id\" : 52,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_ipv427\",\n \"id\" : 53,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_udp28\",\n \"id\" : 54,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_report_fixed_header29\",\n \"id\" : 55,\n \"header_type\" : \"report_fixed_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_common_report_header30\",\n \"id\" : 56,\n \"header_type\" : \"common_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_local_report_header31\",\n \"id\" : 57,\n \"header_type\" : \"local_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_drop_report_header32\",\n \"id\" : 58,\n \"header_type\" : \"drop_report_header_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ethernet33\",\n \"id\" : 59,\n \"header_type\" : \"ethernet_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_vlan_tag34\",\n \"id\" : 60,\n \"header_type\" : \"vlan_tag_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_eth_type35\",\n \"id\" : 61,\n \"header_type\" : \"eth_type_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_mpls36\",\n \"id\" : 62,\n \"header_type\" : \"mpls_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_ipv437\",\n \"id\" : 63,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_udp38\",\n \"id\" : 64,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu39\",\n \"id\" : 65,\n \"header_type\" : \"gtpu_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu_options40\",\n \"id\" : 66,\n \"header_type\" : \"gtpu_options_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_outer_gtpu_ext_psc41\",\n \"id\" : 67,\n \"header_type\" : \"gtpu_ext_psc_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ipv442\",\n \"id\" : 68,\n \"header_type\" : \"ipv4_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_ipv643\",\n \"id\" : 69,\n \"header_type\" : \"ipv6_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_udp44\",\n \"id\" : 70,\n \"header_type\" : \"udp_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_ingress_bridged4\",\n \"id\" : 71,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_bridged36\",\n \"id\" : 72,\n \"header_type\" : \"bridged_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n },\n {\n \"name\" : \"_egress_int_report_md39\",\n \"id\" : 73,\n \"header_type\" : \"int_report_metadata_t\",\n \"metadata\" : false,\n \"pi_omit\" : true\n }\n ],\n \"header_stacks\" : [],\n \"header_union_types\" : [],\n \"header_unions\" : [],\n \"header_union_stacks\" : [],\n \"field_lists\" : [\n {\n \"id\" : 1,\n \"name\" : \"field_list241\",\n \"elements\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n }\n ]\n },\n {\n \"id\" : 2,\n \"name\" : \"field_list231\",\n \"elements\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n }\n ]\n },\n {\n \"id\" : 3,\n \"name\" : \"empty\",\n \"elements\" : []\n },\n {\n \"id\" : 4,\n \"name\" : \"empty_0\",\n \"elements\" : []\n },\n {\n \"id\" : 5,\n \"name\" : \"empty_1\",\n \"elements\" : []\n }\n ],\n \"errors\" : [\n [\"NoError\", 1],\n [\"PacketTooShort\", 2],\n [\"NoMatch\", 3],\n [\"StackOutOfBounds\", 4],\n [\"HeaderTooShort\", 5],\n [\"ParserTimeout\", 6],\n [\"ParserInvalidArgument\", 7],\n [\"PacketRejectedByParser\", 8]\n ],\n \"enums\" : [],\n \"parsers\" : [\n {\n \"name\" : \"parser\",\n \"id\" : 0,\n \"init_state\" : \"start\",\n \"parse_states\" : [\n {\n \"name\" : \"start\",\n \"id\" : 0,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"packet_length\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000ffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_port3\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_port\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_port\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_tstamp9\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"ingress_global_timestamp\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"_pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"_pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_2\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_8\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf02\",\n \"mask\" : null,\n \"next_state\" : \"parse_fake_ethernet\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf03\",\n \"mask\" : null,\n \"next_state\" : \"parse_fake_ethernet_and_accept\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf01\",\n \"mask\" : null,\n \"next_state\" : \"check_packet_out\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_2\"]\n }\n ]\n },\n {\n \"name\" : \"check_packet_out\",\n \"id\" : 1,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp_0\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x69\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x7f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"egress_port\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x60\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x5d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"queue_id\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x58\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad2\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x53\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1f\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"cpu_loopback_mode\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x51\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"do_forwarding\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad3\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"pad4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_0\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\",\n \"mask\" : null,\n \"next_state\" : \"parse_packet_out_and_accept\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"strip_packet_out\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_4\"]\n }\n ]\n },\n {\n \"name\" : \"parse_int_wip_ipv4\",\n \"id\" : 2,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x41\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_int_wip_mpls\",\n \"id\" : 3,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_wip_type26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_mpls\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_packet_out_and_accept\",\n \"id\" : 4,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_packet_out0\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"strip_packet_out\",\n \"id\" : 5,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000070\"\n }\n ],\n \"op\" : \"advance\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_fake_ethernet\",\n \"id\" : 6,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 112]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"tmp_1\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"_pad0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"_pad1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"tmp_1\", \"ether_type\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_6\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_10\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\",\n \"mask\" : null,\n \"next_state\" : \"parse_int_wip_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_ethernet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_6\"]\n }\n ]\n },\n {\n \"name\" : \"parse_fake_ethernet_and_accept\",\n \"id\" : 7,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_ethernet\",\n \"id\" : 8,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ethernet3\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_3\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 16]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x88a8\",\n \"mask\" : null,\n \"next_state\" : \"parse_vlan_tag\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8100\",\n \"mask\" : \"0xefff\",\n \"next_state\" : \"parse_vlan_tag\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_untagged\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_3\"]\n }\n ]\n },\n {\n \"name\" : \"parse_vlan_tag\",\n \"id\" : 9,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_5\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 16]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_eth_type\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_5\"]\n }\n ]\n },\n {\n \"name\" : \"parse_untagged\",\n \"id\" : 10,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_eth_type\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_eth_type\",\n \"id\" : 11,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_eth_type5\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\",\n \"mask\" : null,\n \"next_state\" : \"parse_mpls\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_non_mpls\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\",\n \"mask\" : null,\n \"next_state\" : \"parse_non_mpls\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_mpls\",\n \"id\" : 12,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"label\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_7\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 4]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv6\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"reject_packet\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_7\"]\n }\n ]\n },\n {\n \"name\" : \"reject_packet\",\n \"id\" : 13,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"bool\",\n \"value\" : false\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8\"\n }\n ],\n \"op\" : \"verify\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_non_mpls\",\n \"id\" : 14,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_ttl8\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x41\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv4\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\",\n \"mask\" : null,\n \"next_state\" : \"parse_ipv6\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_ipv4\",\n \"id\" : 15,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\",\n \"mask\" : null,\n \"next_state\" : \"parse_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n }\n ]\n },\n {\n \"name\" : \"parse_ipv6\",\n \"id\" : 16,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_ipv68\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86dd\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3a\",\n \"mask\" : null,\n \"next_state\" : \"parse_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"next_hdr\"]\n }\n ]\n },\n {\n \"name\" : \"parse_icmp\",\n \"id\" : 17,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_tcp\",\n \"id\" : 18,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_udp\",\n \"id\" : 19,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 64]\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"gtpu_0\"\n }\n ],\n \"op\" : \"add_header\"\n }\n ],\n \"op\" : \"primitive\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"version\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"pt\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3c\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"spare\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3b\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"ex_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3a\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"seq_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x39\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"npdu_flag\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x38\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"msgtype\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x30\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"msglen\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x20\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"gtpu_0\", \"teid\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3d\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_13\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_11\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x30\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffffffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x086801ff\",\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x12b50000\",\n \"mask\" : \"0xffff0000\",\n \"next_state\" : \"parse_vxlan\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_13\"]\n }\n ]\n },\n {\n \"name\" : \"parse_gtpu\",\n \"id\" : 20,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\",\n \"mask\" : null,\n \"next_state\" : \"set_gtpu_only\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu_options\"\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"ex_flag\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n }\n ]\n },\n {\n \"name\" : \"set_gtpu_only\",\n \"id\" : 21,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_gtpu_options\",\n \"id\" : 22,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"gtpu_ext_len_0\"]\n },\n {\n \"type\" : \"lookahead\",\n \"value\" : [0, 8]\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8501\",\n \"mask\" : null,\n \"next_state\" : \"parse_gtpu_ext_psc\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"gtpu_ext_len_0\"]\n }\n ]\n },\n {\n \"name\" : \"parse_gtpu_ext_psc\",\n \"id\" : 23,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"op\" : \"set\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n }\n ]\n },\n {\n \"name\" : \"parse_vxlan\",\n \"id\" : 24,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n ],\n \"op\" : \"set\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"op\" : \"extract\"\n },\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_ipv4\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_eth_type17\", \"value\"]\n }\n ]\n },\n {\n \"name\" : \"parse_inner_ipv4\",\n \"id\" : 25,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x06\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_tcp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_udp\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\",\n \"mask\" : null,\n \"next_state\" : \"parse_inner_icmp\"\n },\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n }\n ]\n },\n {\n \"name\" : \"parse_inner_tcp\",\n \"id\" : 26,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_inner_udp\",\n \"id\" : 27,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n },\n {\n \"name\" : \"parse_inner_icmp\",\n \"id\" : 28,\n \"parser_ops\" : [\n {\n \"parameters\" : [\n {\n \"type\" : \"regular\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"op\" : \"extract\"\n }\n ],\n \"transitions\" : [\n {\n \"type\" : \"default\",\n \"value\" : null,\n \"mask\" : null,\n \"next_state\" : null\n }\n ],\n \"transition_key\" : []\n }\n ]\n }\n ],\n \"parse_vsets\" : [],\n \"deparsers\" : [\n {\n \"name\" : \"deparser\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/parser.p4\",\n \"line\" : 321,\n \"column\" : 8,\n \"source_fragment\" : \"FabricDeparser\"\n },\n \"order\" : [\"_ingress_fake_ethernet2\", \"_ingress_packet_in1\", \"_egress_report_ethernet24\", \"_egress_report_eth_type25\", \"_egress_report_mpls26\", \"_egress_report_ipv427\", \"_egress_report_udp28\", \"_egress_report_fixed_header29\", \"_egress_common_report_header30\", \"_egress_local_report_header31\", \"_egress_drop_report_header32\", \"_ingress_ethernet3\", \"_ingress_vlan_tag4\", \"_ingress_eth_type5\", \"_ingress_mpls6\", \"_ingress_ipv47\", \"_ingress_ipv68\", \"_ingress_tcp9\", \"_ingress_udp10\", \"_ingress_icmp11\", \"_ingress_gtpu12\", \"_ingress_gtpu_options13\", \"_ingress_gtpu_ext_psc14\", \"_ingress_vxlan15\", \"_ingress_inner_ethernet16\", \"_ingress_inner_eth_type17\", \"_ingress_inner_ipv418\", \"_ingress_inner_tcp19\", \"_ingress_inner_udp20\", \"_ingress_inner_icmp21\"],\n \"primitives\" : []\n }\n ],\n \"meter_arrays\" : [\n {\n \"name\" : \"FabricIngress.qos.slice_tc_meter\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 104,\n \"column\" : 41,\n \"source_fragment\" : \"slice_tc_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 64,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n },\n {\n \"name\" : \"FabricIngress.upf.session_meter\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 22,\n \"column\" : 34,\n \"source_fragment\" : \"session_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 20000,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n },\n {\n \"name\" : \"FabricIngress.upf.app_meter\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 23,\n \"column\" : 34,\n \"source_fragment\" : \"app_meter\"\n },\n \"is_direct\" : false,\n \"size\" : 20000,\n \"rate_count\" : 2,\n \"type\" : \"bytes\"\n }\n ],\n \"counter_arrays\" : [\n {\n \"name\" : \"FabricIngress.stats.flow_counter\",\n \"id\" : 0,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.stats.flows\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 14,\n \"column\" : 50,\n \"source_fragment\" : \"flow_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.ingress_port_vlan_counter\",\n \"id\" : 1,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 17,\n \"column\" : 50,\n \"source_fragment\" : \"ingress_port_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_classifier_counter\",\n \"id\" : 2,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.filtering.fwd_classifier\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 71,\n \"column\" : 50,\n \"source_fragment\" : \"fwd_classifier_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_type_counter\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 78,\n \"column\" : 46,\n \"source_fragment\" : \"fwd_type_counter\"\n },\n \"size\" : 8,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricIngress.forwarding.bridging_counter\",\n \"id\" : 4,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.bridging\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 29,\n \"column\" : 50,\n \"source_fragment\" : \"bridging_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.mpls_counter\",\n \"id\" : 5,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.mpls\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 64,\n \"column\" : 50,\n \"source_fragment\" : \"mpls_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v4_counter\",\n \"id\" : 6,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.routing_v4\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 98,\n \"column\" : 50,\n \"source_fragment\" : \"routing_v4_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v6_counter\",\n \"id\" : 7,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.forwarding.routing_v6\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 142,\n \"column\" : 50,\n \"source_fragment\" : \"routing_v6_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_mpls_counter\",\n \"id\" : 8,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.pre_next.next_mpls\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 15,\n \"column\" : 50,\n \"source_fragment\" : \"next_mpls_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_vlan_counter\",\n \"id\" : 9,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.pre_next.next_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 39,\n \"column\" : 50,\n \"source_fragment\" : \"next_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.acl.acl_counter\",\n \"id\" : 10,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.acl.acl\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 19,\n \"column\" : 50,\n \"source_fragment\" : \"acl_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.hashed_counter\",\n \"id\" : 11,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.next.hashed\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 115,\n \"column\" : 50,\n \"source_fragment\" : \"hashed_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.multicast_counter\",\n \"id\" : 12,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.next.multicast\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 148,\n \"column\" : 50,\n \"source_fragment\" : \"multicast_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.classifier_stats\",\n \"id\" : 13,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 20,\n \"column\" : 40,\n \"source_fragment\" : \"classifier_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.qos.queues_stats\",\n \"id\" : 14,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.qos.queues\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 106,\n \"column\" : 40,\n \"source_fragment\" : \"queues_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.upf.terminations_counter\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 20,\n \"column\" : 49,\n \"source_fragment\" : \"terminations_counter\"\n },\n \"size\" : 4096,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_stats\",\n \"id\" : 16,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 356,\n \"column\" : 40,\n \"source_fragment\" : \"recirc_stats\"\n }\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.watchlist_counter\",\n \"id\" : 17,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.int_watchlist.watchlist\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 15,\n \"column\" : 50,\n \"source_fragment\" : \"watchlist_counter\"\n }\n },\n {\n \"name\" : \"FabricIngress.int_ingress.drop_report_counter\",\n \"id\" : 18,\n \"is_direct\" : true,\n \"binding\" : \"FabricIngress.int_ingress.drop_report\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 64,\n \"column\" : 50,\n \"source_fragment\" : \"drop_report_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.stats.flow_counter\",\n \"id\" : 19,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.stats.flows\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 47,\n \"column\" : 50,\n \"source_fragment\" : \"flow_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.egress_next.egress_vlan_counter\",\n \"id\" : 20,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.egress_next.egress_vlan\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 241,\n \"column\" : 50,\n \"source_fragment\" : \"egress_vlan_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.upf.terminations_counter\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 477,\n \"column\" : 49,\n \"source_fragment\" : \"terminations_counter\"\n },\n \"size\" : 4096,\n \"is_direct\" : false\n },\n {\n \"name\" : \"FabricEgress.int_egress.report_counter\",\n \"id\" : 22,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.int_egress.report\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 131,\n \"column\" : 50,\n \"source_fragment\" : \"report_counter\"\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.int_metadata_counter\",\n \"id\" : 23,\n \"is_direct\" : true,\n \"binding\" : \"FabricEgress.int_egress.int_metadata\",\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 132,\n \"column\" : 50,\n \"source_fragment\" : \"int_metadata_counter\"\n }\n }\n ],\n \"register_arrays\" : [\n {\n \"name\" : \"FabricEgress.int_egress.seq_number\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 138,\n \"column\" : 28,\n \"source_fragment\" : \"seq_number\"\n },\n \"size\" : 1024,\n \"bitwidth\" : 32\n }\n ],\n \"calculations\" : [\n {\n \"name\" : \"calc\",\n \"id\" : 0,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_19\"]\n }\n ]\n },\n {\n \"name\" : \"calc_0\",\n \"id\" : 1,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_20\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_22\"]\n }\n ]\n },\n {\n \"name\" : \"calc_1\",\n \"id\" : 2,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_24\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_25\"]\n }\n ]\n },\n {\n \"name\" : \"calc_2\",\n \"id\" : 3,\n \"algo\" : \"crc32\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_26\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_27\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_28\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_29\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_30\"]\n }\n ]\n },\n {\n \"name\" : \"calc_3\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_4\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_5\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 92,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.egress.report_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_6\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ]\n },\n {\n \"name\" : \"calc_7\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"algo\" : \"csum16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"version\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ihl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ecn\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"identification\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"flags\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"frag_offset\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ]\n }\n ],\n \"learn_lists\" : [],\n \"actions\" : [\n {\n \"name\" : \"nop\",\n \"id\" : 0,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 1,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 2,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 3,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 4,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 5,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 6,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"NoAction\",\n \"id\" : 7,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.stats.count\",\n \"id\" : 8,\n \"runtime_data\" : [\n {\n \"name\" : \"flow_id\",\n \"bitwidth\" : 10\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_stats_flow_id11\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 17,\n \"column\" : 22,\n \"source_fragment\" : \"= flow_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pkt_io.do_packet_out\",\n \"id\" : 9,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"egress_port\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"egress_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 14,\n \"column\" : 37,\n \"source_fragment\" : \"= hdr.packet_out.egress_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 15,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_packet_out0\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.packet_out.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._skip_egress0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 17,\n \"column\" : 20,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 19,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.setInvalid()\"\n }\n },\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.deny\",\n \"id\" : 10,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 22,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 23,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 100,\n \"column\" : 14,\n \"source_fragment\" : \"0x0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x37\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 250,\n \"column\" : 41,\n \"source_fragment\" : \"55, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.permit\",\n \"id\" : 11,\n \"runtime_data\" : [\n {\n \"name\" : \"port_type\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 33,\n \"column\" : 31,\n \"source_fragment\" : \"= port_type; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.permit_with_internal_vlan\",\n \"id\" : 12,\n \"runtime_data\" : [\n {\n \"name\" : \"vlan_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"port_type\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.vlan_id = vlan_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 33,\n \"column\" : 31,\n \"source_fragment\" : \"= port_type; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.filtering.set_forwarding_type\",\n \"id\" : 13,\n \"runtime_data\" : [\n {\n \"name\" : \"fwd_type\",\n \"bitwidth\" : 3\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.fwd_type = fwd_type\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 14,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 15,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 16,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_int_drop_reason\",\n \"id\" : 17,\n \"runtime_data\" : [\n {\n \"name\" : \"drop_reason\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_bridging\",\n \"id\" : 18,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.pop_mpls_and_next\",\n \"id\" : 19,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 68,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_routing_v4\",\n \"id\" : 20,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.nop_routing_v4\",\n \"id\" : 21,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.forwarding.drop_routing_v4\",\n \"id\" : 22,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 111,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 113,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.set_next_id_routing_v6\",\n \"id\" : 23,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 23,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.forwarding.drop_routing_v6\",\n \"id\" : 24,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 150,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 152,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pre_next.set_mpls_label\",\n \"id\" : 25,\n \"runtime_data\" : [\n {\n \"name\" : \"label\",\n \"bitwidth\" : 20\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 18,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.pre_next.set_vlan\",\n \"id\" : 26,\n \"runtime_data\" : [\n {\n \"name\" : \"vlan_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 42,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.vlan_id = vlan_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.set_next_id_acl\",\n \"id\" : 27,\n \"runtime_data\" : [\n {\n \"name\" : \"next_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_next_id21\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 22,\n \"column\" : 26,\n \"source_fragment\" : \"= next_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 26,\n \"column\" : 28,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 27,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.copy_to_cpu\",\n \"id\" : 28,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"clone_ingress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000001ff\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.I2E, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.punt_to_cpu\",\n \"id\" : 29,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"clone_ingress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000001ff\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.I2E, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 40,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 41,\n \"column\" : 30,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 42,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.drop\",\n \"id\" : 30,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 46,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 47,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x50\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 252,\n \"column\" : 27,\n \"source_fragment\" : \"80, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.set_output_port\",\n \"id\" : 31,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 62,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t) port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 63,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 64,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 65,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 66,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.acl.nop_acl\",\n \"id\" : 32,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.next.output_hashed\",\n \"id\" : 33,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 17,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; // Needed by INT. ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 18,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.routing_hashed\",\n \"id\" : 34,\n \"runtime_data\" : [\n {\n \"name\" : \"port_num\",\n \"bitwidth\" : 9\n },\n {\n \"name\" : \"smac\",\n \"bitwidth\" : 48\n },\n {\n \"name\" : \"dmac\",\n \"bitwidth\" : 48\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 23,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ethernet.src_addr = smac; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 28,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ethernet.dst_addr = dmac; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 16,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.egress_spec = (PortId_t)port_num\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_egress_port48\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 17,\n \"column\" : 37,\n \"source_fragment\" : \"= port_num; // Needed by INT. ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 18,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.set_mcast_group_id\",\n \"id\" : 35,\n \"runtime_data\" : [\n {\n \"name\" : \"group_id\",\n \"bitwidth\" : 16\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"mcast_grp\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 151,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.mcast_grp = group_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_is_multicast4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 152,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.next.reset_mcast_group_id\",\n \"id\" : 36,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"mcast_grp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 157,\n \"column\" : 8,\n \"source_fragment\" : \"standard_md.mcast_grp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_is_multicast4\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 158,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast = false\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.set_slice_id_tc\",\n \"id\" : 37,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 23,\n \"column\" : 27,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 24,\n \"column\" : 21,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 25,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.no_classification\",\n \"id\" : 38,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 57,\n \"column\" : 36,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 58,\n \"column\" : 24,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 25,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 31,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.trust_dscp\",\n \"id\" : 39,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0f\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 38,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr.ipv4.dscp[4 +2 -1:2]; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 39,\n \"column\" : 21,\n \"source_fragment\" : \"= hdr.ipv4.dscp[2 -1:0]; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 40,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.use_upf\",\n \"id\" : 40,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 81,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.use_default\",\n \"id\" : 41,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_slice_id26\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc27\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 86,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.set_queue\",\n \"id\" : 42,\n \"runtime_data\" : [\n {\n \"name\" : \"qid\",\n \"bitwidth\" : 5\n }\n ],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.qos.meter_drop\",\n \"id\" : 43,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 115,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xa0\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 269,\n \"column\" : 36,\n \"source_fragment\" : \"160, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.set_default_tc\",\n \"id\" : 44,\n \"runtime_data\" : [\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"<<\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_access\",\n \"id\" : 45,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_core\",\n \"id\" : 46,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_dbuf\",\n \"id\" : 47,\n \"runtime_data\" : [\n {\n \"name\" : \"slice_id\",\n \"bitwidth\" : 4\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = false\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 86,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 87,\n \"column\" : 31,\n \"source_fragment\" : \"= slice_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 62,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 64,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_ipv4; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 65,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 66,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 68,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 70,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 72,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 80,\n \"column\" : 11,\n \"source_fragment\" : \"0x0, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.iface_miss\",\n \"id\" : 48,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 104,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session_miss\",\n \"id\" : 49,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x86\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 261,\n \"column\" : 38,\n \"source_fragment\" : \"134, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session_drop\",\n \"id\" : 50,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 136,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x87\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 262,\n \"column\" : 38,\n \"source_fragment\" : \"135, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_miss\",\n \"id\" : 51,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x84\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 259,\n \"column\" : 38,\n \"source_fragment\" : \"132, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_drop\",\n \"id\" : 52,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 151,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 260,\n \"column\" : 38,\n \"source_fragment\" : \"133, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session\",\n \"id\" : 53,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_peer_id\",\n \"bitwidth\" : 8\n },\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 159,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 161,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 162,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 163,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.tun_peer_id = tun_peer_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_buf\",\n \"id\" : 54,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_peer_id\",\n \"bitwidth\" : 8\n },\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 167,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 169,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 170,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 171,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.tun_peer_id = tun_peer_id\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_egress_upf_ctr18\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 175,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_egress_upf_ctr = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_downlink_session_buf_drop\",\n \"id\" : 55,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 179,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 182,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.routing_ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x88\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 263,\n \"column\" : 43,\n \"source_fragment\" : \"136, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_uplink_session\",\n \"id\" : 56,\n \"runtime_data\" : [\n {\n \"name\" : \"session_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 190,\n \"column\" : 8,\n \"source_fragment\" : \"sess_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 192,\n \"column\" : 8,\n \"source_fragment\" : \"ue_session_id = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 193,\n \"column\" : 8,\n \"source_fragment\" : \"session_meter_idx_internal = session_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 62,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 64,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_ipv4; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 65,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 66,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 67,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 68,\n \"column\" : 16,\n \"source_fragment\" : \"= hdr.inner_tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 69,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 70,\n \"column\" : 17,\n \"source_fragment\" : \"= hdr.inner_icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 72,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 74,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 80,\n \"column\" : 11,\n \"source_fragment\" : \"0x0, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_drop_miss\",\n \"id\" : 57,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8b\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 266,\n \"column\" : 42,\n \"source_fragment\" : \"139, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_drop_miss\",\n \"id\" : 58,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x89\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 264,\n \"column\" : 42,\n \"source_fragment\" : \"137, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_drop\",\n \"id\" : 59,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8c\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 267,\n \"column\" : 42,\n \"source_fragment\" : \"140, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_drop\",\n \"id\" : 60,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 39,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 40,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 41,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 265,\n \"column\" : 42,\n \"source_fragment\" : \"138, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.app_fwd\",\n \"id\" : 61,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n },\n {\n \"name\" : \"app_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 265,\n \"column\" : 25,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 266,\n \"column\" : 8,\n \"source_fragment\" : \"app_meter_idx_internal = app_meter_idx\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 267,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_fwd_encap\",\n \"id\" : 62,\n \"runtime_data\" : [\n {\n \"name\" : \"ctr_id\",\n \"bitwidth\" : 12\n },\n {\n \"name\" : \"tc\",\n \"bitwidth\" : 2\n },\n {\n \"name\" : \"teid\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"qfi\",\n \"bitwidth\" : 6\n },\n {\n \"name\" : \"app_meter_idx\",\n \"bitwidth\" : 15\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 46,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.upf_ctr_id = ctr_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 47,\n \"column\" : 8,\n \"source_fragment\" : \"term_hit = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_tc31\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 265,\n \"column\" : 25,\n \"source_fragment\" : \"= tc; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 266,\n \"column\" : 8,\n \"source_fragment\" : \"app_meter_idx_internal = app_meter_idx; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 267,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_needs_gtpu_encap16\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.needs_gtpu_encap = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_teid19\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.teid = teid; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_qfi15\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 56,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.qfi = qfi; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_routing_ipv4_dst\",\n \"id\" : 63,\n \"runtime_data\" : [\n {\n \"name\" : \"tun_dst_addr\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 314,\n \"column\" : 35,\n \"source_fragment\" : \"= tun_dst_addr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.set_app_id\",\n \"id\" : 64,\n \"runtime_data\" : [\n {\n \"name\" : \"app_id\",\n \"bitwidth\" : 8\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_internal_app_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 334,\n \"column\" : 8,\n \"source_fragment\" : \"internal_app_id = app_id\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_allow\",\n \"id\" : 65,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 364,\n \"column\" : 29,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 365,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 366,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 367,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_deny\",\n \"id\" : 66,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x96\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 268,\n \"column\" : 41,\n \"source_fragment\" : \"150, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 375,\n \"column\" : 29,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 376,\n \"column\" : 34,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 377,\n \"column\" : 28,\n \"source_fragment\" : \"= true; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.upf.recirc_miss\",\n \"id\" : 67,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.mark_to_report\",\n \"id\" : 68,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 223,\n \"column\" : 45,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 223,\n \"column\" : 45,\n \"source_fragment\" : \"1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.no_report\",\n \"id\" : 69,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.no_report_collector\",\n \"id\" : 70,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.int_ingress.report_drop\",\n \"id\" : 71,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 79,\n \"column\" : 17,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model64\",\n \"id\" : 72,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 64,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model61\",\n \"id\" : 73,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model70\",\n \"id\" : 74,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_ig_port3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 36,\n \"column\" : 42,\n \"source_fragment\" : \"510; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init21\",\n \"id\" : 75,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 21,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr.vlan_tag.vlan_id; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init15\",\n \"id\" : 76,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_dst6\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 15,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_src7\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 16,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_type8\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 17,\n \"column\" : 24,\n \"source_fragment\" : \"= hdr.eth_type.value; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 19,\n \"column\" : 23,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init38\",\n \"id\" : 77,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 38,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 39,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init41\",\n \"id\" : 78,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 41,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 42,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init44\",\n \"id\" : 79,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"icmp_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 44,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_type; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"icmp_code\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 45,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_code; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init33\",\n \"id\" : 80,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 33,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 34,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 35,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"protocol\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 36,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.inner_ipv4.protocol; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init53\",\n \"id\" : 81,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 53,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 54,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init56\",\n \"id\" : 82,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"sport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 56,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 57,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.dport; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init59\",\n \"id\" : 83,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"icmp_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 59,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_type; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"icmp_code\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 60,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_code; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init48\",\n \"id\" : 84,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 48,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 49,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.src_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 50,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.dst_addr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 51,\n \"column\" : 28,\n \"source_fragment\" : \"= hdr.ipv4.protocol; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"lookup_md_init24\",\n \"id\" : 85,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 24,\n \"column\" : 23,\n \"source_fragment\" : \"= false; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 25,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 26,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 27,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 28,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 29,\n \"column\" : 24,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 30,\n \"column\" : 25,\n \"source_fragment\" : \"= 0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 31,\n \"column\" : 25,\n \"source_fragment\" : \"= 0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf409\",\n \"id\" : 86,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 409,\n \"column\" : 20,\n \"source_fragment\" : \"is_uplink = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 410,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_dst; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 411,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_dport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 412,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf418\",\n \"id\" : 87,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 418,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 419,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 420,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf424\",\n \"id\" : 88,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 424,\n \"column\" : 20,\n \"source_fragment\" : \"app_ipv4_addr = fabric_md.lkp.ipv4_src; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 425,\n \"column\" : 20,\n \"source_fragment\" : \"app_l4_port = fabric_md.lkp.l4_sport; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 426,\n \"column\" : 20,\n \"source_fragment\" : \"app_ip_proto = fabric_md.lkp.ip_proto; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf443\",\n \"id\" : 89,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_skip_egress_upf_ctr18\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 443,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_egress_upf_ctr = true\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf448\",\n \"id\" : 90,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_14\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 44,\n \"source_fragment\" : \"(bit<32>) session_meter_idx_internal\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.upf.session_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_14\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 16,\n \"source_fragment\" : \"session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf445\",\n \"id\" : 91,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_15\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 36,\n \"source_fragment\" : \"(bit<32>) app_meter_idx_internal\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.upf.app_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_15\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 12,\n \"source_fragment\" : \"app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf461\",\n \"id\" : 92,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_16\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_upf_ctr_id14\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 43,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.upf.upf_ctr_id\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricIngress.upf.terminations_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_16\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf25\",\n \"id\" : 93,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 25,\n \"column\" : 4,\n \"source_fragment\" : \"bool is_uplink = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 26,\n \"column\" : 4,\n \"source_fragment\" : \"bool term_hit = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : false\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 27,\n \"column\" : 4,\n \"source_fragment\" : \"bool sess_hit = false;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ipv4_addr\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 28,\n \"column\" : 4,\n \"source_fragment\" : \"bit<32> app_ipv4_addr = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_l4_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 29,\n \"column\" : 4,\n \"source_fragment\" : \"l4_port_t app_l4_port = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_ip_proto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 30,\n \"column\" : 4,\n \"source_fragment\" : \"bit<8> app_ip_proto = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_internal_app_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 55,\n \"column\" : 30,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_ue_session_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 32,\n \"column\" : 4,\n \"source_fragment\" : \"ue_session_id_t ue_session_id = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_session_meter_idx_internal\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 72,\n \"column\" : 54,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_app_meter_idx_internal\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 73,\n \"column\" : 46,\n \"source_fragment\" : \"0; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"filtering100\",\n \"id\" : 94,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 31,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.base.fwd_type\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricIngress.filtering.fwd_type_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_17\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 8,\n \"source_fragment\" : \"fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher28\",\n \"id\" : 95,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_18\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 32,\n \"column\" : 17,\n \"source_fragment\" : \"fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_19\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 32,\n \"column\" : 52,\n \"source_fragment\" : \"fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 28,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher39\",\n \"id\" : 96,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_20\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 17,\n \"source_fragment\" : \"hdr.ipv4.src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 36,\n \"source_fragment\" : \"hdr.ipv4.dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_22\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 43,\n \"column\" : 55,\n \"source_fragment\" : \"hdr.gtpu.teid\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_0\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 39,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher50\",\n \"id\" : 97,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 50,\n \"column\" : 32,\n \"source_fragment\" : \"= fabric_md.bridged.base.inner_hash; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher66\",\n \"id\" : 98,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 66,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.inner_hash = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"dst_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 17,\n \"source_fragment\" : \"hdr.ethernet.dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_24\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"src_addr\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 40,\n \"source_fragment\" : \"hdr.ethernet.src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_25\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 71,\n \"column\" : 63,\n \"source_fragment\" : \"hdr.eth_type.value\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_1\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 67,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"hasher17\",\n \"id\" : 99,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_26\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_27\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_28\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_29\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_30\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n }\n },\n {\n \"op\" : \"modify_field_with_hash_based_offset\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_inner_hash1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000000\"\n },\n {\n \"type\" : \"calculation\",\n \"value\" : \"calc_2\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"hash( ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing174\",\n \"id\" : 100,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_31\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 41,\n \"source_fragment\" : \"(bit<32>) fabric_md.bridged.base.slice_tc\"\n }\n },\n {\n \"op\" : \"execute_meter\",\n \"parameters\" : [\n {\n \"type\" : \"meter_array\",\n \"value\" : \"FabricIngress.qos.slice_tc_meter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_31\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"qos_packet_color\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing177\",\n \"id\" : 101,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"qos_packet_color\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4\",\n \"line\" : 25,\n \"column\" : 10,\n \"source_fragment\" : \"2 ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int112\",\n \"id\" : 102,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_egress_port25\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_int_bmd_queue_id24\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 113,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.int_bmd.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model110\",\n \"id\" : 103,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 110,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model106\",\n \"id\" : 104,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_bridged4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 106,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.egress.bridged = fabric_md\"\n }\n }\n ]\n },\n {\n \"name\" : \"nop\",\n \"id\" : 105,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 106,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 107,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 108,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 109,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 110,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"nop\",\n \"id\" : 111,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.stats.count\",\n \"id\" : 112,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.pkt_io_egress.set_switch_info\",\n \"id\" : 113,\n \"runtime_data\" : [\n {\n \"name\" : \"cpu_port\",\n \"bitwidth\" : 9\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"local\",\n \"value\" : 0\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 36,\n \"column\" : 27,\n \"source_fragment\" : \"= (PortId_t)cpu_port; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.pop_mpls_if_present\",\n \"id\" : 114,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 200,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.bridged\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.set_mpls\",\n \"id\" : 115,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_mpls6\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"label\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 206,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.label = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.tc = 3w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 208,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.bos = 1w1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_ttl8\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 209,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.mpls.ttl = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_eth_type5\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8847\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 112,\n \"column\" : 31,\n \"source_fragment\" : \"0x8847; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.push_vlan\",\n \"id\" : 116,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 217,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8100\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 111,\n \"column\" : 31,\n \"source_fragment\" : \"0x8100; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"vlan_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 221,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.vlan_id = fabric_md.bridged\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.pop_vlan\",\n \"id\" : 117,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 249,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.egress_next.drop\",\n \"id\" : 118,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 254,\n \"column\" : 17,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x82\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 257,\n \"column\" : 35,\n \"source_fragment\" : \"130, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.rewrite\",\n \"id\" : 119,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.clear\",\n \"id\" : 120,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"tmp_dscp = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.load_tunnel_params\",\n \"id\" : 121,\n \"runtime_data\" : [\n {\n \"name\" : \"tunnel_src_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"tunnel_src_addr\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"tunnel_dst_addr\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 486,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.src_addr = tunnel_src_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 487,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dst_addr = tunnel_dst_addr\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"sport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 488,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.sport = tunnel_src_port\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_only\",\n \"id\" : 122,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 551,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 552,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ipv4; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 553,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 554,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 506,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 507,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 508,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 509,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ecn = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1513\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 511,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.identification = 0x1513\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 512,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 513,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0868\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 86,\n \"column\" : 30,\n \"source_fragment\" : \"2152; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 87,\n \"column\" : 22,\n \"source_fragment\" : \"3w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"pt\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 89,\n \"column\" : 37,\n \"source_fragment\" : \"1w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"spare\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 527,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.spare = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 529,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.seq_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 530,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.npdu_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msgtype\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 88,\n \"column\" : 25,\n \"source_fragment\" : \"0xff; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 533,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.teid = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"seq_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 535,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.seq_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"n_pdu_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 536,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.n_pdu_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 91,\n \"column\" : 33,\n \"source_fragment\" : \"0x85; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"len\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 94,\n \"column\" : 32,\n \"source_fragment\" : \"8w1; // 1*4-octets ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 92,\n \"column\" : 36,\n \"source_fragment\" : \"4w0; // Downlink ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"spare0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 541,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.spare0 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"ppp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 542,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.ppp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"rqi\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 543,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.rqi = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 90,\n \"column\" : 34,\n \"source_fragment\" : \"0x0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0024\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 563,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.total_len = 20 + 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0010\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 565,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.len = 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msglen\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 567,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.msglen = hdr.inner_ipv4.total_len\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 81,\n \"column\" : 16,\n \"source_fragment\" : \"0x1, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_with_psc\",\n \"id\" : 123,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 577,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 578,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 551,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.inner_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ipv418\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 552,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ipv4; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 553,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 554,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 506,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 507,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 508,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 509,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.ecn = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1513\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 511,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.identification = 0x1513\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 512,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 513,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"dport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0868\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 86,\n \"column\" : 30,\n \"source_fragment\" : \"2152; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 87,\n \"column\" : 22,\n \"source_fragment\" : \"3w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"pt\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 89,\n \"column\" : 37,\n \"source_fragment\" : \"1w1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"spare\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 527,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.spare = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"seq_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 529,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.seq_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"npdu_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 530,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.npdu_flag = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msgtype\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 88,\n \"column\" : 25,\n \"source_fragment\" : \"0xff; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"teid\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_teid19\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 533,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.teid = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"seq_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 535,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.seq_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"n_pdu_num\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 536,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_options.n_pdu_num = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_options13\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x85\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 91,\n \"column\" : 33,\n \"source_fragment\" : \"0x85; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"len\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 94,\n \"column\" : 32,\n \"source_fragment\" : \"8w1; // 1*4-octets ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 92,\n \"column\" : 36,\n \"source_fragment\" : \"4w0; // Downlink ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"spare0\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 541,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.spare0 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"ppp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 542,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.ppp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"rqi\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 543,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.rqi = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"next_ext\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 90,\n \"column\" : 34,\n \"source_fragment\" : \"0x0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x002c\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 580,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.ipv4.total_len = 20 + 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0018\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 583,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.udp.len = 8 + 8 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"msglen\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0008\"\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"total_len\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 586,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.msglen = 4 + 4 ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"ex_flag\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 588,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu.ex_flag = 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu_ext_psc14\", \"qfi\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_qfi15\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 589,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.gtpu_ext_psc.qfi = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 82,\n \"column\" : 20,\n \"source_fragment\" : \"0x2, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_ingress_drop\",\n \"id\" : 124,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 79,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"report_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_encap_presence7\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 93,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.encap_presence = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 94,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 97,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 99,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 101,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 102,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 103,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_ingress_drop\",\n \"id\" : 125,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 79,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0800\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 114,\n \"column\" : 31,\n \"source_fragment\" : \"0x0800; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"report_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 221,\n \"column\" : 45,\n \"source_fragment\" : \"4; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 85,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 169,\n \"column\" : 23,\n \"source_fragment\" : \"4, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"encap_presence\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_encap_presence7\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 93,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.encap_presence = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 94,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 97,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 99,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 101,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.bridged\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 102,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 103,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_report_mirror\",\n \"id\" : 126,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 110,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 114,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 118,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 121,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 122,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 123,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 126,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_occupancy\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 127,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 128,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.parser_emulator.parse_int_report_mirror\",\n \"id\" : 127,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 20,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ethernet.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 25,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_eth_type.setValid()\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 37,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"version\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 38,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.version = 4w4\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ihl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 39,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ihl = 4w5\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"dscp\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 40,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dscp = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ecn\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 41,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.ecn = 2w0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"flags\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 44,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.flags = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"frag_offset\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 45,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.frag_offset = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 150,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_ipv4\", \"protocol\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 134,\n \"column\" : 25,\n \"source_fragment\" : \"17; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 53,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_udp\", \"sport\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 54,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.sport = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 60,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ver\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ver = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"rsvd\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 66,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.rsvd = 0\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 71,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"bmd_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 110,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_vlan_id6\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0ffe\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 147,\n \"column\" : 34,\n \"source_fragment\" : \"12w4094; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 112,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 114,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.upf.skip_upf = true\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_report_fixed_header\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 118,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"ig_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 121,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 122,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_common_report_header\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_id\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 123,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 126,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"queue_occupancy\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 127,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"parser_emulator_hdr_local_report_header\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_int_report_md39\", \"eg_tstamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 128,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.check_quota\",\n \"id\" : 128,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.int_egress.reset_quota\",\n \"id\" : 129,\n \"runtime_data\" : [],\n \"primitives\" : []\n },\n {\n \"name\" : \"FabricEgress.int_egress.set_config\",\n \"id\" : 130,\n \"runtime_data\" : [\n {\n \"name\" : \"hop_latency_mask\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"timestamp_mask\",\n \"bitwidth\" : 48\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 0\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 179,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 1\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 180,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_local_report_encap\",\n \"id\" : 131,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_32\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_32\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_33\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_33\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 218,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_local_report_encap_mpls\",\n \"id\" : 132,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"mon_label\",\n \"bitwidth\" : 20\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_34\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_34\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_35\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_35\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 203,\n \"column\" : 52,\n \"source_fragment\" : \"2; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 218,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 126,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF05; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 226,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 227,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.tc = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 228,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.bos = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 149,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"label\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 230,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.label = mon_label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_drop_report_encap\",\n \"id\" : 133,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_36\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_36\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_37\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_37\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 202,\n \"column\" : 44,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 238,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 241,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 243,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason =\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.do_drop_report_encap_mpls\",\n \"id\" : 134,\n \"runtime_data\" : [\n {\n \"name\" : \"src_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_ip\",\n \"bitwidth\" : 32\n },\n {\n \"name\" : \"mon_port\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"mon_label\",\n \"bitwidth\" : 20\n },\n {\n \"name\" : \"switch_id\",\n \"bitwidth\" : 32\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"modify_field_rng_uniform\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"identification\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 195,\n \"column\" : 8,\n \"source_fragment\" : \"random(hdr.report_ipv4.identification, 0, 0xffff)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"src_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 197,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.src_addr = src_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_ipv4\", \"dst_addr\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 1\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 198,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_ipv4.dst_addr = mon_ip; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_udp\", \"dport\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 2\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 199,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_udp.dport = mon_port; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_38\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_read\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_38\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 143,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.read(reg, seq_number_idx)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000001\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 144,\n \"column\" : 8,\n \"source_fragment\" : \"reg = reg + 1\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_39\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 200,\n \"column\" : 23,\n \"source_fragment\" : \"(bit<32>)hdr.report_fixed_header.hw_id\"\n }\n },\n {\n \"op\" : \"register_write\",\n \"parameters\" : [\n {\n \"type\" : \"register_array\",\n \"value\" : \"FabricEgress.int_egress.seq_number\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_39\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 146,\n \"column\" : 8,\n \"source_fragment\" : \"seq_number.write(seq_number_idx, reg)\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"seq_no\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_reg\"]\n }\n ]\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"dqf\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 201,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"switch_id\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 4\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 202,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.switch_id = switch_id; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad1\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 203,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad1 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 204,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad2 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_common_report_header\", \"pad3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 205,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.common_report_header.pad3 = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_eth_type\", \"value\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 207,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 178,\n \"column\" : 14,\n \"source_fragment\" : \"0, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf04\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 125,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF04; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"nproto\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 202,\n \"column\" : 44,\n \"source_fragment\" : \"1; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 238,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.setValid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 241,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.local_report_header.setInvalid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_drop_report_header\", \"drop_reason\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_drop_reason23\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 243,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.drop_report_header.drop_reason =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_eth_type\", \"value\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf05\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 126,\n \"column\" : 39,\n \"source_fragment\" : \"0xBF05; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 251,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"tc\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 252,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.tc = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"bos\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 253,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.bos = 0\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"ttl\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x40\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 149,\n \"column\" : 32,\n \"source_fragment\" : \"64; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_mpls\", \"label\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 3\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 256,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_mpls.label = mon_label\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.init_int_metadata\",\n \"id\" : 135,\n \"runtime_data\" : [\n {\n \"name\" : \"report_type\",\n \"bitwidth\" : 3\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_mirror_session_id22\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01fa\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 208,\n \"column\" : 43,\n \"source_fragment\" : \"0x1FA; ...\"\n }\n },\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 293,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._int_mirror_type3\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 179,\n \"column\" : 17,\n \"source_fragment\" : \"1, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"bmd_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 167,\n \"column\" : 20,\n \"source_fragment\" : \"2, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"mirror_type\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 179,\n \"column\" : 17,\n \"source_fragment\" : \"1, ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ig_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_port3\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 299,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ig_port =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"eg_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 300,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"queue_id\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_egress_qid\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 301,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.queue_id = egress_qid\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"queue_occupancy\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"deq_qdepth\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 302,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ig_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 303,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"eg_tstamp\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 304,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"ip_eth_type\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ip_eth_type10\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 305,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.ip_eth_type =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"flow_hash\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_inner_hash1\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 306,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.flow_hash =\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"]\n },\n {\n \"type\" : \"runtime_data\",\n \"value\" : 0\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 309,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_report_md.report_type = report_type\"\n }\n }\n ]\n },\n {\n \"name\" : \"FabricEgress.int_egress.adjust_ip_udp_len\",\n \"id\" : 136,\n \"runtime_data\" : [\n {\n \"name\" : \"adjust_ip\",\n \"bitwidth\" : 16\n },\n {\n \"name\" : \"adjust_udp\",\n \"bitwidth\" : 16\n }\n ],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"total_len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 0\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 342,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"len\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n \"right\" : {\n \"type\" : \"local\",\n \"value\" : 1\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 343,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model136\",\n \"id\" : 137,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 136,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model133\",\n \"id\" : 138,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 133,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.egress.cpu_port = 0\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator148\",\n \"id\" : 139,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 149,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 150,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 151,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 153,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.vxlan.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 154,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 155,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_eth_type.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 157,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 158,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 159,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_ext_psc.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator14\",\n \"id\" : 140,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_drop_reason23\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 144,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 145,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.egress.bridged.int_bmd.report_type = fabric_md\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 134,\n \"column\" : 32,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 140,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator166\",\n \"id\" : 141,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator169\",\n \"id\" : 142,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator173\",\n \"id\" : 143,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator148_0\",\n \"id\" : 144,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_ipv47\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 149,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.tcp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 150,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.udp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 151,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.icmp.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vxlan15\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 153,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.vxlan.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_ethernet16\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 154,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_eth_type17\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 155,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.inner_eth_type.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu12\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 157,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_options13\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 158,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_options.setInvalid()\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_gtpu_ext_psc14\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 159,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu_ext_psc.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator14_0\",\n \"id\" : 145,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"bool\",\n \"value\" : true\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 134,\n \"column\" : 32,\n \"source_fragment\" : \"= true; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_vlan_tag4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 140,\n \"column\" : 8,\n \"source_fragment\" : \"hdr_v1model.ingress.vlan_tag.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator166_0\",\n \"id\" : 146,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator169_0\",\n \"id\" : 147,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int_tna_parser_emulator173_0\",\n \"id\" : 148,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ethernet24\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ethernet\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"parser_emulator_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"packetio51\",\n \"id\" : 149,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_packet_in1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 51,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.setValid()\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_in1\", \"ingress_port\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_ingress_port50\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 52,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.ingress_port = preserved_ig_port; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_fake_ethernet2\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 53,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.fake_ethernet.setInvalid()\"\n }\n },\n {\n \"op\" : \"exit\",\n \"parameters\" : [],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 54,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n }\n }\n ]\n },\n {\n \"name\" : \"packetio60\",\n \"id\" : 150,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"packet_length\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x0000ffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xfff2\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 60,\n \"column\" : 37,\n \"source_fragment\" : \"= (bit<16>)standard_md.packet_length - 14; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next283\",\n \"id\" : 151,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 219,\n \"column\" : 50,\n \"source_fragment\" : \"0; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 285,\n \"column\" : 21,\n \"source_fragment\" : \"= 1; ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next325\",\n \"id\" : 152,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 325,\n \"column\" : 25,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x83\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 258,\n \"column\" : 32,\n \"source_fragment\" : \"131, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next323\",\n \"id\" : 153,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 323,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.mpls.ttl = hdr.mpls.ttl - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next333\",\n \"id\" : 154,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 333,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv4.ttl = hdr.ipv4.ttl - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next336\",\n \"id\" : 155,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 336,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 247,\n \"column\" : 30,\n \"source_fragment\" : \"26, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"next343\",\n \"id\" : 156,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"+\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 343,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1\"\n }\n }\n ]\n },\n {\n \"name\" : \"next346\",\n \"id\" : 157,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 346,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_drop_reason49\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1a\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../shared/define.p4\",\n \"line\" : 247,\n \"column\" : 30,\n \"source_fragment\" : \"26, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf610\",\n \"id\" : 158,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 610,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_udp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_udp20\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 611,\n \"column\" : 34,\n \"source_fragment\" : \"= hdr.udp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_udp10\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 612,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.udp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf615\",\n \"id\" : 159,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 615,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_tcp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_tcp19\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 616,\n \"column\" : 34,\n \"source_fragment\" : \"= hdr.tcp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_tcp9\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 617,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.tcp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf620\",\n \"id\" : 160,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"add_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 620,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_icmp.setValid()\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_inner_icmp21\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 621,\n \"column\" : 35,\n \"source_fragment\" : \"= hdr.icmp; ...\"\n }\n },\n {\n \"op\" : \"remove_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_ingress_icmp11\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 622,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.icmp.setInvalid()\"\n }\n }\n ]\n },\n {\n \"name\" : \"upf628\",\n \"id\" : 161,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_40\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_upf_ctr_id14\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 43,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.upf.upf_ctr_id\"\n }\n },\n {\n \"op\" : \"count\",\n \"parameters\" : [\n {\n \"type\" : \"counter_array\",\n \"value\" : \"FabricEgress.upf.terminations_counter\"\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_40\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n }\n }\n ]\n },\n {\n \"name\" : \"int128\",\n \"id\" : 162,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_mpls26\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_ipv4\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_udp\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_fixed_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_common_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_eth_type\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_eth_type35\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_bridged\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_hop_latency40\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_timestamp41\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"vlan_stripped\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_vlan_stripped42\"]\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"queue_report\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"b2d\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_queue_report43\"]\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_fabric_md_pkt_length\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_pkt_length46\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 129,\n \"column\" : 4,\n \"source_fragment\" : \"fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"int_egress_egress_qid\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 135,\n \"column\" : 4,\n \"source_fragment\" : \"QueueId_t egress_qid = 0;\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 365,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 366,\n \"column\" : 8,\n \"source_fragment\" : \"fabric_md.int_md.timestamp = standard_md.egress_global_timestamp\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"key_0\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x10\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \" fabric_md.int_md.hop_latency[31:16]: range @name(\\\\\\\"hop_latency_upper\\\\\\\");\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"key_1\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"-\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_global_timestamp\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_base_ig_tstamp9\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 167,\n \"column\" : 12,\n \"source_fragment\" : \" fabric_md.int_md.hop_latency[15:0]: range @name(\\\\\\\"hop_latency_lower\\\\\\\");\"\n }\n }\n ]\n },\n {\n \"name\" : \"int383\",\n \"id\" : 163,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_41\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_mirror_session_id22\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xffffffff\"\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 384,\n \"column\" : 20,\n \"source_fragment\" : \"(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id\"\n }\n },\n {\n \"op\" : \"clone_egress_pkt_to_egress\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"tmp_41\"]\n },\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x1\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 383,\n \"column\" : 16,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.E2E, ...\"\n }\n }\n ]\n },\n {\n \"name\" : \"int373\",\n \"id\" : 164,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_hdr_report_fixed_header\", \"hw_id\"]\n },\n {\n \"type\" : \"expression\",\n \"value\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"|\",\n \"left\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \">>\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_spec\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x7\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01ff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x3f\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x07\"\n }\n }\n }\n }\n }\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 373,\n \"column\" : 8,\n \"source_fragment\" : \"hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing217\",\n \"id\" : 165,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 217,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.dscp = tmp_dscp\"\n }\n }\n ]\n },\n {\n \"name\" : \"slicing189\",\n \"id\" : 166,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_bridged36\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_bridged\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_int_report_md39\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_fabric_md_int_report_md\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_hop_latency40\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"hop_latency\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_int_md_timestamp41\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_md\", \"timestamp\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 391,\n \"column\" : 30,\n \"source_fragment\" : \"= fabric_md; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_eth_type25\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_mpls26\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_mpls\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_ipv427\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_ipv4\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_udp28\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_udp\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_report_fixed_header29\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_report_fixed_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_common_report_header30\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_common_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_local_report_header31\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_local_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_drop_report_header32\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_drop_report_header\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign_header\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"_egress_eth_type35\"\n },\n {\n \"type\" : \"header\",\n \"value\" : \"int_egress_hdr_eth_type\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 392,\n \"column\" : 27,\n \"source_fragment\" : \"= hdr; ...\"\n }\n },\n {\n \"op\" : \"assign\",\n \"parameters\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"dscp_rewriter_tmp_dscp\"]\n },\n {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_slice_tc12\"]\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 189,\n \"column\" : 4,\n \"source_fragment\" : \"bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model170\",\n \"id\" : 167,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"recirculate\",\n \"parameters\" : [\n {\n \"type\" : \"hexstr\",\n \"value\" : \"0x5\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 170,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n }\n }\n ]\n },\n {\n \"name\" : \"fabric_v1model174\",\n \"id\" : 168,\n \"runtime_data\" : [],\n \"primitives\" : [\n {\n \"op\" : \"mark_to_drop\",\n \"parameters\" : [\n {\n \"type\" : \"header\",\n \"value\" : \"standard_metadata\"\n }\n ],\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n }\n }\n ]\n }\n ],\n \"pipelines\" : [\n {\n \"name\" : \"ingress\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 35,\n \"column\" : 8,\n \"source_fragment\" : \"FabricIngress\"\n },\n \"init_table\" : \"tbl_fabric_v1model61\",\n \"tables\" : [\n {\n \"name\" : \"tbl_fabric_v1model61\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 61,\n \"column\" : 8,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [73],\n \"actions\" : [\"fabric_v1model61\"],\n \"base_default_next\" : \"node_3\",\n \"next_tables\" : {\n \"fabric_v1model61\" : \"node_3\"\n },\n \"default_entry\" : {\n \"action_id\" : 73,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model64\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 64,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [72],\n \"actions\" : [\"fabric_v1model64\"],\n \"base_default_next\" : \"node_5\",\n \"next_tables\" : {\n \"fabric_v1model64\" : \"node_5\"\n },\n \"default_entry\" : {\n \"action_id\" : 72,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model70\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 70,\n \"column\" : 51,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [74],\n \"actions\" : [\"fabric_v1model70\"],\n \"base_default_next\" : \"tbl_lookup_md_init15\",\n \"next_tables\" : {\n \"fabric_v1model70\" : \"tbl_lookup_md_init15\"\n },\n \"default_entry\" : {\n \"action_id\" : 74,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init15\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 15,\n \"column\" : 23,\n \"source_fragment\" : \"= hdr.ethernet.dst_addr; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [76],\n \"actions\" : [\"lookup_md_init15\"],\n \"base_default_next\" : \"node_8\",\n \"next_tables\" : {\n \"lookup_md_init15\" : \"node_8\"\n },\n \"default_entry\" : {\n \"action_id\" : 76,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init21\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 21,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [75],\n \"actions\" : [\"lookup_md_init21\"],\n \"base_default_next\" : \"tbl_lookup_md_init24\",\n \"next_tables\" : {\n \"lookup_md_init21\" : \"tbl_lookup_md_init24\"\n },\n \"default_entry\" : {\n \"action_id\" : 75,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init24\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 24,\n \"column\" : 23,\n \"source_fragment\" : \"= false; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [85],\n \"actions\" : [\"lookup_md_init24\"],\n \"base_default_next\" : \"node_11\",\n \"next_tables\" : {\n \"lookup_md_init24\" : \"node_11\"\n },\n \"default_entry\" : {\n \"action_id\" : 85,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init33\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 33,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [80],\n \"actions\" : [\"lookup_md_init33\"],\n \"base_default_next\" : \"node_13\",\n \"next_tables\" : {\n \"lookup_md_init33\" : \"node_13\"\n },\n \"default_entry\" : {\n \"action_id\" : 80,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init38\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 38,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_tcp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [77],\n \"actions\" : [\"lookup_md_init38\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init38\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 77,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init41\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 41,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.inner_udp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [78],\n \"actions\" : [\"lookup_md_init41\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init41\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 78,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init44\",\n \"id\" : 9,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 44,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.inner_icmp.icmp_type; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [79],\n \"actions\" : [\"lookup_md_init44\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init44\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 79,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init48\",\n \"id\" : 10,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 48,\n \"column\" : 27,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [84],\n \"actions\" : [\"lookup_md_init48\"],\n \"base_default_next\" : \"node_21\",\n \"next_tables\" : {\n \"lookup_md_init48\" : \"node_21\"\n },\n \"default_entry\" : {\n \"action_id\" : 84,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init53\",\n \"id\" : 11,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 53,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.tcp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [81],\n \"actions\" : [\"lookup_md_init53\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init53\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 81,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init56\",\n \"id\" : 12,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 56,\n \"column\" : 32,\n \"source_fragment\" : \"= hdr.udp.sport; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [82],\n \"actions\" : [\"lookup_md_init56\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init56\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 82,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_lookup_md_init59\",\n \"id\" : 13,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 59,\n \"column\" : 33,\n \"source_fragment\" : \"= hdr.icmp.icmp_type; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [83],\n \"actions\" : [\"lookup_md_init59\"],\n \"base_default_next\" : \"node_27\",\n \"next_tables\" : {\n \"lookup_md_init59\" : \"node_27\"\n },\n \"default_entry\" : {\n \"action_id\" : 83,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_pkt_io_do_packet_out\",\n \"id\" : 14,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 25,\n \"column\" : 12,\n \"source_fragment\" : \"do_packet_out()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [9],\n \"actions\" : [\"FabricIngress.pkt_io.do_packet_out\"],\n \"base_default_next\" : \"FabricIngress.int_watchlist.watchlist\",\n \"next_tables\" : {\n \"FabricIngress.pkt_io.do_packet_out\" : \"FabricIngress.int_watchlist.watchlist\"\n },\n \"default_entry\" : {\n \"action_id\" : 9,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.int_watchlist.watchlist\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 34,\n \"column\" : 10,\n \"source_fragment\" : \"watchlist\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ipv4_valid\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [68, 70, 69],\n \"actions\" : [\"FabricIngress.int_watchlist.mark_to_report\", \"FabricIngress.int_watchlist.no_report_collector\", \"FabricIngress.int_watchlist.no_report\"],\n \"base_default_next\" : \"FabricIngress.stats.flows\",\n \"next_tables\" : {\n \"FabricIngress.int_watchlist.mark_to_report\" : \"FabricIngress.stats.flows\",\n \"FabricIngress.int_watchlist.no_report_collector\" : \"FabricIngress.stats.flows\",\n \"FabricIngress.int_watchlist.no_report\" : \"FabricIngress.stats.flows\"\n },\n \"default_entry\" : {\n \"action_id\" : 69,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.stats.flows\",\n \"id\" : 16,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 21,\n \"column\" : 10,\n \"source_fragment\" : \"flows\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [8],\n \"actions\" : [\"FabricIngress.stats.count\"],\n \"base_default_next\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"next_tables\" : {\n \"FabricIngress.stats.count\" : \"FabricIngress.slice_tc_classifier.classifier\"\n },\n \"default_entry\" : {\n \"action_id\" : 8,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.slice_tc_classifier.classifier\",\n \"id\" : 17,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 44,\n \"column\" : 10,\n \"source_fragment\" : \"classifier\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 512,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [37, 39, 38],\n \"actions\" : [\"FabricIngress.slice_tc_classifier.set_slice_id_tc\", \"FabricIngress.slice_tc_classifier.trust_dscp\", \"FabricIngress.slice_tc_classifier.no_classification\"],\n \"base_default_next\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"next_tables\" : {\n \"FabricIngress.slice_tc_classifier.set_slice_id_tc\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"FabricIngress.slice_tc_classifier.trust_dscp\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"FabricIngress.slice_tc_classifier.no_classification\" : \"FabricIngress.filtering.ingress_port_vlan\"\n },\n \"default_entry\" : {\n \"action_id\" : 38,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.ingress_port_vlan\",\n \"id\" : 18,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 42,\n \"column\" : 10,\n \"source_fragment\" : \"ingress_port_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_is_valid\",\n \"target\" : [\"_ingress_vlan_tag4\", \"$valid$\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_ingress_vlan_tag4\", \"vlan_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [10, 11, 12],\n \"actions\" : [\"FabricIngress.filtering.deny\", \"FabricIngress.filtering.permit\", \"FabricIngress.filtering.permit_with_internal_vlan\"],\n \"base_default_next\" : \"FabricIngress.filtering.fwd_classifier\",\n \"next_tables\" : {\n \"FabricIngress.filtering.deny\" : \"FabricIngress.filtering.fwd_classifier\",\n \"FabricIngress.filtering.permit\" : \"FabricIngress.filtering.fwd_classifier\",\n \"FabricIngress.filtering.permit_with_internal_vlan\" : \"FabricIngress.filtering.fwd_classifier\"\n },\n \"default_entry\" : {\n \"action_id\" : 10,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.filtering.fwd_classifier\",\n \"id\" : 19,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 80,\n \"column\" : 10,\n \"source_fragment\" : \"fwd_classifier\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_type\",\n \"target\" : [\"_ingress_eth_type5\", \"value\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ip_eth_type\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ip_eth_type10\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [13],\n \"actions\" : [\"FabricIngress.filtering.set_forwarding_type\"],\n \"base_default_next\" : \"tbl_filtering100\",\n \"next_tables\" : {\n \"FabricIngress.filtering.set_forwarding_type\" : \"tbl_filtering100\"\n },\n \"default_entry\" : {\n \"action_id\" : 13,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_filtering100\",\n \"id\" : 20,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4\",\n \"line\" : 100,\n \"column\" : 8,\n \"source_fragment\" : \"fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [94],\n \"actions\" : [\"filtering100\"],\n \"base_default_next\" : \"node_35\",\n \"next_tables\" : {\n \"filtering100\" : \"node_35\"\n },\n \"default_entry\" : {\n \"action_id\" : 94,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf25\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 25,\n \"column\" : 4,\n \"source_fragment\" : \"bool is_uplink = false; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [93],\n \"actions\" : [\"upf25\"],\n \"base_default_next\" : \"node_37\",\n \"next_tables\" : {\n \"upf25\" : \"node_37\"\n },\n \"default_entry\" : {\n \"action_id\" : 93,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.interfaces\",\n \"id\" : 22,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 107,\n \"column\" : 10,\n \"source_fragment\" : \"interfaces\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv4_dst_addr\",\n \"target\" : [\"_ingress_ipv47\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"gtpu_is_valid\",\n \"target\" : [\"_ingress_gtpu12\", \"$valid$\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [45, 46, 47, 48],\n \"actions\" : [\"FabricIngress.upf.iface_access\", \"FabricIngress.upf.iface_core\", \"FabricIngress.upf.iface_dbuf\", \"FabricIngress.upf.iface_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.iface_access\" : \"tbl_upf409\",\n \"FabricIngress.upf.iface_core\" : \"tbl_upf418\",\n \"FabricIngress.upf.iface_dbuf\" : \"tbl_upf424\",\n \"FabricIngress.upf.iface_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 48,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf409\",\n \"id\" : 23,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 409,\n \"column\" : 30,\n \"source_fragment\" : \"= true; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [86],\n \"actions\" : [\"upf409\"],\n \"base_default_next\" : \"node_40\",\n \"next_tables\" : {\n \"upf409\" : \"node_40\"\n },\n \"default_entry\" : {\n \"action_id\" : 86,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_sessions\",\n \"id\" : 24,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 213,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_sessions\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tunnel_ipv4_dst\",\n \"target\" : [\"_ingress_ipv47\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"teid\",\n \"target\" : [\"_ingress_gtpu12\", \"teid\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [56, 50, 49],\n \"actions\" : [\"FabricIngress.upf.set_uplink_session\", \"FabricIngress.upf.set_uplink_session_drop\", \"FabricIngress.upf.set_uplink_session_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_uplink_session\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_uplink_session_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_uplink_session_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 49,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf418\",\n \"id\" : 25,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 418,\n \"column\" : 34,\n \"source_fragment\" : \"= fabric_md.lkp.ipv4_src; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [87],\n \"actions\" : [\"upf418\"],\n \"base_default_next\" : \"FabricIngress.upf.downlink_sessions\",\n \"next_tables\" : {\n \"upf418\" : \"FabricIngress.upf.downlink_sessions\"\n },\n \"default_entry\" : {\n \"action_id\" : 87,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_sessions\",\n \"id\" : 26,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 198,\n \"column\" : 10,\n \"source_fragment\" : \"downlink_sessions\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_addr\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [53, 54, 55, 52, 51],\n \"actions\" : [\"FabricIngress.upf.set_downlink_session\", \"FabricIngress.upf.set_downlink_session_buf\", \"FabricIngress.upf.set_downlink_session_buf_drop\", \"FabricIngress.upf.set_downlink_session_drop\", \"FabricIngress.upf.set_downlink_session_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.applications\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_downlink_session\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_buf\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_buf_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_drop\" : \"FabricIngress.upf.applications\",\n \"FabricIngress.upf.set_downlink_session_miss\" : \"FabricIngress.upf.applications\"\n },\n \"default_entry\" : {\n \"action_id\" : 51,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf424\",\n \"id\" : 27,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 424,\n \"column\" : 34,\n \"source_fragment\" : \"= fabric_md.lkp.ipv4_src; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [88],\n \"actions\" : [\"upf424\"],\n \"base_default_next\" : \"FabricIngress.upf.downlink_sessions\",\n \"next_tables\" : {\n \"upf424\" : \"FabricIngress.upf.downlink_sessions\"\n },\n \"default_entry\" : {\n \"action_id\" : 88,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.applications\",\n \"id\" : 28,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 337,\n \"column\" : 10,\n \"source_fragment\" : \"applications\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"slice_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_upf_slice_id30\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"app_ipv4_addr\",\n \"target\" : [\"scalars\", \"upf_app_ipv4_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"app_l4_port\",\n \"target\" : [\"scalars\", \"upf_app_l4_port\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"app_ip_proto\",\n \"target\" : [\"scalars\", \"upf_app_ip_proto\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 5,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [64, 5],\n \"actions\" : [\"FabricIngress.upf.set_app_id\", \"nop\"],\n \"base_default_next\" : \"node_47\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_app_id\" : \"node_47\",\n \"nop\" : \"node_47\"\n },\n \"default_entry\" : {\n \"action_id\" : 5,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_terminations\",\n \"id\" : 29,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 280,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_terminations\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_session_id\",\n \"target\" : [\"scalars\", \"upf_ue_session_id\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"app_id\",\n \"target\" : [\"scalars\", \"upf_internal_app_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [61, 59, 57],\n \"actions\" : [\"FabricIngress.upf.app_fwd\", \"FabricIngress.upf.uplink_drop\", \"FabricIngress.upf.uplink_drop_miss\"],\n \"base_default_next\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"next_tables\" : {\n \"FabricIngress.upf.app_fwd\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"FabricIngress.upf.uplink_drop\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"FabricIngress.upf.uplink_drop_miss\" : \"FabricIngress.upf.uplink_recirc_rules\"\n },\n \"default_entry\" : {\n \"action_id\" : 57,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.uplink_recirc_rules\",\n \"id\" : 30,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 387,\n \"column\" : 10,\n \"source_fragment\" : \"uplink_recirc_rules\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 64,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [65, 66, 67],\n \"actions\" : [\"FabricIngress.upf.recirc_allow\", \"FabricIngress.upf.recirc_deny\", \"FabricIngress.upf.recirc_miss\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"FabricIngress.upf.recirc_allow\" : \"tbl_upf445\",\n \"FabricIngress.upf.recirc_deny\" : \"tbl_upf445\",\n \"FabricIngress.upf.recirc_miss\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 67,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.downlink_terminations\",\n \"id\" : 31,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 295,\n \"column\" : 10,\n \"source_fragment\" : \"downlink_terminations\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"ue_session_id\",\n \"target\" : [\"scalars\", \"upf_ue_session_id\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"app_id\",\n \"target\" : [\"scalars\", \"upf_internal_app_id\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 100000,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [62, 60, 58],\n \"actions\" : [\"FabricIngress.upf.downlink_fwd_encap\", \"FabricIngress.upf.downlink_drop\", \"FabricIngress.upf.downlink_drop_miss\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"FabricIngress.upf.downlink_fwd_encap\" : \"tbl_upf445\",\n \"FabricIngress.upf.downlink_drop\" : \"tbl_upf445\",\n \"FabricIngress.upf.downlink_drop_miss\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 58,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf443\",\n \"id\" : 32,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 443,\n \"column\" : 58,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [89],\n \"actions\" : [\"upf443\"],\n \"base_default_next\" : \"tbl_upf445\",\n \"next_tables\" : {\n \"upf443\" : \"tbl_upf445\"\n },\n \"default_entry\" : {\n \"action_id\" : 89,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf445\",\n \"id\" : 33,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 445,\n \"column\" : 12,\n \"source_fragment\" : \"app_meter.execute_meter((bit<32>) app_meter_idx_internal, fabric_md.upf_meter_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [91],\n \"actions\" : [\"upf445\"],\n \"base_default_next\" : \"node_54\",\n \"next_tables\" : {\n \"upf445\" : \"node_54\"\n },\n \"default_entry\" : {\n \"action_id\" : 91,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf448\",\n \"id\" : 34,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 448,\n \"column\" : 16,\n \"source_fragment\" : \"session_meter.execute_meter((bit<32>) session_meter_idx_internal, fabric_md.upf_meter_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [90],\n \"actions\" : [\"upf448\"],\n \"base_default_next\" : \"FabricIngress.upf.ig_tunnel_peers\",\n \"next_tables\" : {\n \"upf448\" : \"FabricIngress.upf.ig_tunnel_peers\"\n },\n \"default_entry\" : {\n \"action_id\" : 90,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.upf.ig_tunnel_peers\",\n \"id\" : 35,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 317,\n \"column\" : 10,\n \"source_fragment\" : \"ig_tunnel_peers\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tun_peer_id\",\n \"target\" : [\"_ingress_bridged4\", \"_upf_tun_peer_id13\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 256,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [63, 4],\n \"actions\" : [\"FabricIngress.upf.set_routing_ipv4_dst\", \"nop\"],\n \"base_default_next\" : \"node_57\",\n \"next_tables\" : {\n \"FabricIngress.upf.set_routing_ipv4_dst\" : \"node_57\",\n \"nop\" : \"node_57\"\n },\n \"default_entry\" : {\n \"action_id\" : 4,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf461\",\n \"id\" : 36,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 461,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [92],\n \"actions\" : [\"upf461\"],\n \"base_default_next\" : \"node_59\",\n \"next_tables\" : {\n \"upf461\" : \"node_59\"\n },\n \"default_entry\" : {\n \"action_id\" : 92,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.bridging\",\n \"id\" : 37,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 39,\n \"column\" : 10,\n \"source_fragment\" : \"bridging\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_ingress_bridged4\", \"_base_vlan_id6\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [18, 14],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_bridging\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_bridging\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 14,\n \"action_const\" : true,\n \"action_data\" : [\"0x59\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.mpls\",\n \"id\" : 38,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 74,\n \"column\" : 10,\n \"source_fragment\" : \"mpls\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"mpls_label\",\n \"target\" : [\"_ingress_bridged4\", \"_base_mpls_label2\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [19, 15],\n \"actions\" : [\"FabricIngress.forwarding.pop_mpls_and_next\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.pop_mpls_and_next\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 15,\n \"action_const\" : true,\n \"action_data\" : [\"0x81\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v4\",\n \"id\" : 39,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 116,\n \"column\" : 10,\n \"source_fragment\" : \"routing_v4\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_routing_ipv4_dst18\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [20, 21, 22, 16],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_routing_v4\", \"FabricIngress.forwarding.nop_routing_v4\", \"FabricIngress.forwarding.drop_routing_v4\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.nop_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.drop_routing_v4\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 16,\n \"action_const\" : false,\n \"action_data\" : [\"0x1d\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricIngress.forwarding.routing_v6\",\n \"id\" : 40,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 155,\n \"column\" : 10,\n \"source_fragment\" : \"routing_v6\"\n },\n \"key\" : [\n {\n \"match_type\" : \"lpm\",\n \"name\" : \"ipv6_dst\",\n \"target\" : [\"_ingress_ipv68\", \"dst_addr\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"lpm\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [23, 24, 17],\n \"actions\" : [\"FabricIngress.forwarding.set_next_id_routing_v6\", \"FabricIngress.forwarding.drop_routing_v6\", \"FabricIngress.forwarding.set_int_drop_reason\"],\n \"base_default_next\" : \"tbl_hasher17\",\n \"next_tables\" : {\n \"FabricIngress.forwarding.set_next_id_routing_v6\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.drop_routing_v6\" : \"tbl_hasher17\",\n \"FabricIngress.forwarding.set_int_drop_reason\" : \"tbl_hasher17\"\n },\n \"default_entry\" : {\n \"action_id\" : 17,\n \"action_const\" : false,\n \"action_data\" : [\"0x1d\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_hasher17\",\n \"id\" : 41,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 17,\n \"column\" : 8,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [99],\n \"actions\" : [\"hasher17\"],\n \"base_default_next\" : \"node_69\",\n \"next_tables\" : {\n \"hasher17\" : \"node_69\"\n },\n \"default_entry\" : {\n \"action_id\" : 99,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher28\",\n \"id\" : 42,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 28,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [95],\n \"actions\" : [\"hasher28\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher28\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 95,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher39\",\n \"id\" : 43,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 39,\n \"column\" : 12,\n \"source_fragment\" : \"hash( ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [96],\n \"actions\" : [\"hasher39\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher39\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 96,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher50\",\n \"id\" : 44,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 50,\n \"column\" : 32,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [97],\n \"actions\" : [\"hasher50\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher50\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 97,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_hasher66\",\n \"id\" : 45,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 66,\n \"column\" : 46,\n \"source_fragment\" : \"= 0; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [98],\n \"actions\" : [\"hasher66\"],\n \"base_default_next\" : \"node_76\",\n \"next_tables\" : {\n \"hasher66\" : \"node_76\"\n },\n \"default_entry\" : {\n \"action_id\" : 98,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_mpls\",\n \"id\" : 46,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 22,\n \"column\" : 10,\n \"source_fragment\" : \"next_mpls\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [25, 0],\n \"actions\" : [\"FabricIngress.pre_next.set_mpls_label\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.pre_next.next_vlan\",\n \"next_tables\" : {\n \"FabricIngress.pre_next.set_mpls_label\" : \"FabricIngress.pre_next.next_vlan\",\n \"nop\" : \"FabricIngress.pre_next.next_vlan\"\n },\n \"default_entry\" : {\n \"action_id\" : 0,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.pre_next.next_vlan\",\n \"id\" : 47,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4\",\n \"line\" : 54,\n \"column\" : 10,\n \"source_fragment\" : \"next_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [26, 1],\n \"actions\" : [\"FabricIngress.pre_next.set_vlan\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.acl.acl\",\n \"next_tables\" : {\n \"FabricIngress.pre_next.set_vlan\" : \"FabricIngress.acl.acl\",\n \"nop\" : \"FabricIngress.acl.acl\"\n },\n \"default_entry\" : {\n \"action_id\" : 1,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.acl.acl\",\n \"id\" : 48,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4\",\n \"line\" : 74,\n \"column\" : 10,\n \"source_fragment\" : \"acl\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port\",\n \"target\" : [\"_ingress_bridged4\", \"_base_ig_port3\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_dst\",\n \"target\" : [\"_ingress_ethernet3\", \"dst_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_src\",\n \"target\" : [\"_ingress_ethernet3\", \"src_addr\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_vlan_id9\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"eth_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_eth_type8\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_src\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_src11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ipv4_dst\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ipv4_dst12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ip_proto\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_ip_proto13\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"icmp_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_type16\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"icmp_code\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_icmp_code17\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_sport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_sport14\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"l4_dport\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_lkp_l4_dport15\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"ig_port_type\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_ig_port_type33\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [27, 29, 28, 30, 31, 32],\n \"actions\" : [\"FabricIngress.acl.set_next_id_acl\", \"FabricIngress.acl.punt_to_cpu\", \"FabricIngress.acl.copy_to_cpu\", \"FabricIngress.acl.drop\", \"FabricIngress.acl.set_output_port\", \"FabricIngress.acl.nop_acl\"],\n \"base_default_next\" : \"node_80\",\n \"next_tables\" : {\n \"FabricIngress.acl.set_next_id_acl\" : \"node_80\",\n \"FabricIngress.acl.punt_to_cpu\" : \"node_80\",\n \"FabricIngress.acl.copy_to_cpu\" : \"node_80\",\n \"FabricIngress.acl.drop\" : \"node_80\",\n \"FabricIngress.acl.set_output_port\" : \"node_80\",\n \"FabricIngress.acl.nop_acl\" : \"node_80\"\n },\n \"default_entry\" : {\n \"action_id\" : 32,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.next.hashed\",\n \"id\" : 49,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 127,\n \"column\" : 10,\n \"source_fragment\" : \"hashed\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"indirect_ws\",\n \"action_profile\" : \"FabricIngress.next.hashed_profile\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [33, 34, 2],\n \"actions\" : [\"FabricIngress.next.output_hashed\", \"FabricIngress.next.routing_hashed\", \"nop\"],\n \"base_default_next\" : \"FabricIngress.next.multicast\",\n \"next_tables\" : {\n \"FabricIngress.next.output_hashed\" : \"FabricIngress.next.multicast\",\n \"FabricIngress.next.routing_hashed\" : \"FabricIngress.next.multicast\",\n \"nop\" : \"FabricIngress.next.multicast\"\n }\n },\n {\n \"name\" : \"FabricIngress.next.multicast\",\n \"id\" : 50,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 161,\n \"column\" : 10,\n \"source_fragment\" : \"multicast\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"next_id\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_next_id21\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [35, 36],\n \"actions\" : [\"FabricIngress.next.set_mcast_group_id\", \"FabricIngress.next.reset_mcast_group_id\"],\n \"base_default_next\" : \"FabricIngress.qos.set_slice_tc\",\n \"next_tables\" : {\n \"FabricIngress.next.set_mcast_group_id\" : \"FabricIngress.qos.set_slice_tc\",\n \"FabricIngress.next.reset_mcast_group_id\" : \"FabricIngress.qos.set_slice_tc\"\n },\n \"default_entry\" : {\n \"action_id\" : 36,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.qos.set_slice_tc\",\n \"id\" : 51,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 91,\n \"column\" : 10,\n \"source_fragment\" : \"set_slice_tc\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"fabric_md.is_upf_hit\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_is_upf_hit29\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [40, 41, 7],\n \"actions\" : [\"FabricIngress.qos.use_upf\", \"FabricIngress.qos.use_default\", \"NoAction\"],\n \"base_default_next\" : \"FabricIngress.qos.default_tc\",\n \"next_tables\" : {\n \"FabricIngress.qos.use_upf\" : \"FabricIngress.qos.default_tc\",\n \"FabricIngress.qos.use_default\" : \"FabricIngress.qos.default_tc\",\n \"NoAction\" : \"FabricIngress.qos.default_tc\"\n },\n \"default_entry\" : {\n \"action_id\" : 7,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 96,\n \"column\" : 12,\n \"source_fragment\" : \"true: use_upf\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 40,\n \"action_data\" : []\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 97,\n \"column\" : 12,\n \"source_fragment\" : \"false: use_default\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 41,\n \"action_data\" : []\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"FabricIngress.qos.default_tc\",\n \"id\" : 52,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 150,\n \"column\" : 10,\n \"source_fragment\" : \"default_tc\"\n },\n \"key\" : [\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"slice_tc\",\n \"target\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tc_unknown\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_tc_unknown28\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 16,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [44, 3],\n \"actions\" : [\"FabricIngress.qos.set_default_tc\", \"nop\"],\n \"base_default_next\" : \"node_85\",\n \"next_tables\" : {\n \"FabricIngress.qos.set_default_tc\" : \"node_85\",\n \"nop\" : \"node_85\"\n },\n \"default_entry\" : {\n \"action_id\" : 3,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing174\",\n \"id\" : 53,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [100],\n \"actions\" : [\"slicing174\"],\n \"base_default_next\" : \"FabricIngress.qos.queues\",\n \"next_tables\" : {\n \"slicing174\" : \"FabricIngress.qos.queues\"\n },\n \"default_entry\" : {\n \"action_id\" : 100,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing177\",\n \"id\" : 54,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 177,\n \"column\" : 25,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [101],\n \"actions\" : [\"slicing177\"],\n \"base_default_next\" : \"FabricIngress.qos.queues\",\n \"next_tables\" : {\n \"slicing177\" : \"FabricIngress.qos.queues\"\n },\n \"default_entry\" : {\n \"action_id\" : 101,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.qos.queues\",\n \"id\" : 55,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 122,\n \"column\" : 10,\n \"source_fragment\" : \"queues\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"slice_tc\",\n \"target\" : [\"_ingress_bridged4\", \"_base_slice_tc12\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"color\",\n \"target\" : [\"scalars\", \"qos_packet_color\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 128,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [42, 43],\n \"actions\" : [\"FabricIngress.qos.set_queue\", \"FabricIngress.qos.meter_drop\"],\n \"base_default_next\" : \"tbl_int112\",\n \"next_tables\" : {\n \"FabricIngress.qos.set_queue\" : \"tbl_int112\",\n \"FabricIngress.qos.meter_drop\" : \"tbl_int112\"\n },\n \"default_entry\" : {\n \"action_id\" : 42,\n \"action_const\" : true,\n \"action_data\" : [\"0x0\"],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int112\",\n \"id\" : 56,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 112,\n \"column\" : 46,\n \"source_fragment\" : \"= standard_md.egress_spec; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [102],\n \"actions\" : [\"int112\"],\n \"base_default_next\" : \"FabricIngress.int_ingress.drop_report\",\n \"next_tables\" : {\n \"int112\" : \"FabricIngress.int_ingress.drop_report\"\n },\n \"default_entry\" : {\n \"action_id\" : 102,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricIngress.int_ingress.drop_report\",\n \"id\" : 57,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 86,\n \"column\" : 10,\n \"source_fragment\" : \"drop_report\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"_ingress_bridged4\", \"_int_bmd_report_type21\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"drop_ctl\",\n \"target\" : [\"scalars\", \"userMetadata._drop_ctl2\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"punt_to_cpu\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_punt_to_cpu23\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"egress_port_set\",\n \"target\" : [\"scalars\", \"userMetadata._ingress_egress_port_set22\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"ternary\",\n \"name\" : \"mcast_group_id\",\n \"target\" : [\"standard_metadata\", \"mcast_grp\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"ternary\",\n \"type\" : \"simple\",\n \"max_size\" : 3,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [71, 6],\n \"actions\" : [\"FabricIngress.int_ingress.report_drop\", \"nop\"],\n \"base_default_next\" : \"tbl_fabric_v1model106\",\n \"next_tables\" : {\n \"FabricIngress.int_ingress.report_drop\" : \"tbl_fabric_v1model106\",\n \"nop\" : \"tbl_fabric_v1model106\"\n },\n \"default_entry\" : {\n \"action_id\" : 6,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 101,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0x0000\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 102,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0x0000\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 2\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 104,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"ternary\",\n \"key\" : \"0x0000\",\n \"mask\" : \"0xffff\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 71,\n \"action_data\" : []\n },\n \"priority\" : 3\n }\n ]\n },\n {\n \"name\" : \"tbl_fabric_v1model106\",\n \"id\" : 58,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 106,\n \"column\" : 33,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [104],\n \"actions\" : [\"fabric_v1model106\"],\n \"base_default_next\" : \"node_92\",\n \"next_tables\" : {\n \"fabric_v1model106\" : \"node_92\"\n },\n \"default_entry\" : {\n \"action_id\" : 104,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model110\",\n \"id\" : 59,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 110,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [103],\n \"actions\" : [\"fabric_v1model110\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"fabric_v1model110\" : null\n },\n \"default_entry\" : {\n \"action_id\" : 103,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n }\n ],\n \"action_profiles\" : [\n {\n \"name\" : \"FabricIngress.next.hashed_profile\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 112,\n \"column\" : 15,\n \"source_fragment\" : \"hashed_profile\"\n },\n \"max_size\" : 16,\n \"selector\" : {\n \"algo\" : \"crc16\",\n \"input\" : [\n {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_ecmp_hash5\"]\n }\n ]\n }\n }\n ],\n \"conditionals\" : [\n {\n \"name\" : \"node_3\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 62,\n \"column\" : 12,\n \"source_fragment\" : \"standard_md.parser_error == error.PacketRejectedByParser\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"parser_error\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x8\"\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model64\",\n \"false_next\" : \"node_5\"\n },\n {\n \"name\" : \"node_5\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 67,\n \"column\" : 13,\n \"source_fragment\" : \"standard_md.instance_type == 4\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"instance_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000004\"\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model70\",\n \"false_next\" : \"tbl_lookup_md_init15\"\n },\n {\n \"name\" : \"node_8\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 20,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.vlan_tag.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vlan_tag4\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init21\",\n \"false_next\" : \"tbl_lookup_md_init24\"\n },\n {\n \"name\" : \"node_11\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 32,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.inner_ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init33\",\n \"false_next\" : \"node_19\"\n },\n {\n \"name\" : \"node_13\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 37,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.inner_tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_tcp19\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init38\",\n \"false_next\" : \"node_15\"\n },\n {\n \"name\" : \"node_15\",\n \"id\" : 5,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 40,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.inner_udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_udp20\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init41\",\n \"false_next\" : \"node_17\"\n },\n {\n \"name\" : \"node_17\",\n \"id\" : 6,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 43,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.inner_icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_icmp21\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init44\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_19\",\n \"id\" : 7,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 47,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init48\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_21\",\n \"id\" : 8,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 52,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init53\",\n \"false_next\" : \"node_23\"\n },\n {\n \"name\" : \"node_23\",\n \"id\" : 9,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 55,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init56\",\n \"false_next\" : \"node_25\"\n },\n {\n \"name\" : \"node_25\",\n \"id\" : 10,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4\",\n \"line\" : 58,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_lookup_md_init59\",\n \"false_next\" : \"node_27\"\n },\n {\n \"name\" : \"node_27\",\n \"id\" : 11,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 24,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_out.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_packet_out0\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_pkt_io_do_packet_out\",\n \"false_next\" : \"FabricIngress.int_watchlist.watchlist\"\n },\n {\n \"name\" : \"node_35\",\n \"id\" : 12,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 84,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n }\n }\n },\n \"false_next\" : \"tbl_upf25\",\n \"true_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_37\",\n \"id\" : 13,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 406,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.interfaces\",\n \"false_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_40\",\n \"id\" : 14,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 413,\n \"column\" : 24,\n \"source_fragment\" : \"fabric_md.bridged.base.encap_presence != EncapPresence.NONE\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_encap_presence7\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.uplink_sessions\",\n \"false_next\" : \"FabricIngress.upf.applications\"\n },\n {\n \"name\" : \"node_47\",\n \"id\" : 15,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 433,\n \"column\" : 16,\n \"source_fragment\" : \"sess_hit\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_sess_hit\"]\n }\n }\n },\n \"true_next\" : \"node_48\",\n \"false_next\" : \"tbl_upf443\"\n },\n {\n \"name\" : \"node_48\",\n \"id\" : 16,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 434,\n \"column\" : 20,\n \"source_fragment\" : \"is_uplink\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_is_uplink\"]\n }\n }\n },\n \"true_next\" : \"FabricIngress.upf.uplink_terminations\",\n \"false_next\" : \"FabricIngress.upf.downlink_terminations\"\n },\n {\n \"name\" : \"node_54\",\n \"id\" : 17,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 446,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.upf_meter_color != MeterColor_t.RED\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"true_next\" : \"tbl_upf448\",\n \"false_next\" : \"FabricIngress.upf.ig_tunnel_peers\"\n },\n {\n \"name\" : \"node_57\",\n \"id\" : 18,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 451,\n \"column\" : 16,\n \"source_fragment\" : \"term_hit\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"upf_term_hit\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf461\",\n \"false_next\" : \"node_59\"\n },\n {\n \"name\" : \"node_59\",\n \"id\" : 19,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 88,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_forwarding19\"]\n }\n }\n },\n \"false_next\" : \"node_60\",\n \"true_next\" : \"tbl_hasher17\"\n },\n {\n \"name\" : \"node_60\",\n \"id\" : 20,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 178,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.ethernet.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ethernet3\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.bridging\",\n \"false_next\" : \"node_62\"\n },\n {\n \"name\" : \"node_62\",\n \"id\" : 21,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 181,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.mpls.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.mpls\",\n \"false_next\" : \"node_64\"\n },\n {\n \"name\" : \"node_64\",\n \"id\" : 22,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 184,\n \"column\" : 19,\n \"source_fragment\" : \"fabric_md.lkp.is_ipv4 && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x03\"\n }\n }\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.routing_v4\",\n \"false_next\" : \"node_66\"\n },\n {\n \"name\" : \"node_66\",\n \"id\" : 23,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4\",\n \"line\" : 188,\n \"column\" : 19,\n \"source_fragment\" : \"hdr.ipv6.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n }\n }\n },\n \"true_next\" : \"FabricIngress.forwarding.routing_v6\",\n \"false_next\" : \"tbl_hasher17\"\n },\n {\n \"name\" : \"node_69\",\n \"id\" : 24,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 27,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_bridged4\", \"_upf_needs_gtpu_encap16\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher28\",\n \"false_next\" : \"node_71\"\n },\n {\n \"name\" : \"node_71\",\n \"id\" : 25,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4\",\n \"line\" : 38,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.gtpu.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher39\",\n \"false_next\" : \"node_73\"\n },\n {\n \"name\" : \"node_73\",\n \"id\" : 26,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 91,\n \"column\" : 34,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_lkp_is_ipv410\"]\n }\n }\n },\n \"true_next\" : \"tbl_hasher50\",\n \"false_next\" : \"tbl_hasher66\"\n },\n {\n \"name\" : \"node_76\",\n \"id\" : 27,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 92,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n }\n }\n },\n \"false_next\" : \"FabricIngress.pre_next.next_mpls\",\n \"true_next\" : \"FabricIngress.acl.acl\"\n },\n {\n \"name\" : \"node_80\",\n \"id\" : 28,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 96,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_skip_next20\"]\n }\n }\n },\n \"false_next\" : \"FabricIngress.next.hashed\",\n \"true_next\" : \"FabricIngress.qos.set_slice_tc\"\n },\n {\n \"name\" : \"node_85\",\n \"id\" : 29,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 173,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.upf_meter_color != MeterColor_t.RED\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._ingress_upf_meter_color32\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n },\n \"true_next\" : \"tbl_slicing174\",\n \"false_next\" : \"tbl_slicing177\"\n },\n {\n \"name\" : \"node_92\",\n \"id\" : 30,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 109,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.drop_ctl == 1\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"false_next\" : null,\n \"true_next\" : \"tbl_fabric_v1model110\"\n }\n ]\n },\n {\n \"name\" : \"egress\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 115,\n \"column\" : 8,\n \"source_fragment\" : \"FabricEgress\"\n },\n \"init_table\" : \"tbl_fabric_v1model133\",\n \"tables\" : [\n {\n \"name\" : \"tbl_fabric_v1model133\",\n \"id\" : 60,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 133,\n \"column\" : 34,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [138],\n \"actions\" : [\"fabric_v1model133\"],\n \"base_default_next\" : \"node_97\",\n \"next_tables\" : {\n \"fabric_v1model133\" : \"node_97\"\n },\n \"default_entry\" : {\n \"action_id\" : 138,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model136\",\n \"id\" : 61,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 136,\n \"column\" : 12,\n \"source_fragment\" : \"exit\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [137],\n \"actions\" : [\"fabric_v1model136\"],\n \"base_default_next\" : \"node_99\",\n \"next_tables\" : {\n \"fabric_v1model136\" : \"node_99\"\n },\n \"default_entry\" : {\n \"action_id\" : 137,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator14\",\n \"id\" : 62,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [140],\n \"actions\" : [\"int_tna_parser_emulator14\"],\n \"base_default_next\" : \"node_101\",\n \"next_tables\" : {\n \"int_tna_parser_emulator14\" : \"node_101\"\n },\n \"default_entry\" : {\n \"action_id\" : 140,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator148\",\n \"id\" : 63,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [139],\n \"actions\" : [\"int_tna_parser_emulator148\"],\n \"base_default_next\" : \"node_103\",\n \"next_tables\" : {\n \"int_tna_parser_emulator148\" : \"node_103\"\n },\n \"default_entry\" : {\n \"action_id\" : 139,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_ingress_drop\",\n \"id\" : 64,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 165,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_ingress_drop()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [124],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_ingress_drop\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator166\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_ingress_drop\" : \"tbl_int_tna_parser_emulator166\"\n },\n \"default_entry\" : {\n \"action_id\" : 124,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator166\",\n \"id\" : 65,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [141],\n \"actions\" : [\"int_tna_parser_emulator166\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173\",\n \"next_tables\" : {\n \"int_tna_parser_emulator166\" : \"tbl_int_tna_parser_emulator173\"\n },\n \"default_entry\" : {\n \"action_id\" : 141,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_report_mirror\",\n \"id\" : 66,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_report_mirror()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [126],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_report_mirror\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator169\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_report_mirror\" : \"tbl_int_tna_parser_emulator169\"\n },\n \"default_entry\" : {\n \"action_id\" : 126,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator169\",\n \"id\" : 67,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [142],\n \"actions\" : [\"int_tna_parser_emulator169\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173\",\n \"next_tables\" : {\n \"int_tna_parser_emulator169\" : \"tbl_int_tna_parser_emulator173\"\n },\n \"default_entry\" : {\n \"action_id\" : 142,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator173\",\n \"id\" : 68,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [143],\n \"actions\" : [\"int_tna_parser_emulator173\"],\n \"base_default_next\" : \"node_109\",\n \"next_tables\" : {\n \"int_tna_parser_emulator173\" : \"node_109\"\n },\n \"default_entry\" : {\n \"action_id\" : 143,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator14_0\",\n \"id\" : 69,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 14,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [145],\n \"actions\" : [\"int_tna_parser_emulator14_0\"],\n \"base_default_next\" : \"node_111\",\n \"next_tables\" : {\n \"int_tna_parser_emulator14_0\" : \"node_111\"\n },\n \"default_entry\" : {\n \"action_id\" : 145,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator148_0\",\n \"id\" : 70,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 148,\n \"column\" : 12,\n \"source_fragment\" : \"hdr_v1model.ingress.ipv4.setInvalid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [144],\n \"actions\" : [\"int_tna_parser_emulator148_0\"],\n \"base_default_next\" : \"node_113\",\n \"next_tables\" : {\n \"int_tna_parser_emulator148_0\" : \"node_113\"\n },\n \"default_entry\" : {\n \"action_id\" : 144,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_ingress_drop_0\",\n \"id\" : 71,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 165,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_ingress_drop()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [125],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_ingress_drop\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator166_0\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_ingress_drop\" : \"tbl_int_tna_parser_emulator166_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 125,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator166_0\",\n \"id\" : 72,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 166,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [146],\n \"actions\" : [\"int_tna_parser_emulator166_0\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173_0\",\n \"next_tables\" : {\n \"int_tna_parser_emulator166_0\" : \"tbl_int_tna_parser_emulator173_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 146,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_parser_emulator_parse_int_report_mirror_0\",\n \"id\" : 73,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"parse_int_report_mirror()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [127],\n \"actions\" : [\"FabricEgress.parser_emulator.parse_int_report_mirror\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator169_0\",\n \"next_tables\" : {\n \"FabricEgress.parser_emulator.parse_int_report_mirror\" : \"tbl_int_tna_parser_emulator169_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 127,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator169_0\",\n \"id\" : 74,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 169,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(PRESERVE_INT_MD)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [147],\n \"actions\" : [\"int_tna_parser_emulator169_0\"],\n \"base_default_next\" : \"tbl_int_tna_parser_emulator173_0\",\n \"next_tables\" : {\n \"int_tna_parser_emulator169_0\" : \"tbl_int_tna_parser_emulator173_0\"\n },\n \"default_entry\" : {\n \"action_id\" : 147,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int_tna_parser_emulator173_0\",\n \"id\" : 75,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 173,\n \"column\" : 27,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [148],\n \"actions\" : [\"int_tna_parser_emulator173_0\"],\n \"base_default_next\" : \"FabricEgress.pkt_io_egress.switch_info\",\n \"next_tables\" : {\n \"int_tna_parser_emulator173_0\" : \"FabricEgress.pkt_io_egress.switch_info\"\n },\n \"default_entry\" : {\n \"action_id\" : 148,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.pkt_io_egress.switch_info\",\n \"id\" : 76,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 39,\n \"column\" : 10,\n \"source_fragment\" : \"switch_info\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [113, 105],\n \"actions\" : [\"FabricEgress.pkt_io_egress.set_switch_info\", \"nop\"],\n \"base_default_next\" : \"node_120\",\n \"next_tables\" : {\n \"FabricEgress.pkt_io_egress.set_switch_info\" : \"node_120\",\n \"nop\" : \"node_120\"\n },\n \"default_entry\" : {\n \"action_id\" : 105,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_packetio51\",\n \"id\" : 77,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 51,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.packet_in.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [149],\n \"actions\" : [\"packetio51\"],\n \"base_default_next\" : \"node_122\",\n \"next_tables\" : {\n \"packetio51\" : \"node_122\"\n },\n \"default_entry\" : {\n \"action_id\" : 149,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_packetio60\",\n \"id\" : 78,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 60,\n \"column\" : 37,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [150],\n \"actions\" : [\"packetio60\"],\n \"base_default_next\" : \"node_124\",\n \"next_tables\" : {\n \"packetio60\" : \"node_124\"\n },\n \"default_entry\" : {\n \"action_id\" : 150,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.stats.flows\",\n \"id\" : 79,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 53,\n \"column\" : 10,\n \"source_fragment\" : \"flows\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"stats_flow_id\",\n \"target\" : [\"_egress_bridged36\", \"_base_stats_flow_id11\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [112],\n \"actions\" : [\"FabricEgress.stats.count\"],\n \"base_default_next\" : \"node_126\",\n \"next_tables\" : {\n \"FabricEgress.stats.count\" : \"node_126\"\n },\n \"default_entry\" : {\n \"action_id\" : 112,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next283\",\n \"id\" : 80,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 283,\n \"column\" : 50,\n \"source_fragment\" : \"= INT_REPORT_TYPE_NO_REPORT; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [151],\n \"actions\" : [\"next283\"],\n \"base_default_next\" : \"node_128\",\n \"next_tables\" : {\n \"next283\" : \"node_128\"\n },\n \"default_entry\" : {\n \"action_id\" : 151,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_egress_next_pop_mpls_if_present\",\n \"id\" : 81,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 289,\n \"column\" : 36,\n \"source_fragment\" : \"pop_mpls_if_present()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [114],\n \"actions\" : [\"FabricEgress.egress_next.pop_mpls_if_present\"],\n \"base_default_next\" : \"node_132\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.pop_mpls_if_present\" : \"node_132\"\n },\n \"default_entry\" : {\n \"action_id\" : 114,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_egress_next_set_mpls\",\n \"id\" : 82,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 291,\n \"column\" : 12,\n \"source_fragment\" : \"set_mpls()\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [115],\n \"actions\" : [\"FabricEgress.egress_next.set_mpls\"],\n \"base_default_next\" : \"node_132\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.set_mpls\" : \"node_132\"\n },\n \"default_entry\" : {\n \"action_id\" : 115,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.egress_next.egress_vlan\",\n \"id\" : 83,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 264,\n \"column\" : 10,\n \"source_fragment\" : \"egress_vlan\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"vlan_id\",\n \"target\" : [\"_egress_bridged36\", \"_base_vlan_id6\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [116, 117, 118],\n \"actions\" : [\"FabricEgress.egress_next.push_vlan\", \"FabricEgress.egress_next.pop_vlan\", \"FabricEgress.egress_next.drop\"],\n \"base_default_next\" : \"node_134\",\n \"next_tables\" : {\n \"FabricEgress.egress_next.push_vlan\" : \"node_134\",\n \"FabricEgress.egress_next.pop_vlan\" : \"node_134\",\n \"FabricEgress.egress_next.drop\" : \"node_134\"\n },\n \"default_entry\" : {\n \"action_id\" : 118,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next323\",\n \"id\" : 84,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 323,\n \"column\" : 25,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [153],\n \"actions\" : [\"next323\"],\n \"base_default_next\" : \"node_136\",\n \"next_tables\" : {\n \"next323\" : \"node_136\"\n },\n \"default_entry\" : {\n \"action_id\" : 153,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next325\",\n \"id\" : 85,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 325,\n \"column\" : 25,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [152],\n \"actions\" : [\"next325\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next325\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 152,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next333\",\n \"id\" : 86,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 333,\n \"column\" : 33,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [154],\n \"actions\" : [\"next333\"],\n \"base_default_next\" : \"node_141\",\n \"next_tables\" : {\n \"next333\" : \"node_141\"\n },\n \"default_entry\" : {\n \"action_id\" : 154,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next336\",\n \"id\" : 87,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 336,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [155],\n \"actions\" : [\"next336\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next336\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 155,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next343\",\n \"id\" : 88,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 343,\n \"column\" : 39,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [156],\n \"actions\" : [\"next343\"],\n \"base_default_next\" : \"node_146\",\n \"next_tables\" : {\n \"next343\" : \"node_146\"\n },\n \"default_entry\" : {\n \"action_id\" : 156,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_next346\",\n \"id\" : 89,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 346,\n \"column\" : 29,\n \"source_fragment\" : \"= 1; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [157],\n \"actions\" : [\"next346\"],\n \"base_default_next\" : \"node_148\",\n \"next_tables\" : {\n \"next346\" : \"node_148\"\n },\n \"default_entry\" : {\n \"action_id\" : 157,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf610\",\n \"id\" : 90,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 610,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_udp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [158],\n \"actions\" : [\"upf610\"],\n \"base_default_next\" : \"node_152\",\n \"next_tables\" : {\n \"upf610\" : \"node_152\"\n },\n \"default_entry\" : {\n \"action_id\" : 158,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf615\",\n \"id\" : 91,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 615,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_tcp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [159],\n \"actions\" : [\"upf615\"],\n \"base_default_next\" : \"node_154\",\n \"next_tables\" : {\n \"upf615\" : \"node_154\"\n },\n \"default_entry\" : {\n \"action_id\" : 159,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf620\",\n \"id\" : 92,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 620,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.inner_icmp.setValid(); ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [160],\n \"actions\" : [\"upf620\"],\n \"base_default_next\" : \"FabricEgress.upf.gtpu_encap\",\n \"next_tables\" : {\n \"upf620\" : \"FabricEgress.upf.gtpu_encap\"\n },\n \"default_entry\" : {\n \"action_id\" : 160,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.upf.gtpu_encap\",\n \"id\" : 93,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 597,\n \"column\" : 10,\n \"source_fragment\" : \"gtpu_encap\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [122, 123],\n \"actions\" : [\"FabricEgress.upf.gtpu_only\", \"FabricEgress.upf.gtpu_with_psc\"],\n \"base_default_next\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"next_tables\" : {\n \"FabricEgress.upf.gtpu_only\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"FabricEgress.upf.gtpu_with_psc\" : \"FabricEgress.upf.eg_tunnel_peers\"\n },\n \"default_entry\" : {\n \"action_id\" : 122,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.upf.eg_tunnel_peers\",\n \"id\" : 94,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 491,\n \"column\" : 10,\n \"source_fragment\" : \"eg_tunnel_peers\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"tun_peer_id\",\n \"target\" : [\"_egress_bridged36\", \"_upf_tun_peer_id13\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 256,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [121, 107],\n \"actions\" : [\"FabricEgress.upf.load_tunnel_params\", \"nop\"],\n \"base_default_next\" : \"node_158\",\n \"next_tables\" : {\n \"FabricEgress.upf.load_tunnel_params\" : \"node_158\",\n \"nop\" : \"node_158\"\n },\n \"default_entry\" : {\n \"action_id\" : 107,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_upf628\",\n \"id\" : 95,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 628,\n \"column\" : 16,\n \"source_fragment\" : \"terminations_counter.count((bit<32>)fabric_md.bridged.upf.upf_ctr_id)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [161],\n \"actions\" : [\"upf628\"],\n \"base_default_next\" : \"tbl_int128\",\n \"next_tables\" : {\n \"upf628\" : \"tbl_int128\"\n },\n \"default_entry\" : {\n \"action_id\" : 161,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_int128\",\n \"id\" : 96,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 128,\n \"column\" : 4,\n \"source_fragment\" : \"egress_headers_t hdr = hdr_v1model.egress; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [162],\n \"actions\" : [\"int128\"],\n \"base_default_next\" : \"FabricEgress.int_egress.queue_latency_thresholds\",\n \"next_tables\" : {\n \"int128\" : \"FabricEgress.int_egress.queue_latency_thresholds\"\n },\n \"default_entry\" : {\n \"action_id\" : 162,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.queue_latency_thresholds\",\n \"id\" : 97,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 159,\n \"column\" : 10,\n \"source_fragment\" : \"queue_latency_thresholds\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"egress_qid\",\n \"target\" : [\"scalars\", \"int_egress_egress_qid\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"hop_latency_upper\",\n \"target\" : [\"scalars\", \"key_0\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"range\",\n \"name\" : \"hop_latency_lower\",\n \"target\" : [\"scalars\", \"key_1\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"range\",\n \"type\" : \"simple\",\n \"max_size\" : 128,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [128, 129, 108],\n \"actions\" : [\"FabricEgress.int_egress.check_quota\", \"FabricEgress.int_egress.reset_quota\", \"nop\"],\n \"base_default_next\" : \"FabricEgress.int_egress.config\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.check_quota\" : \"FabricEgress.int_egress.config\",\n \"FabricEgress.int_egress.reset_quota\" : \"FabricEgress.int_egress.config\",\n \"nop\" : \"FabricEgress.int_egress.config\"\n },\n \"default_entry\" : {\n \"action_id\" : 108,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.config\",\n \"id\" : 98,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 183,\n \"column\" : 10,\n \"source_fragment\" : \"config\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [130],\n \"actions\" : [\"FabricEgress.int_egress.set_config\"],\n \"base_default_next\" : \"tbl_int373\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.set_config\" : \"tbl_int373\"\n },\n \"default_entry\" : {\n \"action_id\" : 130,\n \"action_const\" : false,\n \"action_data\" : [\"0xffffff00\", \"0xffffc0000000\"],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"tbl_int373\",\n \"id\" : 99,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 373,\n \"column\" : 38,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [164],\n \"actions\" : [\"int373\"],\n \"base_default_next\" : \"node_164\",\n \"next_tables\" : {\n \"int373\" : \"node_164\"\n },\n \"default_entry\" : {\n \"action_id\" : 164,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.report\",\n \"id\" : 100,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 260,\n \"column\" : 10,\n \"source_fragment\" : \"report\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"bmd_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"bmd_type\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"mirror_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"mirror_type\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"int_egress_fabric_md_int_report_md\", \"report_type\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 6,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [131, 132, 133, 134, 109],\n \"actions\" : [\"FabricEgress.int_egress.do_local_report_encap\", \"FabricEgress.int_egress.do_local_report_encap_mpls\", \"FabricEgress.int_egress.do_drop_report_encap\", \"FabricEgress.int_egress.do_drop_report_encap_mpls\", \"nop\"],\n \"base_default_next\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"next_tables\" : {\n \"FabricEgress.int_egress.do_local_report_encap\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_local_report_encap_mpls\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_drop_report_encap\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"FabricEgress.int_egress.do_drop_report_encap_mpls\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"nop\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 109,\n \"action_const\" : false,\n \"action_data\" : [],\n \"action_entry_const\" : false\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.int_metadata\",\n \"id\" : 101,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 315,\n \"column\" : 10,\n \"source_fragment\" : \"int_metadata\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"int_report_type\",\n \"target\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"drop_ctl\",\n \"target\" : [\"scalars\", \"userMetadata._drop_ctl2\"],\n \"mask\" : null\n },\n {\n \"match_type\" : \"exact\",\n \"name\" : \"queue_report\",\n \"target\" : [\"scalars\", \"userMetadata._egress_int_md_queue_report43\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : true,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [135, 110],\n \"actions\" : [\"FabricEgress.int_egress.init_int_metadata\", \"nop\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"__HIT__\" : \"tbl_int383\",\n \"__MISS__\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 110,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 327,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 135,\n \"action_data\" : [\"0x1\"]\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 329,\n \"column\" : 12,\n \"source_fragment\" : \"(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n },\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x00\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 135,\n \"action_data\" : [\"0x4\"]\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"tbl_int383\",\n \"id\" : 102,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 383,\n \"column\" : 16,\n \"source_fragment\" : \"clone_preserving_field_list(CloneType.E2E, ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [163],\n \"actions\" : [\"int383\"],\n \"base_default_next\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"next_tables\" : {\n \"int383\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\"\n },\n \"default_entry\" : {\n \"action_id\" : 163,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.int_egress.adjust_int_report_hdr_length\",\n \"id\" : 103,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 347,\n \"column\" : 10,\n \"source_fragment\" : \"adjust_int_report_hdr_length\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"is_int_wip\",\n \"target\" : [\"int_egress_fabric_md_bridged\", \"_int_bmd_wip_type26\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 2,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [111, 136],\n \"actions\" : [\"nop\", \"FabricEgress.int_egress.adjust_ip_udp_len\"],\n \"base_default_next\" : \"tbl_slicing189\",\n \"next_tables\" : {\n \"nop\" : \"tbl_slicing189\",\n \"FabricEgress.int_egress.adjust_ip_udp_len\" : \"tbl_slicing189\"\n },\n \"default_entry\" : {\n \"action_id\" : 111,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n },\n \"entries\" : [\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 358,\n \"column\" : 12,\n \"source_fragment\" : \"INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x01\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 136,\n \"action_data\" : [\"0xfff2\", \"0xffde\"]\n },\n \"priority\" : 1\n },\n {\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 359,\n \"column\" : 12,\n \"source_fragment\" : \"INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)\"\n },\n \"match_key\" : [\n {\n \"match_type\" : \"exact\",\n \"key\" : \"0x02\"\n }\n ],\n \"action_entry\" : {\n \"action_id\" : 136,\n \"action_data\" : [\"0xffee\", \"0xffda\"]\n },\n \"priority\" : 2\n }\n ]\n },\n {\n \"name\" : \"tbl_slicing189\",\n \"id\" : 104,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 189,\n \"column\" : 4,\n \"source_fragment\" : \"bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ...\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [166],\n \"actions\" : [\"slicing189\"],\n \"base_default_next\" : \"FabricEgress.dscp_rewriter.rewriter\",\n \"next_tables\" : {\n \"slicing189\" : \"FabricEgress.dscp_rewriter.rewriter\"\n },\n \"default_entry\" : {\n \"action_id\" : 166,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"FabricEgress.dscp_rewriter.rewriter\",\n \"id\" : 105,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 201,\n \"column\" : 10,\n \"source_fragment\" : \"rewriter\"\n },\n \"key\" : [\n {\n \"match_type\" : \"exact\",\n \"name\" : \"eg_port\",\n \"target\" : [\"standard_metadata\", \"egress_port\"],\n \"mask\" : null\n }\n ],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 512,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [119, 120, 106],\n \"actions\" : [\"FabricEgress.dscp_rewriter.rewrite\", \"FabricEgress.dscp_rewriter.clear\", \"nop\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"__HIT__\" : \"node_171\",\n \"__MISS__\" : \"node_173\"\n },\n \"default_entry\" : {\n \"action_id\" : 106,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_slicing217\",\n \"id\" : 106,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 217,\n \"column\" : 30,\n \"source_fragment\" : \"=\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [165],\n \"actions\" : [\"slicing217\"],\n \"base_default_next\" : \"node_173\",\n \"next_tables\" : {\n \"slicing217\" : \"node_173\"\n },\n \"default_entry\" : {\n \"action_id\" : 165,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model170\",\n \"id\" : 107,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 170,\n \"column\" : 12,\n \"source_fragment\" : \"recirculate_preserving_field_list(NO_PRESERVATION)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [167],\n \"actions\" : [\"fabric_v1model170\"],\n \"base_default_next\" : \"node_175\",\n \"next_tables\" : {\n \"fabric_v1model170\" : \"node_175\"\n },\n \"default_entry\" : {\n \"action_id\" : 167,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n },\n {\n \"name\" : \"tbl_fabric_v1model174\",\n \"id\" : 108,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 174,\n \"column\" : 12,\n \"source_fragment\" : \"mark_to_drop(standard_md)\"\n },\n \"key\" : [],\n \"match_type\" : \"exact\",\n \"type\" : \"simple\",\n \"max_size\" : 1024,\n \"with_counters\" : false,\n \"support_timeout\" : false,\n \"direct_meters\" : null,\n \"action_ids\" : [168],\n \"actions\" : [\"fabric_v1model174\"],\n \"base_default_next\" : null,\n \"next_tables\" : {\n \"fabric_v1model174\" : null\n },\n \"default_entry\" : {\n \"action_id\" : 168,\n \"action_const\" : true,\n \"action_data\" : [],\n \"action_entry_const\" : true\n }\n }\n ],\n \"action_profiles\" : [],\n \"conditionals\" : [\n {\n \"name\" : \"node_97\",\n \"id\" : 31,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 135,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._skip_egress0\"]\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model136\",\n \"false_next\" : \"node_99\"\n },\n {\n \"name\" : \"node_99\",\n \"id\" : 32,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 140,\n \"column\" : 13,\n \"source_fragment\" : \"standard_md.instance_type == 2\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"instance_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00000002\"\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator14\",\n \"false_next\" : \"node_109\"\n },\n {\n \"name\" : \"node_101\",\n \"id\" : 33,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 145,\n \"column\" : 11,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vxlan15\", \"$valid$\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator148\",\n \"false_next\" : \"node_103\"\n },\n {\n \"name\" : \"node_103\",\n \"id\" : 34,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 164,\n \"column\" : 12,\n \"source_fragment\" : \"(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._recirc_preserved_report_type47\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_parser_emulator_parse_int_ingress_drop\",\n \"false_next\" : \"tbl_parser_emulator_parse_int_report_mirror\"\n },\n {\n \"name\" : \"node_109\",\n \"id\" : 35,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 150,\n \"column\" : 11,\n \"source_fragment\" : \"(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator14_0\",\n \"false_next\" : \"FabricEgress.pkt_io_egress.switch_info\"\n },\n {\n \"name\" : \"node_111\",\n \"id\" : 36,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 145,\n \"column\" : 11,\n \"source_fragment\" : \"hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_gtpu12\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_vxlan15\", \"$valid$\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_int_tna_parser_emulator148_0\",\n \"false_next\" : \"node_113\"\n },\n {\n \"name\" : \"node_113\",\n \"id\" : 37,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4\",\n \"line\" : 164,\n \"column\" : 12,\n \"source_fragment\" : \"(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"&\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_int_bmd_report_type21\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xff\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"true_next\" : \"tbl_parser_emulator_parse_int_ingress_drop_0\",\n \"false_next\" : \"tbl_parser_emulator_parse_int_report_mirror_0\"\n },\n {\n \"name\" : \"node_120\",\n \"id\" : 38,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 50,\n \"column\" : 12,\n \"source_fragment\" : \"standard_md.egress_port == fabric_md.cpu_port\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_cpu_port37\"]\n }\n }\n },\n \"true_next\" : \"tbl_packetio51\",\n \"false_next\" : \"node_122\"\n },\n {\n \"name\" : \"node_122\",\n \"id\" : 39,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4\",\n \"line\" : 58,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.fake_ethernet.isValid() && ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_fake_ethernet2\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_fake_ethernet2\", \"ether_type\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0xbf03\"\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_packetio60\",\n \"false_next\" : \"node_124\"\n },\n {\n \"name\" : \"node_124\",\n \"id\" : 40,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4\",\n \"line\" : 67,\n \"column\" : 12,\n \"source_fragment\" : \"bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"true_next\" : \"FabricEgress.stats.flows\",\n \"false_next\" : \"node_126\"\n },\n {\n \"name\" : \"node_126\",\n \"id\" : 41,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 280,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.is_multicast ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_is_multicast4\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_ig_port3\"]\n },\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"standard_metadata\", \"egress_port\"]\n }\n }\n }\n }\n },\n \"true_next\" : \"tbl_next283\",\n \"false_next\" : \"node_128\"\n },\n {\n \"name\" : \"node_128\",\n \"id\" : 42,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 288,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.bridged.base.mpls_label == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_mpls_label2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x000000\"\n }\n }\n },\n \"true_next\" : \"node_129\",\n \"false_next\" : \"tbl_egress_next_set_mpls\"\n },\n {\n \"name\" : \"node_129\",\n \"id\" : 43,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 289,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.mpls.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_egress_next_pop_mpls_if_present\",\n \"false_next\" : \"node_132\"\n },\n {\n \"name\" : \"node_132\",\n \"id\" : 44,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 159,\n \"column\" : 39,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._egress_is_int_recirc45\"]\n }\n }\n },\n \"false_next\" : \"FabricEgress.egress_next.egress_vlan\",\n \"true_next\" : \"node_134\"\n },\n {\n \"name\" : \"node_134\",\n \"id\" : 45,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 322,\n \"column\" : 12,\n \"source_fragment\" : \"hdr.mpls.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_next323\",\n \"false_next\" : \"node_138\"\n },\n {\n \"name\" : \"node_136\",\n \"id\" : 46,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 324,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.mpls.ttl == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_mpls6\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next325\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_138\",\n \"id\" : 47,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 331,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"node_139\",\n \"false_next\" : \"node_143\"\n },\n {\n \"name\" : \"node_139\",\n \"id\" : 48,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 319,\n \"column\" : 28,\n \"source_fragment\" : \"(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n }\n }\n },\n \"false_next\" : \"tbl_next333\",\n \"true_next\" : \"node_141\"\n },\n {\n \"name\" : \"node_141\",\n \"id\" : 49,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 335,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv4.ttl == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"ttl\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next336\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_143\",\n \"id\" : 50,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 341,\n \"column\" : 23,\n \"source_fragment\" : \"hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"and\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"$valid$\"]\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"!=\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_base_fwd_type5\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n }\n }\n },\n \"true_next\" : \"node_144\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_144\",\n \"id\" : 51,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 319,\n \"column\" : 28,\n \"source_fragment\" : \"(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ...\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"or\",\n \"left\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x04\"\n }\n }\n },\n \"right\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_bmd_type0\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x02\"\n }\n }\n }\n }\n },\n \"false_next\" : \"tbl_next343\",\n \"true_next\" : \"node_146\"\n },\n {\n \"name\" : \"node_146\",\n \"id\" : 52,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/next.p4\",\n \"line\" : 345,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.ipv6.hop_limit == 0\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv68\", \"hop_limit\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x00\"\n }\n }\n },\n \"true_next\" : \"tbl_next346\",\n \"false_next\" : \"node_148\"\n },\n {\n \"name\" : \"node_148\",\n \"id\" : 53,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 607,\n \"column\" : 13,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_upf17\"]\n }\n }\n },\n \"false_next\" : \"node_149\",\n \"true_next\" : \"tbl_int128\"\n },\n {\n \"name\" : \"node_149\",\n \"id\" : 54,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 608,\n \"column\" : 16,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_needs_gtpu_encap16\"]\n }\n }\n },\n \"true_next\" : \"node_150\",\n \"false_next\" : \"node_158\"\n },\n {\n \"name\" : \"node_150\",\n \"id\" : 55,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 609,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.udp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_udp10\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf610\",\n \"false_next\" : \"node_152\"\n },\n {\n \"name\" : \"node_152\",\n \"id\" : 56,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 614,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.tcp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_tcp9\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf615\",\n \"false_next\" : \"node_154\"\n },\n {\n \"name\" : \"node_154\",\n \"id\" : 57,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 619,\n \"column\" : 20,\n \"source_fragment\" : \"hdr.icmp.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_icmp11\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_upf620\",\n \"false_next\" : \"FabricEgress.upf.gtpu_encap\"\n },\n {\n \"name\" : \"node_158\",\n \"id\" : 58,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/upf.p4\",\n \"line\" : 627,\n \"column\" : 17,\n \"source_fragment\" : \"fabric_md.bridged\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_bridged36\", \"_upf_skip_egress_upf_ctr18\"]\n }\n }\n },\n \"false_next\" : \"tbl_upf628\",\n \"true_next\" : \"tbl_int128\"\n },\n {\n \"name\" : \"node_164\",\n \"id\" : 59,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/int.p4\",\n \"line\" : 375,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.int_report_md.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"int_egress_fabric_md_int_report_md\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"FabricEgress.int_egress.report\",\n \"false_next\" : \"FabricEgress.int_egress.int_metadata\"\n },\n {\n \"name\" : \"node_171\",\n \"id\" : 60,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4\",\n \"line\" : 216,\n \"column\" : 16,\n \"source_fragment\" : \"hdr.ipv4.isValid()\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n },\n \"true_next\" : \"tbl_slicing217\",\n \"false_next\" : \"node_173\"\n },\n {\n \"name\" : \"node_173\",\n \"id\" : 61,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 168,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._do_upf_uplink_recirc1\"]\n }\n }\n },\n \"true_next\" : \"tbl_fabric_v1model170\",\n \"false_next\" : \"node_175\"\n },\n {\n \"name\" : \"node_175\",\n \"id\" : 62,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"line\" : 173,\n \"column\" : 12,\n \"source_fragment\" : \"fabric_md.drop_ctl == 1\"\n },\n \"expression\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"==\",\n \"left\" : {\n \"type\" : \"field\",\n \"value\" : [\"scalars\", \"userMetadata._drop_ctl2\"]\n },\n \"right\" : {\n \"type\" : \"hexstr\",\n \"value\" : \"0x01\"\n }\n }\n },\n \"false_next\" : null,\n \"true_next\" : \"tbl_fabric_v1model174\"\n }\n ]\n }\n ],\n \"checksums\" : [\n {\n \"name\" : \"cksum\",\n \"id\" : 0,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 55,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_ipv47\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_3\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_0\",\n \"id\" : 1,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 73,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_inner_ipv418\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_4\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_1\",\n \"id\" : 2,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 92,\n \"column\" : 8,\n \"source_fragment\" : \"update_checksum(hdr.egress.report_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_egress_report_ipv427\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_5\",\n \"verify\" : false,\n \"update\" : true,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_egress_report_ipv427\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_2\",\n \"id\" : 3,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 13,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_ipv47\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_6\",\n \"verify\" : true,\n \"update\" : false,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_ipv47\", \"$valid$\"]\n }\n }\n }\n },\n {\n \"name\" : \"cksum_3\",\n \"id\" : 4,\n \"source_info\" : {\n \"filename\" : \"/home/ubuntu/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4\",\n \"line\" : 31,\n \"column\" : 8,\n \"source_fragment\" : \"verify_checksum(hdr.ingress.inner_ipv4.isValid(), ...\"\n },\n \"target\" : [\"_ingress_inner_ipv418\", \"hdr_checksum\"],\n \"type\" : \"generic\",\n \"calculation\" : \"calc_7\",\n \"verify\" : true,\n \"update\" : false,\n \"if_cond\" : {\n \"type\" : \"expression\",\n \"value\" : {\n \"op\" : \"d2b\",\n \"left\" : null,\n \"right\" : {\n \"type\" : \"field\",\n \"value\" : [\"_ingress_inner_ipv418\", \"$valid$\"]\n }\n }\n }\n }\n ],\n \"force_arith\" : [],\n \"extern_instances\" : [],\n \"field_aliases\" : [\n [\n \"queueing_metadata.enq_timestamp\",\n [\"standard_metadata\", \"enq_timestamp\"]\n ],\n [\n \"queueing_metadata.enq_qdepth\",\n [\"standard_metadata\", \"enq_qdepth\"]\n ],\n [\n \"queueing_metadata.deq_timedelta\",\n [\"standard_metadata\", \"deq_timedelta\"]\n ],\n [\n \"queueing_metadata.deq_qdepth\",\n [\"standard_metadata\", \"deq_qdepth\"]\n ],\n [\n \"intrinsic_metadata.ingress_global_timestamp\",\n [\"standard_metadata\", \"ingress_global_timestamp\"]\n ],\n [\n \"intrinsic_metadata.egress_global_timestamp\",\n [\"standard_metadata\", \"egress_global_timestamp\"]\n ],\n [\n \"intrinsic_metadata.mcast_grp\",\n [\"standard_metadata\", \"mcast_grp\"]\n ],\n [\n \"intrinsic_metadata.egress_rid\",\n [\"standard_metadata\", \"egress_rid\"]\n ],\n [\n \"intrinsic_metadata.priority\",\n [\"standard_metadata\", \"priority\"]\n ]\n ],\n \"program\" : \"/home/ubuntu/fabric-tna/p4src/v1model/fabric_v1model.p4\",\n \"__meta__\" : {\n \"version\" : [2, 23],\n \"compiler\" : \"https://github.com/p4lang/p4c\"\n }\n}" + } +} diff --git a/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh b/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh new file mode 100644 index 000000000..a537b6e46 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/topology/run-stratum.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# You must run this script as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root" + exit 1 +fi + +source "p4-switch-conf-common.sh" + +LOG_FILE_DIR="/var/log/stratum/" + +sudo mkdir -p "${LOG_FILE_DIR}" + +LOG_LEVEL="info" +READ_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_reads.pb.txt" +WRITE_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_writes.pb.txt" +CHASSIS_CONFIG="p4-switch-three-port-chassis-config-phy.pb.txt" + +[ -f ${CHASSIS_CONFIG} ] || { echo "$CHASSIS_CONFIG not found!" ; exit 1 ;} + +rm "${READ_LOGS_FILE_PATH}" +rm "${WRITE_LOGS_FILE_PATH}" + +touch "${READ_LOGS_FILE_PATH}" +touch "${WRITE_LOGS_FILE_PATH}" + +stratum_bmv2 \ + -chassis_config_file=${CHASSIS_CONFIG} \ + -read_req_log_file=${READ_LOGS_FILE_PATH} \ + -write_req_log_file=${WRITE_LOGS_FILE_PATH} \ + -external_stratum_urls="0.0.0.0:"${SW_P4RT_GNMI_PORT}",0.0.0.0:"${SW_P4RT_GRPC_PORT} \ + -local_stratum_url="0.0.0.0:"${SW_P4RT_LOCAL_PORT} \ + -bmv2_log_level=${LOG_LEVEL} +# -forwarding_pipeline_configs_file="pipeline_config.pb.txt" # -forwarding_pipeline_configs_file="/etc/stratum/pipeline_cfg.pb.txt" + +exit 0 diff --git a/src/tests/p4-topologies/README.md b/src/tests/p4-topologies/README.md new file mode 100644 index 000000000..22060db4e --- /dev/null +++ b/src/tests/p4-topologies/README.md @@ -0,0 +1,45 @@ +# Emulated Network Topologies for Easy Experimentation + +This repository contains emulated network topology implementations either based on Mininet or native switches that reside in Linux namespaces. + +## Switches in Mininet + +To deploy a Mininet-based network topology, first checkout Mininet: + +```bash +git clone ssh://git@gitlab.ubitech.eu:41621/nsit/etsi-tfs/mininet.git +``` + +This is an extended version of upstream Mininet that also supports: +- Stratum-based P4 switches +- Stratum-based P4 switches with dedicated Inband Network Telemetry (INT) interface. + +Install Mininet as follows: + +```bash +cd mininet/ +PYTHON=python3 util/install.sh -fnv +``` + +**Disclaimer:** When this Mininet branch becomes part of TFS, a new URL will be shared in this file so as everone can checkout this Mininet version. +For now, this remains a closed-source repo in UBITECH's GitLab. + +### Deploy example Mininet topologies + +All of the topologies in the following table employ Stratum-based bmv2 P4 switches within Mininet. +In the topologies that support INT, Stratum bmv2 switch is extended with an additional network interface that dispatches in-band network telemetry packets towards an external collector (e.g., TFS). + +| Topology | File | Command to Deploy | +| -----------------------: | :------------------------------- | :------------------------------------------------------------------ | +| Single switch | topo-mininet/1switch1path.py | sudo python3 topo-mininet/1switch1path.py | +| Single switch with INT | topo-mininet/1switch1path-int.py | sudo python3 topo-mininet/1switch1path-int.py --host-int-iface=eth0 | +| Three switches with INT | topo-mininet/3switch1path-int.py | sudo python3 topo-mininet/3switch1path-int.py --host-int-iface=eth0 | +| Five switches with INT | topo-mininet/5switch3path-int.py | sudo python3 topo-mininet/5switch3path-int.py --host-int-iface=eth0 | + +### Undeploy example Mininet topologies + +Just press Ctrl-D and Mininet stops. + +## Switches in Linux namespaces + +Follow the instruction in `topo-linux-ns/README.md`. diff --git a/src/tests/p4-fabric-tna/topology/README.md b/src/tests/p4-topologies/topo-linux-ns/README.md similarity index 86% rename from src/tests/p4-fabric-tna/topology/README.md rename to src/tests/p4-topologies/topo-linux-ns/README.md index 30d4d84bc..59c1eafef 100644 --- a/src/tests/p4-fabric-tna/topology/README.md +++ b/src/tests/p4-topologies/topo-linux-ns/README.md @@ -1,14 +1,14 @@ # P4 Topology -This directory contains scripts for deploying a single software-based Stratum switch on a VM or bare metal machine. +This directory contains scripts for deploying a single software-based Stratum switch on a Linux namespace. ## Prerequisites The machine on which Stratum will be deployed must have at least 3 network interfaces as follows: - a management interface for the switch to communicate with the control plane (i.e., TFS controller and INT collector) -- a west data plane interface towards a certain subnet (we call it edge subnet in this example) -- an est data plane interface towards another subnet (we call it corporate subnet in this example) +- a west data plane interface towards a certain subnet (we call it left subnet in this example) +- an east data plane interface towards another subnet (we call it right subnet in this example) Also, due to Stratum's restrictions, the desired OS of the machine shall be `Ubuntu server 20.04 LTS`. @@ -23,44 +23,42 @@ The two data plane interfaces of the VM need to be enclosed into this namespace, Follow the steps below to create the environment, deploy Stratum, and restore the VM to its previous state (cleanup). Prior to this take a look at the environment configuration file, where one can change the names of the interfaces, according to your network setup. -```shell +```bash nano p4-switch-conf-common.sh -HOST_IFACE_EXT="ens3" # Interface towards TFS (management) -SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane) -SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane) - -... +HOST_IFACE_EXT="ens3" # Interface towards the TFS controller (management) +SW_IFACE_DATA_LEFT="ens4" # Interface towards the left subnet (data plane) +SW_IFACE_DATA_RIGHT="ens5" # Interface towards the right subnet (data plane) ``` ### Step 1: Setup environment -Edit the `setup` script to modify the subnets' information according to your network setup: +Edit the `setup` script to modify the subnets information according to your network setup: -```shell +```bash nano p4-switch-setup.sh # Subnets managed by the switch -DOMAIN_EDGE_IP="10.158.72.0/24" # Left-hand side subnet -DOMAIN_CORP_IP="172.16.10.0/24" # Right-hand side subnet +DOMAIN_LEFT_IP="10.158.72.0/24" # Left-hand side subnet +DOMAIN_RIGHT_IP="172.16.10.0/24" # Right-hand side subnet ``` Once your network setup is applied, run the `setup` script as follows: -```shell +```bash sudo bash p4-switch-setup.sh ``` To verify that the switch namespace is in place, issue the following command: -```shell +```bash sudo ip netns exec ns-switch ip a ``` The output should show 4 network interfaces, i.e., a `loopback` interface, 2 data planes interfaces (e.g., `ens4`, `ens5` in this example), and a virtual interface for sending telemetry data out of the switch (i.e., `veth-int-sw` in this example). From this latter interface you can ping towards the other end of the virtual interface pair (i.e., `veth-int-host`): -```shell +```bash sudo ip netns exec ns-switch ping 10.0.0.254 ``` @@ -76,7 +74,7 @@ First you need to configure the chassis configuration file with the correct netw To do so, modify the `name` field changing `ens4`, `ens5`, and `ens3` to your desired interfaces. These interface names must agree with the ones you added in `p4-switch-conf-common.sh`. -```shell +```bash cat p4-switch-three-port-chassis-config-phy.pb.txt # Copyright 2018-present Open Networking Foundation @@ -132,13 +130,13 @@ singleton_ports { To deploy Stratum, do: -```shell +```bash sudo bash run-stratum.sh ``` To run Stratum will verbose logging, open the `run-stratum.sh` and change: -```shell +```bash LOG_LEVEL="debug" ``` @@ -161,6 +159,6 @@ To verify that Stratum has been correctly deployed, you should see the following When your tests with Stratum and TFS are over, you may want to restore your setup. To do so, execute the following script: -```shell +```bash sudo bash p4-switch-tear-down.sh ``` diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh similarity index 84% rename from src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh index 25da8c454..047fa1403 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-conf-common.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-conf-common.sh @@ -17,9 +17,9 @@ SWITCH_NS="ns-switch" # Physical interfaces -HOST_IFACE_EXT="ens3" # Interface towards TFS (management) -SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane) -SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane) +HOST_IFACE_EXT="ens3" # Interface towards TFS (management) +SW_IFACE_DATA_LEFT="ens4" # Interface towards the edge subnet (data plane) +SW_IFACE_DATA_RIGHT="ens5" # Interface towards the corporate subnet (data plane) # Virtual interfaces for INT SW_IFACE_INT="veth-int-sw" diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-setup.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh similarity index 83% rename from src/tests/p4-fabric-tna/topology/p4-switch-setup.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh index 402e54aeb..c0f31c9fc 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-setup.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-setup.sh @@ -33,8 +33,8 @@ SWITCH_INT_IP_NET=${SWITCH_INT_IP}"/24" HOST_INT_IP_NET=${HOST_INT_IP}"/24" # Subnets managed by the switch -DOMAIN_EDGE_IP="10.158.72.22/24" # Edge domain side IP address -DOMAIN_CORP_IP="172.16.10.4/24" # Corporate domain side IP address +DOMAIN_LEFT_IP="10.158.72.22/24" # Left domain's IP address range +DOMAIN_RIGHT_IP="172.16.10.4/24" # Rigth domain's IP address range # INT subnet MTU MTU_LEN=9000 @@ -52,8 +52,8 @@ create_virtual_interfaces() { } assign_virtual_interfaces() { - ip link set ${SW_IFACE_DATA_EDGE} netns ${SWITCH_NS} - ip link set ${SW_IFACE_DATA_CORP} netns ${SWITCH_NS} + ip link set ${SW_IFACE_DATA_LEFT} netns ${SWITCH_NS} + ip link set ${SW_IFACE_DATA_RIGHT} netns ${SWITCH_NS} ip link set ${SW_IFACE_INT} netns ${SWITCH_NS} } @@ -68,22 +68,22 @@ set_mtu() { } set_ip_addresses() { - ip -n ${SWITCH_NS} addr add ${DOMAIN_EDGE_IP} dev ${SW_IFACE_DATA_EDGE} - ip -n ${SWITCH_NS} addr add ${DOMAIN_CORP_IP} dev ${SW_IFACE_DATA_CORP} + ip -n ${SWITCH_NS} addr add ${DOMAIN_LEFT_IP} dev ${SW_IFACE_DATA_LEFT} + ip -n ${SWITCH_NS} addr add ${DOMAIN_RIGHT_IP} dev ${SW_IFACE_DATA_RIGHT} ip -n ${SWITCH_NS} addr add ${SWITCH_INT_IP_NET} dev ${SW_IFACE_INT} ifconfig ${HOST_IFACE_INT} ${HOST_INT_IP_NET} } bring_interfaces_up() { - ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_EDGE} up - ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_CORP} up + ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_LEFT} up + ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_RIGHT} up ip -n ${SWITCH_NS} link set ${SW_IFACE_INT} up ifconfig ${HOST_IFACE_INT} up } disable_csum_offloading() { - ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_EDGE} rx off tx off - ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_CORP} rx off tx off + ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_LEFT} rx off tx off + ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_RIGHT} rx off tx off } switch_default_gw() { diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh b/src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh similarity index 96% rename from src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh index 1d902319b..e1714f614 100644 --- a/src/tests/p4-fabric-tna/topology/p4-switch-tear-down.sh +++ b/src/tests/p4-topologies/topo-linux-ns/p4-switch-tear-down.sh @@ -34,8 +34,8 @@ delete_namespaces() { } bring_interfaces_up() { - ifconfig ${SW_IFACE_DATA_EDGE} up - ifconfig ${SW_IFACE_DATA_CORP} up + ifconfig ${SW_IFACE_DATA_LEFT} up + ifconfig ${SW_IFACE_DATA_RIGHT} up } cleanup_iptables() { diff --git a/src/tests/p4-fabric-tna/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-topologies/topo-linux-ns/p4-switch-three-port-chassis-config-phy.pb.txt similarity index 100% rename from src/tests/p4-fabric-tna/topology/p4-switch-three-port-chassis-config-phy.pb.txt rename to src/tests/p4-topologies/topo-linux-ns/p4-switch-three-port-chassis-config-phy.pb.txt diff --git a/src/tests/p4-fabric-tna/topology/run-stratum.sh b/src/tests/p4-topologies/topo-linux-ns/run-stratum.sh similarity index 100% rename from src/tests/p4-fabric-tna/topology/run-stratum.sh rename to src/tests/p4-topologies/topo-linux-ns/run-stratum.sh diff --git a/src/tests/p4-topologies/topo-mininet/1switch1path-int.py b/src/tests/p4-topologies/topo-mininet/1switch1path-int.py new file mode 100755 index 000000000..833d82840 --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/1switch1path-int.py @@ -0,0 +1,78 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 1switch1path-int.py --switch stratum-bmv2-int --topo oneswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 1switch1path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW_NAME = "sw1" +SW_PORT = 50001 + +CPU_PORT = 255 + +HOST_INT_IFACE = "" +DEF_HOST_INT_IFACE = "eth0" + +class OneSwitchTopoINT(Topo): + """1-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Host links + info("*** Creating links\n") + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 1 + self.addLink(server, sw1, cls=TCLink) # Switch 1: port 2 + +def setup_topology(host_int_iface): + net = Mininet(topo=OneSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'oneswitchtopoint': ( lambda: OneSwitchTopoINT(DEF_HOST_INT_IFACE) ) } diff --git a/src/tests/p4-topologies/topo-mininet/1switch1path.py b/src/tests/p4-topologies/topo-mininet/1switch1path.py new file mode 100755 index 000000000..24a2704cb --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/1switch1path.py @@ -0,0 +1,65 @@ +### +# Execute: sudo mn --custom 1switch1path.py --switch stratum-bmv2 --topo oneswitchtopo --link tc --controller none +# Execute: sudo python3 1switch1path.py +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.stratum import StratumBmv2Switch + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW_NAME = "sw1" +SW_PORT = 50001 + +CPU_PORT = 255 + +HOST_INT_IFACE = "" + +class OneSwitchTopo(Topo): + """1-switch topology with 2x IPv4 hosts""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW_NAME, cls=StratumBmv2Switch, grpcPort=SW_PORT, cpuport=CPU_PORT) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Host links + info("*** Creating links\n") + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 1 + self.addLink(server, sw1, cls=TCLink) # Switch 1: port 2 + +def setup_topology(): + net = Mininet(topo=OneSwitchTopo(), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch Stratum BMv2 fabric and 2x IPv4 hosts') + args = parser.parse_args() + + setup_topology() + +# Required by mn to call this custom topology +topos = { 'oneswitchtopo': ( lambda: OneSwitchTopo() ) } diff --git a/src/tests/p4-topologies/topo-mininet/3switch1path-int.py b/src/tests/p4-topologies/topo-mininet/3switch1path-int.py new file mode 100755 index 000000000..cc3f55fbe --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/3switch1path-int.py @@ -0,0 +1,89 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 3switch1path-int.py --switch stratum-bmv2-int --topo threeswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 3switch1path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW1_NAME = "sw1" +SW1_PORT = 50001 + +SW2_NAME = "sw2" +SW2_PORT = 50002 + +SW3_NAME = "sw3" +SW3_PORT = 50003 + +CPU_PORT = 255 + +DEF_HOST_INT_IFACE = "eth0" + +class ThreeSwitchTopoINT(Topo): + """3-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW1_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW1_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw2 = self.addSwitch(SW2_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW2_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw3 = self.addSwitch(SW3_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW3_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Switch links + info("*** Creating links\n") + self.addLink(sw1, sw2, cls=TCLink) # Switch1:port 1, Switch2:port 1 + self.addLink(sw2, sw3, cls=TCLink) # Switch2:port 2, Switch3:port 1 + + # Host links + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 2 + self.addLink(server, sw3, cls=TCLink) # Switch 3: port 2 + +def setup_topology(host_int_iface): + net = Mininet(topo=ThreeSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'threeswitchtopoint': ( lambda: ThreeSwitchTopoINT(DEF_HOST_INT_IFACE) ) } diff --git a/src/tests/p4-topologies/topo-mininet/5switch3path-int.py b/src/tests/p4-topologies/topo-mininet/5switch3path-int.py new file mode 100755 index 000000000..862bc5223 --- /dev/null +++ b/src/tests/p4-topologies/topo-mininet/5switch3path-int.py @@ -0,0 +1,102 @@ +### +# Option 1: Execute via mininet's binary +# > sudo mn --custom 5switch3path-int.py --switch stratum-bmv2-int --topo fiveswitchtopoint --link tc --controller none +# In this case, set the correct value to the DEF_HOST_INT_IFACE variable, as this is passed to the Mininet topology as an input argument. + +# Option 2: Execute natively +# > sudo python3 5switch3path-int.py --host-int-iface=eth0 +# In this case, you may pass the variable as an argument +### + +import argparse + +from mininet.cli import CLI +from mininet.link import TCLink +from mininet.log import setLogLevel, info +from mininet.net import Mininet +from mininet.node import IPv4Host +from mininet.topo import Topo +from mininet.util import interfaceExists +from mininet.stratum import StratumBmv2SwitchINT + +CLIENT_NAME = "client" +SERVER_NAME = "server" + +SW1_NAME = "sw1" +SW1_PORT = 50001 + +SW2_NAME = "sw2" +SW2_PORT = 50002 + +SW3_NAME = "sw3" +SW3_PORT = 50003 + +SW4_NAME = "sw4" +SW4_PORT = 50004 + +SW5_NAME = "sw5" +SW5_PORT = 50005 + +CPU_PORT = 255 + +DEF_HOST_INT_IFACE = "eth0" + +class FiveSwitchTopoINT(Topo): + """5-switch topology with 2x IPv4 hosts and switch NB interface for INT""" + + def __init__(self, *args, **kwargs): + Topo.__init__(self, *args, **kwargs) + + iface = args[0] + assert iface, "INT-based Stratum topology requires a network interface name towards the collector" + assert interfaceExists(iface), "External host interface (towards collector) for INT does not exist" + + # Switches + info("*** Adding Stratum-based BMv2 switches\n") + sw1 = self.addSwitch(SW1_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW1_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw2 = self.addSwitch(SW2_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW2_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw3 = self.addSwitch(SW3_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW3_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw4 = self.addSwitch(SW4_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW4_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + sw5 = self.addSwitch(SW5_NAME, cls=StratumBmv2SwitchINT, grpcPort=SW5_PORT, cpuport=CPU_PORT, hostINTIfaceName=iface) + + # Hosts + info("*** Adding hosts\n") + client = self.addHost(CLIENT_NAME, cls=IPv4Host) + server = self.addHost(SERVER_NAME, cls=IPv4Host) + + # Switch links + info("*** Creating links\n") + self.addLink(sw1, sw2, cls=TCLink) # Switch1:port 1, Switch2:port 1 + self.addLink(sw1, sw3, cls=TCLink) # Switch1:port 2, Switch3:port 1 + self.addLink(sw1, sw4, cls=TCLink) # Switch1:port 3, Switch4:port 1 + + self.addLink(sw2, sw5, cls=TCLink) # Switch2:port 2, Switch5:port 1 + self.addLink(sw3, sw5, cls=TCLink) # Switch3:port 2, Switch5:port 2 + self.addLink(sw4, sw5, cls=TCLink) # Switch4:port 2, Switch5:port 3 + + # Host links + self.addLink(client, sw1, cls=TCLink) # Switch 1: port 4 + self.addLink(server, sw5, cls=TCLink) # Switch 5: port 4 + +def setup_topology(host_int_iface): + net = Mininet(topo=FiveSwitchTopoINT(host_int_iface), link=TCLink, controller=None, autoSetMacs=True, autoStaticArp=True) + + info("*** Starting network\n") + net.start() + + CLI(net) + net.stop() + +if __name__ == "__main__": + setLogLevel('info') + + parser = argparse.ArgumentParser( + description='Mininet topology script for a 1-switch fabric with INT-enabled stratum_bmv2 and 2x IPv4 hosts') + parser.add_argument("--host-int-iface", type=str, default=DEF_HOST_INT_IFACE, help="Host network interface towards INT collector") + args = parser.parse_args() + + host_int_iface = args.host_int_iface + setup_topology(host_int_iface) + +# Required by mn to call this custom topology +topos = { 'fiveswitchtopoint': ( lambda: FiveSwitchTopoINT(DEF_HOST_INT_IFACE) ) } -- GitLab From 43a85ab7c775d0fd5151856f10a8cc66ba1f4dd2 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Thu, 26 Feb 2026 23:39:12 +0200 Subject: [PATCH 339/371] fix: forgotten P4 config file and misc style fixes --- src/common/tools/context_queries/Slice.py | 2 +- .../ietf_network_slice/ietf_slice_handler.py | 18 ++--- src/tests/tools/test_tools_p4.py | 78 ------------------- 3 files changed, 10 insertions(+), 88 deletions(-) diff --git a/src/common/tools/context_queries/Slice.py b/src/common/tools/context_queries/Slice.py index 4635bfa2c..ee5a0ac94 100644 --- a/src/common/tools/context_queries/Slice.py +++ b/src/common/tools/context_queries/Slice.py @@ -144,7 +144,7 @@ def get_slice_by_defualt_id( include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules) -def get_slice_by_defualt_name( +def get_slice_by_default_name( context_client : ContextClient, slice_name : str, context_uuid : str = DEFAULT_CONTEXT_NAME, rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True, include_service_ids : bool = True, include_subslice_ids : bool = True, include_config_rules : bool = True diff --git a/src/nbi/service/ietf_network_slice/ietf_slice_handler.py b/src/nbi/service/ietf_network_slice/ietf_slice_handler.py index e3e8ea6f8..d18729d87 100644 --- a/src/nbi/service/ietf_network_slice/ietf_slice_handler.py +++ b/src/nbi/service/ietf_network_slice/ietf_slice_handler.py @@ -29,7 +29,7 @@ from common.proto.context_pb2 import ( Slice, SliceStatusEnum, ) -from common.tools.context_queries.Slice import get_slice_by_defualt_name +from common.tools.context_queries.Slice import get_slice_by_default_name from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.object_factory.Device import json_device_id from common.DeviceTypes import DeviceTypeEnum @@ -474,7 +474,7 @@ class IETFSliceHandler: raise Exception("Number of SDPs to create must be exactly 1") new_sdp = sdps[0] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -494,7 +494,7 @@ class IETFSliceHandler: """ Delete the specified SDP from an existing slice's candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -525,7 +525,7 @@ class IETFSliceHandler: raise Exception("Number of connection groups to create must be exactly 1") new_connection_group = connection_groups[0] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_id, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -548,7 +548,7 @@ class IETFSliceHandler: """ Update an existing connection group in the candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_name, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( @@ -583,7 +583,7 @@ class IETFSliceHandler: """ Remove an existing connection group from the candidate IETF data of a slice. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( @@ -632,7 +632,7 @@ class IETFSliceHandler: new_match_criterion = match_criteria[0] target_connection_group_id = new_match_criterion["target-connection-group-id"] - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_name, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -681,7 +681,7 @@ class IETFSliceHandler: """ Delete the specified match-criterion from an SDP in the slice's candidate IETF data. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY) @@ -719,7 +719,7 @@ class IETFSliceHandler: """ Copy candidate IETF slice data to the running IETF slice data for a given slice. """ - slice_request = get_slice_by_defualt_name( + slice_request = get_slice_by_default_name( context_client, slice_uuid, rw_copy=False ) candidate_ietf_data = get_ietf_data_from_config( diff --git a/src/tests/tools/test_tools_p4.py b/src/tests/tools/test_tools_p4.py index e770037ca..276cc57a3 100644 --- a/src/tests/tools/test_tools_p4.py +++ b/src/tests/tools/test_tools_p4.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum,\ DeviceDriverEnum, ServiceTypeEnum, ServiceStatusEnum @@ -25,89 +24,12 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(CONTEXT_NAME_P4)) # Device and rule cardinality variables DEV_NB = 4 P4_DEV_NB = 1 -CONNECTION_RULES = 3 -ENDPOINT_RULES = 3 -INT_RULES = 19 -L2_RULES = 10 -L3_RULES = 4 -ACL_RULES = 1 - -DATAPLANE_RULES_NB_INT_B1 = 5 -DATAPLANE_RULES_NB_INT_B2 = 6 -DATAPLANE_RULES_NB_INT_B3 = 8 -DATAPLANE_RULES_NB_RT_WEST = 7 -DATAPLANE_RULES_NB_RT_EAST = 7 -DATAPLANE_RULES_NB_ACL = 1 -DATAPLANE_RULES_NB_TOT = \ - DATAPLANE_RULES_NB_INT_B1 +\ - DATAPLANE_RULES_NB_INT_B2 +\ - DATAPLANE_RULES_NB_INT_B3 +\ - DATAPLANE_RULES_NB_RT_WEST +\ - DATAPLANE_RULES_NB_RT_EAST +\ - DATAPLANE_RULES_NB_ACL # Service-related variables SVC_NB = 1 NO_SERVICES = 0 NO_SLICES = 0 -TEST_PATH = os.path.join( - os.path.dirname(os.path.dirname( - os.path.abspath(__file__) - )) + '/p4-fabric-tna/descriptors') -assert os.path.exists(TEST_PATH), "Invalid path to P4 SD-Fabric tests" - -# Topology descriptor -DESC_TOPO = os.path.join(TEST_PATH, 'topology.json') -assert os.path.exists(DESC_TOPO), "Invalid path to the SD-Fabric topology descriptor" - -# SBI descriptors -# The switch cannot digest all rules at once, hence we insert in batches -DESC_FILE_RULES_INSERT_INT_B1 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b1.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B1),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #1)" - -DESC_FILE_RULES_INSERT_INT_B2 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b2.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B2),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #2)" - -DESC_FILE_RULES_INSERT_INT_B3 = os.path.join(TEST_PATH, 'sbi-rules-insert-int-b3.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_INT_B3),\ - "Invalid path to the SD-Fabric INT SBI descriptor (batch #3)" - -DESC_FILE_RULES_INSERT_ROUTING_WEST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-west.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_WEST),\ - "Invalid path to the SD-Fabric routing SBI descriptor (domain1-side)" - -DESC_FILE_RULES_INSERT_ROUTING_EAST = os.path.join(TEST_PATH, 'sbi-rules-insert-routing-east.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ROUTING_EAST),\ - "Invalid path to the SD-Fabric routing SBI descriptor (domain2-side)" - -DESC_FILE_RULES_INSERT_ACL = os.path.join(TEST_PATH, 'sbi-rules-insert-acl.json') -assert os.path.exists(DESC_FILE_RULES_INSERT_ACL),\ - "Invalid path to the SD-Fabric ACL SBI descriptor" - -DESC_FILE_RULES_DELETE_ALL = os.path.join(TEST_PATH, 'sbi-rules-remove.json') -assert os.path.exists(DESC_FILE_RULES_DELETE_ALL),\ - "Invalid path to the SD-Fabric rule removal SBI descriptor" - -# Service descriptors -DESC_FILE_SERVICE_P4_INT = os.path.join(TEST_PATH, 'service-p4-int.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_INT),\ - "Invalid path to the SD-Fabric INT service descriptor" - -DESC_FILE_SERVICE_P4_L2_SIMPLE = os.path.join(TEST_PATH, 'service-p4-l2-simple.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_L2_SIMPLE),\ - "Invalid path to the SD-Fabric L2 simple service descriptor" - -DESC_FILE_SERVICE_P4_L3 = os.path.join(TEST_PATH, 'service-p4-l3.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_L3),\ - "Invalid path to the SD-Fabric L3 service descriptor" - -DESC_FILE_SERVICE_P4_ACL = os.path.join(TEST_PATH, 'service-p4-acl.json') -assert os.path.exists(DESC_FILE_SERVICE_P4_ACL),\ - "Invalid path to the SD-Fabric ACL service descriptor" - def identify_number_of_p4_devices(devices) -> int: p4_dev_no = 0 -- GitLab From b89f122cdbe24fed8328da34b0aa0cb02b83bb58 Mon Sep 17 00:00:00 2001 From: "Georgios P. Katsikas" Date: Fri, 27 Feb 2026 16:04:24 +0200 Subject: [PATCH 340/371] feat: UPF test script and minor fixes --- .../automation/test_functional_automation.py | 2 +- .../descriptors/sbi-rules-insert-int-b1.json | 2 +- .../descriptors/sbi-rules-insert-int-b2.json | 36 ++--- .../descriptors/sbi-rules-insert-int-b3.json | 8 +- .../sbi-rules-insert-routing-east.json | 8 +- .../sbi-rules-insert-routing-west.json | 8 +- .../descriptors/sbi-rules-remove.json | 62 ++++---- .../test-scripts/p4-upf/README.md | 25 +++ .../test-scripts/p4-upf/packet-gen-5g-ue.py | 149 ++++++++++++++++++ 9 files changed, 237 insertions(+), 63 deletions(-) create mode 100644 src/tests/p4-topologies/test-scripts/p4-upf/README.md create mode 100644 src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py diff --git a/src/tests/automation/test_functional_automation.py b/src/tests/automation/test_functional_automation.py index a29307765..b4505931c 100644 --- a/src/tests/automation/test_functional_automation.py +++ b/src/tests/automation/test_functional_automation.py @@ -14,6 +14,7 @@ import json import logging +import os import uuid from common.proto.analytics_frontend_pb2 import AnalyzerId, AnalyzerOperationMode from common.proto.automation_pb2 import ZSMCreateRequest @@ -81,7 +82,6 @@ def test_service_zsm_create( # Add important information in the request loaded_request = _zsm_create_request(loaded_request, kpi_manager_client) - # loaded_request = _static_zsm_create_request() # Invoke Automation automation_client.ZSMCreate(loaded_request) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json index b260c5a4c..22aa84205 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b1.json @@ -120,7 +120,7 @@ }, { "match-field": "ipv4_dst", - "match-value": "10.10.10.41&&&0xFFFFFFFF" + "match-value": "192.168.5.137&&&0xFFFFFFFF" } ], "action-name": "FabricIngress.int_watchlist.no_report_collector", diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json index 1ddf941cb..8650d18ec 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b2.json @@ -34,15 +34,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -76,15 +76,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -118,15 +118,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -160,15 +160,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -202,15 +202,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -244,15 +244,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json index d4d8a92fd..66bdbbdd1 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-int-b3.json @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:fb:cf:96" + "match-value": "46:e4:58:c6:74:53" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.10.10.41/32" + "match-value": "192.168.5.137/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:93:8c:c0" + "action-value": "ee:ee:8c:6c:f3:2c" }, { "action-param": "dmac", - "action-value": "fa:16:3e:fb:cf:96" + "action-value": "46:e4:58:c6:74:53" } ] } diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json index f0c438568..2a54108f0 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-east.json @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:e2:af:28" + "match-value": "00:00:00:00:00:02" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "172.16.10.9/32" + "match-value": "10.0.0.2/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:9b:cb:a1" + "action-value": "00:00:00:00:00:01" }, { "action-param": "dmac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" } ] } diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json index 2d5b9e080..6e30d8b3a 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-insert-routing-west.json @@ -102,7 +102,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:58:92:ba" + "match-value": "00:00:00:00:00:01" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -147,7 +147,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.158.72.25/32" + "match-value": "10.0.0.1/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -180,11 +180,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" }, { "action-param": "dmac", - "action-value": "fa:16:3e:58:92:ba" + "action-value": "00:00:00:00:00:01" } ] } diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json index b2b3b429f..f82b25f89 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json +++ b/src/tests/p4-sd-fabric-sbi-connectivity/descriptors/sbi-rules-remove.json @@ -131,15 +131,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -173,15 +173,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -215,15 +215,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -257,15 +257,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -299,15 +299,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -341,15 +341,15 @@ "action-params": [ { "action-param": "src_ip", - "action-value": "10.10.10.120" + "action-value": "192.168.5.139" }, { "action-param": "mon_ip", - "action-value": "10.10.10.41" + "action-value": "192.168.5.137" }, { "action-param": "mon_port", - "action-value": "32766" + "action-value": "12345" }, { "action-param": "switch_id", @@ -372,7 +372,7 @@ }, { "match-field": "ipv4_dst", - "match-value": "10.10.10.41&&&0xFFFFFFFF" + "match-value": "192.168.5.137&&&0xFFFFFFFF" } ], "action-name": "FabricIngress.int_watchlist.no_report_collector", @@ -473,7 +473,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:fb:cf:96" + "match-value": "46:e4:58:c6:74:53" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -518,7 +518,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.10.10.41/32" + "match-value": "192.168.5.137/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -551,11 +551,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:93:8c:c0" + "action-value": "ee:ee:8c:6c:f3:2c" }, { "action-param": "dmac", - "action-value": "fa:16:3e:fb:cf:96" + "action-value": "46:e4:58:c6:74:53" } ] } @@ -668,7 +668,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:58:92:ba" + "match-value": "00:00:00:00:00:01" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -713,7 +713,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "10.158.72.25/32" + "match-value": "10.0.0.1/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -746,11 +746,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" }, { "action-param": "dmac", - "action-value": "fa:16:3e:58:92:ba" + "action-value": "00:00:00:00:00:01" } ] } @@ -848,7 +848,7 @@ }, { "match-field": "eth_dst", - "match-value": "fa:16:3e:e2:af:28" + "match-value": "00:00:00:00:00:02" } ], "action-name": "FabricIngress.forwarding.set_next_id_bridging", @@ -893,7 +893,7 @@ "match-fields": [ { "match-field": "ipv4_dst", - "match-value": "172.16.10.9/32" + "match-value": "10.0.0.2/32" } ], "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", @@ -926,11 +926,11 @@ }, { "action-param": "smac", - "action-value": "fa:16:3e:9b:cb:a1" + "action-value": "00:00:00:00:00:01" }, { "action-param": "dmac", - "action-value": "fa:16:3e:e2:af:28" + "action-value": "00:00:00:00:00:02" } ] } diff --git a/src/tests/p4-topologies/test-scripts/p4-upf/README.md b/src/tests/p4-topologies/test-scripts/p4-upf/README.md new file mode 100644 index 000000000..577e5dc29 --- /dev/null +++ b/src/tests/p4-topologies/test-scripts/p4-upf/README.md @@ -0,0 +1,25 @@ +# UPF Test + +If you have already deployed your UPF following the instructions provided in `src/tests/p4-sd-fabric-svc-upf/` and you want to perform a quick test without deploying a fully-fledged 5G system, you may execute the script in this folder. +All you need is to tweak the script's initial variables to fit your setup. + +## Where to deploy the script + +On the network interface that connects the 5G gNB node with the UPF. +Mark this network interface and add its name as a value in variable `GNB_IFACE`. + +## What to configure in the script + +Apart from the `GNB_IFACE` variable, you need to provide: +- `GNB_IP` and `GNB_MAC` addresses that correspond to the interface `GNB_IFACE` +- `DNN_IP` and `DNN_IP` addresses that correspond to the destination of the packet after traversing the UPF. +- `UPF_IP_LEFT` and `UPF_MAC_LEFT` addresses that correspond to the interface of the UPF that talks to te gNB +- a `UE_IP` of your choice if the default value in the script is not what you want. The UE is emulated by this script so you may leave the default IP. + + +## How the script works + +The script employs a traffic sniffer on the `GNB_IFACE` with a timeout. +After the sniffer is employed, the script transmits a GTP-U packet towards the DNN, which encapsulates an ICMP echo request from the UE to the DNN host. +This packet has to pass through your UPF and get back once the kernel of the DNN host responds with an ICMP echo reply. +This reply is captured by the script and printed. diff --git a/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py b/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py new file mode 100644 index 000000000..94bb6e48b --- /dev/null +++ b/src/tests/p4-topologies/test-scripts/p4-upf/packet-gen-5g-ue.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 +import time +from scapy.all import * +from scapy.contrib.gtp import * + +# 5G gNB network interface towards the 5G UPF +GNB_IFACE = "dp-2" +GNB_IP = "10.10.1.2" +GNB_MAC = "50:3e:aa:85:89:09" + +DNN_IP = "10.10.2.2" # DNN IP address +DNN_MAC = "50:3e:aa:96:ba:dd" + +UPF_IP_LEFT = "10.10.1.1" +UPF_MAC_LEFT = "50:3e:aa:52:3e:38" + +UE_IP = "12.1.1.51" # 5G UE IP address +GTPU_PORT = 2152 + +def send_echo_request(): + # Outer IP + outer_ip = IP( + src=GNB_IP, # IP address of the GNB_IFACE above + dst=UPF_IP_LEFT, + ttl=63, + flags="DF", + id=0x2bae + ) + + # UDP + udp = UDP(sport=GTPU_PORT, dport=GTPU_PORT) + + # GTP PDU Session Container (UL, QFI=9) + pdu_sess = GTPPDUSessionContainer( + type=1, # UL PDU SESSION INFORMATION + QFI=9 + ) + + gtp = GTP_U_Header( + version=1, + PT=1, + E=1, + S=0, + PN=0, + teid=1 + ) / pdu_sess + + # Inner ICMP payload (exact bytes) + icmp_payload = bytes.fromhex( + "7c370600000000001011121314151617" + "18191a1b1c1d1e1f2021222324252627" + "28292a2b2c2d2e2f" + ) + + # ICMP + icmp = ICMP( + type=8, + code=0, + id=0x0035, + seq=1 + ) / Raw(load=icmp_payload) + + # Inner IP + inner_ip = IP( + src=UE_IP, + dst=DNN_IP, + ttl=64, + flags="DF", + id=0xa538 + ) + + # Full packet + pkt = ( + Ether(src=GNB_MAC, dst=DNN_MAC) / + outer_ip / + udp / + gtp / + inner_ip / + icmp + ) + + # Freeze computed fields + pkt = pkt.__class__(raw(pkt)) + + # pkt.show2() + sendp(pkt, iface=GNB_IFACE, verbose=True) + print("Packet sent...\n") + +def interface_capture(pkt): + if pkt[IP].src == GNB_IP: + print("\n=== Tx Packet ===") + print("Packet transmitted by the UE\n") + print(f"{pkt}") + return + + print("\n=== Rx Packet ===") + print(f"{pkt}") + if not pkt.haslayer(GTP_U_Header): + print("Packet received by the UPF is not GTP-U encapsulated\n") + return + + if pkt[IP].src != UPF_IP_LEFT: + print("Packet received by the UPF has incorrect source IP\n") + return + + gtp = pkt[GTP_U_Header] + inner = gtp.payload + + if not inner.haslayer(ICMP): + print("Packet received by the UPF is not ICMP\n") + return + + icmp = inner[ICMP] + + if icmp.type != 0: + return + + # print("\n=== Received Echo Reply ===") + # print("DL TEID:", gtp.teid) + # print(" From:", inner.src) + # print(" To:", inner.dst) + # print("ICMP ID:", icmp.id) + # print(" Seq:", icmp.seq) + # print("===========================\n") + + print("--------------> Your UPF works!") + +print("================================================") + +sniffer = AsyncSniffer( + iface=GNB_IFACE, + filter="udp port 2152", + prn=interface_capture +) + +sniffer.start() +print("Sniffer started") +time.sleep(1) + +# Send packet +send_echo_request() + +# Listen for reply +print("Waiting for reply...\n") + +time.sleep(10) +sniffer.stop() +print("Sniffer is torn down") +print("================================================") -- GitLab From 7b0bc3cb4913a75a3891f954d855304fee42e81d Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Mon, 2 Mar 2026 10:49:17 +0100 Subject: [PATCH 341/371] fix for dynamic telemetry activation --- .../backend/service/HelperMethods.py | 18 +++++------ .../service/TelemetryBackendService.py | 30 ++++++++++++------- .../ofc26_flexscale/telemetry_service.py | 0 .../ofc26_flexscale/test_ofc26_messages.py | 17 ++++++----- .../test_ofc26_mgon_integration_V2.py | 2 +- 5 files changed, 39 insertions(+), 28 deletions(-) delete mode 100644 src/tests/ofc26_flexscale/telemetry_service.py diff --git a/src/telemetry/backend/service/HelperMethods.py b/src/telemetry/backend/service/HelperMethods.py index d0a68c8e8..313dbba86 100644 --- a/src/telemetry/backend/service/HelperMethods.py +++ b/src/telemetry/backend/service/HelperMethods.py @@ -29,7 +29,7 @@ from .collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector LOGGER = logging.getLogger(__name__) def get_subscription_parameters( - kpi_id : str, kpi_manager_client, context_client, duration, interval + kpi_id : str, kpi_manager_client, context_client, resource, duration, interval ) -> Optional[List[Tuple]]: """ Method to get subscription parameters based on KPI ID. @@ -47,9 +47,9 @@ def get_subscription_parameters( - A KPI Descriptor must be added in KPI DB with correct device_id. - The device must be available in the context. """ - kpi_id_obj = KpiId() + kpi_id_obj = KpiId() kpi_id_obj.kpi_id.uuid = kpi_id # pyright: ignore[reportAttributeAccessIssue] - kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) + kpi_descriptor = kpi_manager_client.GetKpiDescriptor(kpi_id_obj) if not kpi_descriptor: LOGGER.warning(f"KPI ID: {kpi_id} - Descriptor not found. Skipping...") return None @@ -90,7 +90,7 @@ def get_subscription_parameters( { "kpi" : kpi_sample_type, # As request is based on the single KPI so it should have only one endpoint "endpoint" : endpoint_data[endpoint.endpoint_uuid.uuid][0], # Endpoint name - "resource" : 'interface', # Example resource type + "resource" : resource, # Example resource type is 'interface' or 'wavelength-router' for MG-ON, this should be defined in the KPI Descriptor or as part of the request }, float(duration), float(interval), @@ -179,13 +179,13 @@ def get_node_level_int_collector(collector_id: str, kpi_id: str, address: str, i return collector if connected else None -def get_mgon_subscription_parameters(duration, interval) -> Optional[List[Tuple]]: +def get_mgon_subscription_parameters(resource: str, endpoint: str, kpi: str, duration: int, interval: int) -> Optional[List[Tuple]]: return [( - "x123", + str(uuid.uuid4()), # "x123", { - "kpi" : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, # sub_parameters['kpi'], - "endpoint" : '4', # sub_parameters['endpoint'], - "resource" : 'wavelength-router', #sub_parameters['resource'], + "kpi" : kpi, # sub_parameters['kpi'], + "endpoint" : endpoint, # sub_parameters['endpoint'], + "resource" : resource, #sub_parameters['resource'], }, duration, interval, diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 2a7943e57..7214a2bcc 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -97,6 +97,10 @@ class TelemetryBackendService(GenericGrpcService): threading.Thread(target=self.GenericCollectorHandler, args=( collector_id, + collector, # TODO: later all other collector[''] should be removed. + # For now, to avoid multiple changes in the code, + # I am passing the whole collector dict and accessing the required parameters in the GenericCollectorHandler method. + # This will be changed after confirming the current implementation is working fine. collector['kpi_id'], duration, collector['interval'], @@ -126,7 +130,9 @@ class TelemetryBackendService(GenericGrpcService): LOGGER.warning( f"Unable to consume message from topic: {KafkaTopic.TELEMETRY_REQUEST.value}. ERROR: {e}") - def GenericCollectorHandler(self, collector_id, kpi_id, duration, interval, interface, port, service_id, context_id, stop_event): + def GenericCollectorHandler(self, + collector_id, collector, kpi_id, duration, interval, interface, port, + service_id, context_id, stop_event): """ Method to handle collector request. """ @@ -146,12 +152,12 @@ class TelemetryBackendService(GenericGrpcService): # Rest of the collectors elif context_id == "43813baf-195e-5da6-af20-b3d0922e71a7": self.device_collector = get_mgon_collector( - address = "172.17.254.24", - port = 50061, - username = "admin", - password = "admin", - insecure = True, - skip_verify = True + address = collector['host'], # "172.17.254.24", + port = collector['port'], # 50061, + username = collector['username'], # "admin", + password = collector['password'], # "admin", + insecure = collector.get('insecure', True), + skip_verify = collector.get('skip_verify', True) ) else: self.device_collector = get_collector_by_kpi_id( @@ -163,10 +169,14 @@ class TelemetryBackendService(GenericGrpcService): # CONFIRM: The method (get_subscription_parameters) is working correctly. testcase in telemetry backend tests # resource_to_subscribe = get_subscription_parameters( - # kpi_id, self.kpi_manager_client, self.context_client, duration, interval + # kpi_id, self.kpi_manager_client, self.context_client, resource, duration, interval # ) - resource_to_subscribe = get_mgon_subscription_parameters(duration, interval) # TODO: Remove after confirming get_subscription_parameters is working correctly - + # TODO: Remove after confirming get_subscription_parameters generic is working correctly + resource_to_subscribe = get_mgon_subscription_parameters( + collector['resource'], collector['endpoint'], collector['kpi'], + collector['duration'], collector['sample_interval'] + ) + if not resource_to_subscribe: LOGGER.warning(f"KPI ID: {kpi_id} - Resource to subscribe not found. Skipping...") raise Exception(f"KPI ID: {kpi_id} - Resource to subscribe not found.") diff --git a/src/tests/ofc26_flexscale/telemetry_service.py b/src/tests/ofc26_flexscale/telemetry_service.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py index 20217f2b7..11ad15946 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_messages.py +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -27,15 +27,16 @@ def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): devices = { 'mgon': { - 'host' : '172.17.254.24', - 'port' : '50061', - 'username': 'admin', - 'password': 'admin', - 'insecure': True, - 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, + 'host' : '172.17.254.24', + 'port' : '50061', + 'username' : 'admin', + 'password' : 'admin', + 'insecure' : True, + 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', - 'resource': 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint': '4', + 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model + 'endpoint' : '4', + 'skip_verify': True }, } diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index f6ea99945..9ec62501f 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -74,7 +74,7 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, CollectorId) except Exception as e: - LOGGER.info("No existing Collector found with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) + LOGGER.info("Error finding the collector with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) response = telemetry_frontend_client.StartCollector(_collector_request) LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, CollectorId) -- GitLab From 46e5f9dead6642418b3e4cf9c880b8488fc1bbc3 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Mon, 2 Mar 2026 13:16:31 +0100 Subject: [PATCH 342/371] telemetry fix --- .../service/TelemetryBackendService.py | 4 +- .../ofc26_flexscale/test_ofc26_messages.py | 15 +- .../test_ofc26_mgon_integration_V2.py | 74 +- .../topology/CNIT/1.context.json | 19 + .../CNIT/2.0nodes-links_no_slots.json | 1378 +++++++++++++++++ .../topology/CNIT/3.0-ob-s.json | 23 + .../topology/CNIT/3.1-sc-s1-alien.json | 25 + .../topology/CNIT/3.2-sc-s2-alien.json | 25 + .../topology/CNIT/4.0.ob_l.json | 25 + .../topology/CNIT/4.1-sc-l1-alien.json | 25 + .../topology/CNIT/4.2-sc-l2-alien.json | 25 + .../topology/CNIT/5.0ob_c1.json | 23 + .../topology/CNIT/5.1ob_c2.json | 25 + .../topology/CNIT/5.2-sc-c-alien.json | 25 + .../topology/CNIT/5.3-oc-c-service.json | 23 + .../topology/HHI/1.context.json | 19 + .../HHI/2.0nodes-links_no_slots_2TPs.json | 826 ++++++++++ .../HHI/2.0nodes-links_no_slots_6TPs.json | 1378 +++++++++++++++++ .../topology/HHI/3.0-ob-s.json | 23 + .../topology/HHI/3.1-sc-s1-alien.json | 25 + .../topology/HHI/3.2-sc-s2-alien.json | 25 + .../topology/HHI/4.0.ob_l.json | 25 + .../topology/HHI/4.1-sc-l1-alien.json | 25 + .../topology/HHI/4.2-sc-l2-alien.json | 25 + .../topology/HHI/5.0ob_c1.json | 23 + .../topology/HHI/5.1ob_c2 - Copia.json | 25 + .../topology/HHI/5.1ob_c2.json | 25 + .../topology/HHI/5.2-sc-c-alien.json | 25 + .../topology/HHI/5.3-oc-c-service.json | 23 + 29 files changed, 4194 insertions(+), 32 deletions(-) create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/1.context.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/1.context.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json create mode 100644 src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 7214a2bcc..a7cd05e45 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -82,7 +82,7 @@ class TelemetryBackendService(GenericGrpcService): LOGGER.error(f"Consumer error: {receive_msg.error()}") break try: - collector = json.loads(receive_msg.value().decode('utf-8')) + collector = json.loads(receive_msg.value().decode('utf-8')) collector_id = receive_msg.key().decode('utf-8') LOGGER.debug(f"Received Collector: {collector_id} - {collector}") @@ -136,7 +136,7 @@ class TelemetryBackendService(GenericGrpcService): """ Method to handle collector request. """ - + LOGGER.info(f"Starting Collector Handler for Collector ID: {collector_id} - KPI ID: {kpi_id}") # INT collector invocation if interface: self.device_collector = get_node_level_int_collector( diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py index 11ad15946..2dbef239f 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_messages.py +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -1,6 +1,6 @@ -import uuid +import json from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI @@ -17,7 +17,7 @@ def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' - # _create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "<>" # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' return _create_kpi_request @@ -35,7 +35,7 @@ devices = { 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint' : '4', + 'endpoint' : '1', 'skip_verify': True }, } @@ -44,9 +44,6 @@ def create_basic_sub_request_parameters() -> dict: device = devices['mgon'] if device: - kpi = device['kpi'] - resource = device['resource'] - endpoint = device['endpoint'] return { 'host' : device['host'], 'port' : device['port'], @@ -57,9 +54,9 @@ def create_basic_sub_request_parameters() -> dict: 'mode' : 'sample', # Subscription internal mode posibly: on_change, poll, sample 'sample_interval' : 10, # This should be in seconds units 'duration' : 300.0, # Duration in seconds for how long to receive samples - 'kpi' : kpi, - 'resource' : resource, - 'endpoint' : endpoint, + 'kpi' : device['kpi'], + 'resource' : device['resource'], + 'endpoint' : device['endpoint'], } return {} diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index 9ec62501f..27c6a2cb4 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -1,10 +1,11 @@ import logging - +import time from common.proto.kpi_manager_pb2 import KpiId from common.proto.telemetry_frontend_pb2 import CollectorId import time +import threading from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -12,6 +13,9 @@ from common.proto.kpi_sample_types_pb2 import KpiSampleType from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request, create_collector_request from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters +from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService + + WITH_TFS = True #True/False if WITH_TFS: from .Fixtures import kpi_manager_client, telemetry_frontend_client @@ -48,8 +52,8 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client # 1. KPI Descriptor Creation LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") kpi_descriptor_obj = create_kpi_descriptor_request() - _search_kpi_id = kpi_manager_pb2.KpiId() - _search_kpi_id = kpi_descriptor_obj.kpi_id + _search_kpi_id = kpi_manager_pb2.KpiId() + _search_kpi_id = kpi_descriptor_obj.kpi_id try: response = kpi_manager_client.GetKpiDescriptor(_search_kpi_id) @@ -63,26 +67,52 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client # 2. Telemetry Collector Creation + # _collector_request = create_collector_request() + # _search_collector_id = CollectorId() + # _search_collector_id = _collector_request.collector_id + # try: + # response_col = telemetry_frontend_client.StopCollector(_search_collector_id) + # LOGGER.info("Response gRPC message object: {:}".format(response_col)) + # if response is not None: + # response = telemetry_frontend_client.StartCollector(_collector_request) + # LOGGER.info("Response gRPC message object: {:}".format(response)) + # assert isinstance(response, CollectorId) + # except Exception as e: + # LOGGER.info("Error finding the collector with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) + # response = telemetry_frontend_client.StartCollector(_collector_request) + # LOGGER.info("Response gRPC message object: {:}".format(response)) + # assert isinstance(response, CollectorId) + + # step 2: Telemetry Collector backup option _collector_request = create_collector_request() - _search_collector_id = CollectorId() - _search_collector_id = _collector_request.collector_id - try: - response_col = telemetry_frontend_client.StopCollector(_search_collector_id) - LOGGER.info("Response gRPC message object: {:}".format(response_col)) - if response is not None: - response = telemetry_frontend_client.StartCollector(_collector_request) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, CollectorId) - except Exception as e: - LOGGER.info("Error finding the collector with ID: %s. Proceeding to create it.", _search_collector_id.collector_id.uuid) - response = telemetry_frontend_client.StartCollector(_collector_request) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, CollectorId) + _collector = create_basic_sub_request_parameters() + _coll_id = "mgon_collector_id" + LOGGER.info("Subscription for collector %s parameters: %s", _coll_id, _collector) - # sub_parameters = create_basic_sub_request_parameters() - # LOGGER.info("Subscription parameters: %s", sub_parameters) - - + _duration = _collector_request.duration_s + _interval = _collector_request.interval_s + + stop_event = threading.Event() + collector_thread = threading.Thread( + target=TelemetryBackendService.GenericCollectorHandler, + args=( + _coll_id, _collector, None, _duration, _interval, + None, None, None, None, stop_event + ) + ) + + def stop_after_duration(completion_time, stop_event): + time.sleep(completion_time) + if not stop_event.is_set(): + LOGGER.warning(f"Execution duration ({completion_time}) completed for Collector: {_coll_id}") + if stop_event: + stop_event.set() + + duration_thread = threading.Thread( + target=stop_after_duration, daemon=True, name=f"stop_after_duration_{_coll_id}", + args=(_duration, stop_event) + ) + duration_thread.start() # LOGGER.info("----- Testing State Subscription -----") # sub_data = [( @@ -103,6 +133,8 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client LOGGER.info("Sleeping...") time.sleep(600) + if stop_event: + stop_event.set() LOGGER.info("Done sleeping.") LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") diff --git a/src/tests/ofc26_flexscale/topology/CNIT/1.context.json b/src/tests/ofc26_flexscale/topology/CNIT/1.context.json new file mode 100644 index 000000000..36b3c44fd --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/1.context.json @@ -0,0 +1,19 @@ +{ + "contexts": [ + { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_ids": [], + "service_ids": [] + } + ], + "topologies": [ + { + "topology_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_uuid": {"uuid": "admin"} + }, + "device_ids": [], + "link_ids": [] + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json b/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json new file mode 100644 index 000000000..d9f643f09 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/2.0nodes-links_no_slots.json @@ -0,0 +1,1378 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.51" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.21" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.22" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.23" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.17.254.24" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "2022" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-3-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-1-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-9-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-1-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json b/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json new file mode 100644 index 000000000..d3fa89a1f --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.0-ob-s.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-S"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "S_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "6000"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json new file mode 100644 index 000000000..f1752d7e6 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.1-sc-s1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-25-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-25-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "1"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json new file mode 100644 index 000000000..4a38e9022 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/3.2-sc-s2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-26-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-26-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "2900"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "1"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json b/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json new file mode 100644 index 000000000..0f02c6122 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.0.ob_l.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-L"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "L_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json new file mode 100644 index 000000000..e92ef29da --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.1-sc-l1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-27-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-27-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json new file mode 100644 index 000000000..bada34dbc --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/4.2-sc-l2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-28-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-28-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json b/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json new file mode 100644 index 000000000..ab56e9daa --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.0ob_c1.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json b/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json new file mode 100644 index 000000000..b9398c106 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.1ob_c2.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "3"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json b/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json new file mode 100644 index 000000000..831a271d2 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.2-sc-c-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-c"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-29-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-29-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json b/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json new file mode 100644 index 000000000..47b551a94 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/CNIT/5.3-oc-c-service.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-channel-C"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T1.1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "T2.1"}}, "endpoint_uuid": {"uuid": "1"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "800.0"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/1.context.json b/src/tests/ofc26_flexscale/topology/HHI/1.context.json new file mode 100644 index 000000000..36b3c44fd --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/1.context.json @@ -0,0 +1,19 @@ +{ + "contexts": [ + { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_ids": [], + "service_ids": [] + } + ], + "topologies": [ + { + "topology_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_uuid": {"uuid": "admin"} + }, + "device_ids": [], + "link_ids": [] + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json new file mode 100644 index 000000000..2fa101744 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_2TPs.json @@ -0,0 +1,826 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44551" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44552" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44553" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44554" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-10-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-10-out", + "dst_port": "port-3-in", + "local_peer_port": "port-10-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-10-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-10-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-2-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-2-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-2-out", + "dst_port": "port-1-in", + "local_peer_port": "port-2-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json new file mode 100644 index 000000000..a4dea6ae3 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/2.0nodes-links_no_slots_6TPs.json @@ -0,0 +1,1378 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "device_type": "optical-transponder", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.16.31.93" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "3830" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "hussein", + "password": "flexscale", + "type": "optical-transponder", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44551" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44552" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44553" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "device_type": "optical-roadm", + "device_drivers": [ + 11 + ], + "device_endpoints": [ + ], + "device_operational_status": 1, + "device_config": { + "config_rules": [ + { + "action": 1, + "custom": { + "resource_key": "_connect/address", + "resource_value": "172.24.36.52" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/port", + "resource_value": "44554" + } + }, + { + "action": 1, + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "username": "admin", + "password": "admin", + "type": "optical-roadm", + "force_running": false, + "hostkey_verify": false, + "look_for_keys": false, + "allow_agent": false, + "commit_per_rule": false, + "device_params": { + "name": "default" + }, + "manager_params": { + "timeout": 120 + }, + "endpoints": [ + ] + } + } + } + ] + } + } + ], + "optical_links": [ + { + "name": "T1.1-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.1->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T1.3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "T1.3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.1", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-T1.3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->T1.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T1.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-9-out", + "dst_port": "port-3-in", + "local_peer_port": "port-9-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-9-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-9-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-9-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON1-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON1->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-10-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-10-out", + "dst_port": "port-3-in", + "local_peer_port": "port-10-in", + "remote_peer_port": "port-3-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON1", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-3-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON1" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-3-out", + "dst_port": "port-10-in", + "local_peer_port": "port-3-in", + "remote_peer_port": "port-10-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON2" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-1-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "MGON3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-1-out", + "dst_port": "port-2-in", + "local_peer_port": "port-1-in", + "remote_peer_port": "port-2-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-MGON3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->MGON3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-2-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON3" + } + }, + "endpoint_uuid": { + "uuid": "port-1-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-2-out", + "dst_port": "port-1-in", + "local_peer_port": "port-2-in", + "remote_peer_port": "port-1-out", + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.1-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.1->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "1", + "dst_port": "port-33-in", + "local_peer_port": "1", + "remote_peer_port": "port-33-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.2-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.2->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "2", + "dst_port": "port-34-in", + "local_peer_port": "2", + "remote_peer_port": "port-34-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "T2.3-MGON4", + "link_id": { + "link_uuid": { + "uuid": "T2.3->MGON4" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-in" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "3", + "dst_port": "port-35-in", + "local_peer_port": "3", + "remote_peer_port": "port-35-out", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.1", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-33-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-33-out", + "dst_port": "1", + "local_peer_port": "port-33-in", + "remote_peer_port": "1", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.2", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-34-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.2" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-34-out", + "dst_port": "2", + "local_peer_port": "port-34-in", + "remote_peer_port": "2", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + }, + { + "name": "MGON4-T2.3", + "link_id": { + "link_uuid": { + "uuid": "MGON4->T2.3" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "MGON4" + } + }, + "endpoint_uuid": { + "uuid": "port-35-out" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "T2.3" + } + }, + "endpoint_uuid": { + "uuid": "3" + } + } + ], + "optical_details": { + "length": 0, + "src_port": "port-35-out", + "dst_port": "3", + "local_peer_port": "port-35-in", + "remote_peer_port": "3", + "used": false, + "c_slots": {"1": 1}, + "l_slots": {"101": 1}, + "s_slots": {"501": 1} + } + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json b/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json new file mode 100644 index 000000000..d3fa89a1f --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.0-ob-s.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-S"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "S_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "6000"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json b/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json new file mode 100644 index 000000000..37969cfb8 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.1-sc-s1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-25-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-25-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "3"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json b/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json new file mode 100644 index 000000000..e4d620d47 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/3.2-sc-s2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-s2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-26-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-26-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "2900"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "3"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} \ No newline at end of file diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json b/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json new file mode 100644 index 000000000..c63243f32 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.0.ob_l.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-L"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "L_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3000"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "3"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json b/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json new file mode 100644 index 000000000..3d24a34e3 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.1-sc-l1-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-27-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-27-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1500"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json b/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json new file mode 100644 index 000000000..8210c786e --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/4.2-sc-l2-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-l2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-28-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-28-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1200"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "4"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json b/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json new file mode 100644 index 000000000..ab56e9daa --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.0ob_c1.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C1"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-9-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-1-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}} + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json new file mode 100644 index 000000000..d34f10d85 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2 - Copia.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "1900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json new file mode 100644 index 000000000..31229c1dc --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.1ob_c2.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-band-C2"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-1-out"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-9-in"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "preferred_band", "constraint_value": "C_BAND"}}, + {"custom": {"constraint_type": "optical-band-width[GHz]", "constraint_value": "3900"}}, + {"custom": {"constraint_type": "disjoint_optical_band_id", "constraint_value": "1"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json b/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json new file mode 100644 index 000000000..8411862c0 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.2-sc-c-alien.json @@ -0,0 +1,25 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "super-channel-c"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "MGON1"}}, "endpoint_uuid": {"uuid": "port-29-in"}}, + {"device_id": {"device_uuid": {"uuid": "MGON4"}}, "endpoint_uuid": {"uuid": "port-29-out"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "alien", "constraint_value": "1"}}, + {"custom": {"constraint_type": "alien_spectrum[GHz]", "constraint_value": "1959"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}} + + ], + "service_config": {"config_rules": []} + } + ] +} diff --git a/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json b/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json new file mode 100644 index 000000000..169b854c2 --- /dev/null +++ b/src/tests/ofc26_flexscale/topology/HHI/5.3-oc-c-service.json @@ -0,0 +1,23 @@ +{ + "services": [ + { + "service_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "service_uuid": {"uuid": "optical-channel-C"} + }, + "service_type": 6, + "service_status": {"service_status": 1}, + "service_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T1.1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "T2.1"}}, "endpoint_uuid": {"uuid": "1"}} + ], + "service_constraints": [ + {"custom": {"constraint_type": "type", "constraint_value": "multi_granular"}}, + {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "800.0"}}, + {"custom": {"constraint_type": "bidirectionality", "constraint_value": "0"}}, + {"custom": {"constraint_type": "optical_band_id", "constraint_value": "2"}} + ], + "service_config": {"config_rules": []} + } + ] +} -- GitLab From de9ecf8e968132a35110ef00bc23c26804fc87ba Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Mon, 2 Mar 2026 13:34:38 +0100 Subject: [PATCH 343/371] refactor test_Complete_MGON_Integration for improved logging and thread management --- .../test_ofc26_mgon_integration_V2.py | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index 27c6a2cb4..069bb3b00 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -52,7 +52,6 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client # 1. KPI Descriptor Creation LOGGER.info(" >>> test_Complete_MGON_Integration: START <<< ") kpi_descriptor_obj = create_kpi_descriptor_request() - _search_kpi_id = kpi_manager_pb2.KpiId() _search_kpi_id = kpi_descriptor_obj.kpi_id try: @@ -60,7 +59,7 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client if isinstance(response, kpi_manager_pb2.KpiDescriptor): LOGGER.info("KPI Descriptor already exists with ID: %s. Skipping creation.", _search_kpi_id.kpi_id.uuid) except Exception as e: - LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it.", _search_kpi_id.kpi_id.uuid) + LOGGER.info("No existing KPI Descriptor found with ID: %s. Proceeding to create it. Error: %s", _search_kpi_id.kpi_id.uuid, str(e)) response = kpi_manager_client.SetKpiDescriptor(kpi_descriptor_obj) LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, KpiId) @@ -98,43 +97,34 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client args=( _coll_id, _collector, None, _duration, _interval, None, None, None, None, stop_event - ) + ), + daemon=False ) + collector_thread.start() def stop_after_duration(completion_time, stop_event): time.sleep(completion_time) if not stop_event.is_set(): LOGGER.warning(f"Execution duration ({completion_time}) completed for Collector: {_coll_id}") - if stop_event: - stop_event.set() + stop_event.set() duration_thread = threading.Thread( target=stop_after_duration, daemon=True, name=f"stop_after_duration_{_coll_id}", args=(_duration, stop_event) ) duration_thread.start() - # LOGGER.info("----- Testing State Subscription -----") - - # sub_data = [( - # "x123", - # { - # "kpi" : sub_parameters['kpi'], - # "endpoint" : sub_parameters['endpoint'], - # "resource" : sub_parameters['resource'], - # }, - # sub_parameters['duration'], - # sub_parameters['sample_interval'], - # ),] - + LOGGER.info("Sleeping for %d seconds...", _duration) + time.sleep(_duration) - # LOGGER.info("Subscription started: Status: %s, Data: %s", response, sub_data) + LOGGER.info("Setting stop event for Collector: %s", _coll_id) + stop_event.set() + + # Wait for collector thread to complete + collector_thread.join(timeout=10) + if collector_thread.is_alive(): + LOGGER.warning("Collector thread did not terminate within timeout") - - LOGGER.info("Sleeping...") - time.sleep(600) - if stop_event: - stop_event.set() LOGGER.info("Done sleeping.") LOGGER.info(" >>> test_Complete_MGON_Integration: END <<< ") -- GitLab From 362464e1e54b279dc1c9cbe83b290b67772ceb91 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Mon, 2 Mar 2026 13:54:28 +0100 Subject: [PATCH 344/371] refactor test_Complete_MGON_Integration to enhance telemetry service initialization and collector handling --- .../test_ofc26_mgon_integration_V2.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index 069bb3b00..6f115231b 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -10,10 +10,11 @@ import threading from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from src.telemetry.backend.service.collector_api import DriverFactory from tests.ofc26_flexscale.test_ofc26_messages import create_kpi_descriptor_request, create_collector_request from src.tests.ofc26_flexscale.test_ofc26_messages import create_basic_sub_request_parameters -from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService +from src.telemetry.backend.service.TelemetryBackendService import DriverInstanceCache, TelemetryBackendService WITH_TFS = True #True/False @@ -83,6 +84,14 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client # assert isinstance(response, CollectorId) # step 2: Telemetry Collector backup option + from telemetry.backend.service.collectors import COLLECTORS + from telemetry.backend.service.collector_api.DriverFactory import DriverFactory + from telemetry.backend.service.collector_api.DriverInstanceCache import DriverInstanceCache, preload_drivers + + driver_factory = DriverFactory(COLLECTORS) + driver_instance_cache = DriverInstanceCache(driver_factory) + _service = TelemetryBackendService(driver_instance_cache) + _collector_request = create_collector_request() _collector = create_basic_sub_request_parameters() _coll_id = "mgon_collector_id" @@ -93,10 +102,10 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client stop_event = threading.Event() collector_thread = threading.Thread( - target=TelemetryBackendService.GenericCollectorHandler, + target=_service.GenericCollectorHandler, args=( _coll_id, _collector, None, _duration, _interval, - None, None, None, None, stop_event + None, None, None, "43813baf-195e-5da6-af20-b3d0922e71a7", stop_event ), daemon=False ) -- GitLab From 88ead097c92f335901ee208e7b296e0e92ab4c96 Mon Sep 17 00:00:00 2001 From: armingol Date: Mon, 9 Mar 2026 10:43:57 +0000 Subject: [PATCH 345/371] feat: Update OpenConfig YANG models, add and remove IETF YANG definitions, and refresh documentation. --- openconfig_public | 1 + .../yang/iana-routing-types@2017-12-04.yang | 473 --- .../yang/iana-routing-types@2025-02-18.yang | 648 ++++ .../ietf-eth-tran-service@2023-10-23.yang | 1004 ----- .../ietf-eth-tran-service@2024-01-11.yang | 987 +++++ .../yang/ietf-eth-tran-types@2023-10-23.yang | 457 --- .../yang/ietf-eth-tran-types@2024-01-11.yang | 470 +++ .../yang/ietf-inet-types@2013-07-15.yang | 459 --- .../yang/ietf-inet-types@2025-06-23.yang | 669 ++++ .../yang/ietf-layer1-types@2022-10-14.yang | 1414 ------- .../yang/ietf-layer1-types@2024-02-22.yang | 1361 +++++++ .../yang/ietf-otn-topology@2023-07-06.yang | 2405 ------------ .../yang/ietf-otn-topology@2024-06-21.yang | 2230 +++++++++++ .../yang/ietf-te-packet-types@2020-06-10.yang | 475 --- .../yang/ietf-te-packet-types@2026-01-15.yang | 844 ++++ ...-10.yang => ietf-te-types@2026-01-23.yang} | 3408 +++++++++++------ .../ietf-trans-client-service@2023-10-23.yang | 325 -- .../ietf-trans-client-service@2024-01-11.yang | 338 ++ ...etf-trans-client-svc-types@2023-10-23.yang | 63 - ...etf-trans-client-svc-types@2024-01-11.yang | 77 + .../yang/ietf-yang-types@2013-07-15.yang | 475 --- .../yang/ietf-yang-types@2025-12-22.yang | 764 ++++ 22 files changed, 10674 insertions(+), 8673 deletions(-) create mode 160000 openconfig_public delete mode 100644 src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang create mode 100644 src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang rename src/nbi/service/ietf_network/yang/{ietf-te-types@2020-06-10.yang => ietf-te-types@2026-01-23.yang} (55%) delete mode 100644 src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang diff --git a/openconfig_public b/openconfig_public new file mode 160000 index 000000000..834db2b62 --- /dev/null +++ b/openconfig_public @@ -0,0 +1 @@ +Subproject commit 834db2b62f8ee66ee6c8f8b567569ad81caac34e diff --git a/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang b/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang deleted file mode 100644 index 250cba4b6..000000000 --- a/src/nbi/service/ietf_network/yang/iana-routing-types@2017-12-04.yang +++ /dev/null @@ -1,473 +0,0 @@ - module iana-routing-types { - namespace "urn:ietf:params:xml:ns:yang:iana-routing-types"; - prefix iana-rt-types; - - organization - "IANA"; - contact - "Internet Assigned Numbers Authority - - Postal: ICANN - 12025 Waterfront Drive, Suite 300 - Los Angeles, CA 90094-2536 - United States of America - Tel: +1 310 301 5800 - "; - - description - "This module contains a collection of YANG data types - considered defined by IANA and used for routing - protocols. - - Copyright (c) 2017 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 8294; see - the RFC itself for full legal notices."; - - revision 2017-12-04 { - description "Initial revision."; - reference - "RFC 8294: Common YANG Data Types for the Routing Area. - Section 4."; - } - - /*** Collection of IANA types related to routing ***/ - /*** IANA Address Family enumeration ***/ - - typedef address-family { - type enumeration { - enum ipv4 { - value 1; - description - "IPv4 Address Family."; - } - - enum ipv6 { - value 2; - description - "IPv6 Address Family."; - } - - enum nsap { - value 3; - description - "OSI Network Service Access Point (NSAP) Address Family."; - } - - enum hdlc { - value 4; - description - "High-Level Data Link Control (HDLC) Address Family."; - } - - enum bbn1822 { - value 5; - description - "Bolt, Beranek, and Newman Report 1822 (BBN 1822) - Address Family."; - } - - enum ieee802 { - value 6; - description - "IEEE 802 Committee Address Family - (aka Media Access Control (MAC) address)."; - } - - enum e163 { - value 7; - description - "ITU-T E.163 Address Family."; - } - - enum e164 { - value 8; - description - "ITU-T E.164 (Switched Multimegabit Data Service (SMDS), - Frame Relay, ATM) Address Family."; - } - - enum f69 { - value 9; - description - "ITU-T F.69 (Telex) Address Family."; - } - - enum x121 { - value 10; - description - "ITU-T X.121 (X.25, Frame Relay) Address Family."; - } - - enum ipx { - value 11; - description - "Novell Internetwork Packet Exchange (IPX) - Address Family."; - } - - enum appletalk { - value 12; - description - "Apple AppleTalk Address Family."; - } - - enum decnet-iv { - value 13; - description - "Digital Equipment DECnet Phase IV Address Family."; - } - - enum vines { - value 14; - description - "Banyan Vines Address Family."; - } - - enum e164-nsap { - value 15; - description - "ITU-T E.164 with NSAP sub-address Address Family."; - } - - enum dns { - value 16; - description - "Domain Name System (DNS) Address Family."; - } - - enum distinguished-name { - value 17; - description - "Distinguished Name Address Family."; - } - - enum as-num { - value 18; - description - "Autonomous System (AS) Number Address Family."; - } - - enum xtp-v4 { - value 19; - description - "Xpress Transport Protocol (XTP) over IPv4 - Address Family."; - } - - enum xtp-v6 { - value 20; - description - "XTP over IPv6 Address Family."; - } - - enum xtp-native { - value 21; - description - "XTP native mode Address Family."; - } - - enum fc-port { - value 22; - description - "Fibre Channel (FC) World-Wide Port Name Address Family."; - } - - enum fc-node { - value 23; - description - "FC World-Wide Node Name Address Family."; - } - - enum gwid { - value 24; - description - "ATM Gateway Identifier (GWID) Number Address Family."; - } - - enum l2vpn { - value 25; - description - "Layer 2 VPN (L2VPN) Address Family."; - } - - enum mpls-tp-section-eid { - value 26; - description - "MPLS Transport Profile (MPLS-TP) Section Endpoint - Identifier Address Family."; - } - - enum mpls-tp-lsp-eid { - value 27; - description - "MPLS-TP Label Switched Path (LSP) Endpoint Identifier - Address Family."; - } - - enum mpls-tp-pwe-eid { - value 28; - description - "MPLS-TP Pseudowire Endpoint Identifier Address Family."; - } - - enum mt-v4 { - value 29; - description - "Multi-Topology IPv4 Address Family."; - } - - enum mt-v6 { - value 30; - description - "Multi-Topology IPv6 Address Family."; - } - - enum eigrp-common-sf { - value 16384; - description - "Enhanced Interior Gateway Routing Protocol (EIGRP) - Common Service Family Address Family."; - } - - enum eigrp-v4-sf { - value 16385; - description - "EIGRP IPv4 Service Family Address Family."; - } - - enum eigrp-v6-sf { - value 16386; - description - "EIGRP IPv6 Service Family Address Family."; - } - - enum lcaf { - value 16387; - description - "Locator/ID Separation Protocol (LISP) - Canonical Address Format (LCAF) Address Family."; - } - - enum bgp-ls { - value 16388; - description - "Border Gateway Protocol - Link State (BGP-LS) - Address Family."; - } - - enum mac-48 { - value 16389; - description - "IEEE 48-bit MAC Address Family."; - } - - enum mac-64 { - value 16390; - description - "IEEE 64-bit MAC Address Family."; - } - - enum trill-oui { - value 16391; - description - "Transparent Interconnection of Lots of Links (TRILL) - IEEE Organizationally Unique Identifier (OUI) - Address Family."; - } - - enum trill-mac-24 { - value 16392; - description - "TRILL final 3 octets of 48-bit MAC Address Family."; - } - - enum trill-mac-40 { - value 16393; - description - "TRILL final 5 octets of 64-bit MAC Address Family."; - } - - enum ipv6-64 { - value 16394; - description - "First 8 octets (64 bits) of IPv6 address - Address Family."; - } - - enum trill-rbridge-port-id { - value 16395; - description - "TRILL Routing Bridge (RBridge) Port ID Address Family."; - } - - enum trill-nickname { - value 16396; - description - "TRILL Nickname Address Family."; - } - } - - description - "Enumeration containing all the IANA-defined - Address Families."; - - } - - /*** Subsequent Address Family Identifiers (SAFIs) ***/ - /*** for multiprotocol BGP enumeration ***/ - - typedef bgp-safi { - type enumeration { - enum unicast-safi { - value 1; - description - "Unicast SAFI."; - } - - enum multicast-safi { - value 2; - description - "Multicast SAFI."; - } - - enum labeled-unicast-safi { - value 4; - description - "Labeled Unicast SAFI."; - } - - enum multicast-vpn-safi { - value 5; - description - "Multicast VPN SAFI."; - } - - enum pseudowire-safi { - value 6; - description - "Multi-segment Pseudowire VPN SAFI."; - } - - enum tunnel-encap-safi { - value 7; - description - "Tunnel Encap SAFI."; - } - - enum mcast-vpls-safi { - value 8; - description - "Multicast Virtual Private LAN Service (VPLS) SAFI."; - } - - enum tunnel-safi { - value 64; - description - "Tunnel SAFI."; - } - - enum vpls-safi { - value 65; - description - "VPLS SAFI."; - } - - enum mdt-safi { - value 66; - description - "Multicast Distribution Tree (MDT) SAFI."; - } - - enum v4-over-v6-safi { - value 67; - description - "IPv4 over IPv6 SAFI."; - } - - enum v6-over-v4-safi { - value 68; - description - "IPv6 over IPv4 SAFI."; - } - - enum l1-vpn-auto-discovery-safi { - value 69; - description - "Layer 1 VPN Auto-Discovery SAFI."; - } - - enum evpn-safi { - value 70; - description - "Ethernet VPN (EVPN) SAFI."; - } - - enum bgp-ls-safi { - value 71; - description - "BGP-LS SAFI."; - } - - enum bgp-ls-vpn-safi { - value 72; - description - "BGP-LS VPN SAFI."; - } - - enum sr-te-safi { - value 73; - description - "Segment Routing - Traffic Engineering (SR-TE) SAFI."; - } - - enum labeled-vpn-safi { - value 128; - description - "MPLS Labeled VPN SAFI."; - } - - enum multicast-mpls-vpn-safi { - value 129; - description - "Multicast for BGP/MPLS IP VPN SAFI."; - } - - enum route-target-safi { - value 132; - description - "Route Target SAFI."; - } - - enum ipv4-flow-spec-safi { - value 133; - description - "IPv4 Flow Specification SAFI."; - } - - enum vpnv4-flow-spec-safi { - value 134; - description - "IPv4 VPN Flow Specification SAFI."; - } - - enum vpn-auto-discovery-safi { - value 140; - description - "VPN Auto-Discovery SAFI."; - } - } - description - "Enumeration for BGP SAFI."; - reference - "RFC 4760: Multiprotocol Extensions for BGP-4."; - } - } diff --git a/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang b/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang new file mode 100644 index 000000000..b7a9e21b3 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/iana-routing-types@2025-02-18.yang @@ -0,0 +1,648 @@ +module iana-routing-types { + namespace "urn:ietf:params:xml:ns:yang:iana-routing-types"; + prefix iana-rt-types; + + organization + "IANA"; + contact + "Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States of America + Tel: +1 310 301 5800 + "; + + description + "This module contains a collection of YANG data types + considered defined by IANA and used for routing + protocols. + + Copyright (c) 2017 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8294; see + the RFC itself for full legal notices."; + + revision 2025-02-18 { + description "Modified SAFI value 73."; + } + + revision 2022-08-19 { + description "Added SAFI value 85."; + } + + revision 2022-04-13 { + description "Added SAFI values 83 and 84."; + } + + revision 2022-02-11 { + description "Added SAFI value 80."; + } + + revision 2021-10-19 { + description "Added Address Family Number value 16399."; + } + + revision 2021-09-08 { + description "Added SAFI value 79."; + } + + revision 2021-05-26 { + description "Added ‘OBSOLETE’ to description field for SAFI value 7."; + } + + revision 2021-05-18 { + description "Added Address Family Number value 31, + SAFI value 9."; + } + + revision 2021-03-23 { + description "Added SAFI value 78."; + } + + revision 2020-12-31 { + description "Non-backwards-compatible change of SAFI names + (SAFI values 133, 134)."; + reference + "RFC 8955: Dissemination of Flow Specification Rules."; + } + + revision 2020-11-19 { + description "Added SAFI value 77."; + } + + revision 2020-07-02 { + description "Added SAFI value 76."; + } + + revision 2020-05-12 { + description "Added Address Family Number value 16398, + SAFI value 75."; + } + + revision 2019-11-04 { + description "Added Address Family Number value 16397."; + } + + revision 2018-10-29 { + description "Added SAFI value 74."; + } + + revision 2017-12-04 { + description "Initial revision."; + reference + "RFC 8294: Common YANG Data Types for the Routing Area. + Section 4."; + } + + + + + /*** Collection of IANA types related to routing ***/ + /*** IANA Address Family enumeration ***/ + + typedef address-family { + type enumeration { + enum ipv4 { + value 1; + description + "IPv4 Address Family."; + } + + enum ipv6 { + value 2; + description + "IPv6 Address Family."; + } + + enum nsap { + value 3; + description + "OSI Network Service Access Point (NSAP) Address Family."; + } + + enum hdlc { + value 4; + description + "High-Level Data Link Control (HDLC) Address Family."; + } + + enum bbn1822 { + value 5; + description + "Bolt, Beranek, and Newman Report 1822 (BBN 1822) + Address Family."; + } + + enum ieee802 { + value 6; + description + "IEEE 802 Committee Address Family + (aka Media Access Control (MAC) address)."; + } + + enum e163 { + value 7; + description + "ITU-T E.163 Address Family."; + } + enum e164 { + value 8; + description + "ITU-T E.164 (Switched Multimegabit Data Service (SMDS), + Frame Relay, ATM) Address Family."; + } + + enum f69 { + value 9; + description + "ITU-T F.69 (Telex) Address Family."; + } + + enum x121 { + value 10; + description + "ITU-T X.121 (X.25, Frame Relay) Address Family."; + } + + enum ipx { + value 11; + description + "Novell Internetwork Packet Exchange (IPX) + Address Family."; + } + + enum appletalk { + value 12; + description + "Apple AppleTalk Address Family."; + } + + enum decnet-iv { + value 13; + description + "Digital Equipment DECnet Phase IV Address Family."; + } + + enum vines { + value 14; + description + "Banyan Vines Address Family."; + } + + + + + + enum e164-nsap { + value 15; + description + "ITU-T E.164 with NSAP sub-address Address Family."; + } + + enum dns { + value 16; + description + "Domain Name System (DNS) Address Family."; + } + + enum distinguished-name { + value 17; + description + "Distinguished Name Address Family."; + } + + enum as-num { + value 18; + description + "Autonomous System (AS) Number Address Family."; + } + + enum xtp-v4 { + value 19; + description + "Xpress Transport Protocol (XTP) over IPv4 + Address Family."; + } + + enum xtp-v6 { + value 20; + description + "XTP over IPv6 Address Family."; + } + + enum xtp-native { + value 21; + description + "XTP native mode Address Family."; + } + + enum fc-port { + value 22; + description + "Fibre Channel (FC) World-Wide Port Name Address Family."; + } + enum fc-node { + value 23; + description + "FC World-Wide Node Name Address Family."; + } + + enum gwid { + value 24; + description + "ATM Gateway Identifier (GWID) Number Address Family."; + } + + enum l2vpn { + value 25; + description + "Layer 2 VPN (L2VPN) Address Family."; + } + + enum mpls-tp-section-eid { + value 26; + description + "MPLS Transport Profile (MPLS-TP) Section Endpoint + Identifier Address Family."; + } + + enum mpls-tp-lsp-eid { + value 27; + description + "MPLS-TP Label Switched Path (LSP) Endpoint Identifier + Address Family."; + } + + enum mpls-tp-pwe-eid { + value 28; + description + "MPLS-TP Pseudowire Endpoint Identifier Address Family."; + } + + enum mt-v4 { + value 29; + description + "Multi-Topology IPv4 Address Family."; + } + + + + + + enum mt-v6 { + value 30; + description + "Multi-Topology IPv6 Address Family."; + } + + enum bgp-sfc { + value 31; + description + "BGP SFC Address Family."; + reference + "RFC 9015: BGP Control Plane for the Network Service Header in Service Function Chaining."; + } + + enum eigrp-common-sf { + value 16384; + description + "Enhanced Interior Gateway Routing Protocol (EIGRP) + Common Service Family Address Family."; + } + + enum eigrp-v4-sf { + value 16385; + description + "EIGRP IPv4 Service Family Address Family."; + } + + enum eigrp-v6-sf { + value 16386; + description + "EIGRP IPv6 Service Family Address Family."; + } + + enum lcaf { + value 16387; + description + "Locator/ID Separation Protocol (LISP) + Canonical Address Format (LCAF) Address Family."; + } + + enum bgp-ls { + value 16388; + description + "Border Gateway Protocol - Link State (BGP-LS) + Address Family."; + } + + enum mac-48 { + value 16389; + description + "IEEE 48-bit MAC Address Family."; + } + + + + + enum mac-64 { + value 16390; + description + "IEEE 64-bit MAC Address Family."; + } + + enum trill-oui { + value 16391; + description + "Transparent Interconnection of Lots of Links (TRILL) + IEEE Organizationally Unique Identifier (OUI) + Address Family."; + } + + enum trill-mac-24 { + value 16392; + description + "TRILL final 3 octets of 48-bit MAC Address Family."; + } + + enum trill-mac-40 { + value 16393; + description + "TRILL final 5 octets of 64-bit MAC Address Family."; + } + + enum ipv6-64 { + value 16394; + description + "First 8 octets (64 bits) of IPv6 address + Address Family."; + } + + enum trill-rbridge-port-id { + value 16395; + description + "TRILL Routing Bridge (RBridge) Port ID Address Family."; + } + + enum trill-nickname { + value 16396; + description + "TRILL Nickname Address Family."; + } + + enum universally-unique-identifier { + value 16397; + description + "Universally Unique Identifier (UUID)."; + } + + enum routing-policy { + value 16398; + description + "Routing Policy Address Family."; + } + + enum mpls-namespaces { + value 16399; + description + "MPLS Namespaces Address Family."; + } + + } + + + + description + "Enumeration containing all the IANA-defined + Address Families."; + + } + + /*** Subsequent Address Family Identifiers (SAFIs) ***/ + /*** for multiprotocol BGP enumeration ***/ + + typedef bgp-safi { + type enumeration { + enum unicast-safi { + value 1; + description + "Unicast SAFI."; + } + + enum multicast-safi { + value 2; + description + "Multicast SAFI."; + } + + enum labeled-unicast-safi { + value 4; + description + "Labeled Unicast SAFI."; + } + + enum multicast-vpn-safi { + value 5; + description + "Multicast VPN SAFI."; + } + + enum pseudowire-safi { + value 6; + description + "Multi-segment Pseudowire VPN SAFI."; + } + + enum tunnel-encap-safi { + value 7; + description + "Tunnel Encap SAFI (OBSOLETE)."; + } + + + enum mcast-vpls-safi { + value 8; + description + "Multicast Virtual Private LAN Service (VPLS) SAFI."; + } + + enum bgp-sfc-safi { + value 9; + description + "BGP SFC SAFI."; + reference + "RFC 9015: BGP Control Plane for the Network Service Header in Service Function Chaining."; + } + + enum tunnel-safi { + value 64; + description + "Tunnel SAFI."; + } + + enum vpls-safi { + value 65; + description + "VPLS SAFI."; + } + + enum mdt-safi { + value 66; + description + "Multicast Distribution Tree (MDT) SAFI."; + } + + enum v4-over-v6-safi { + value 67; + description + "IPv4 over IPv6 SAFI."; + } + + enum v6-over-v4-safi { + value 68; + description + "IPv6 over IPv4 SAFI."; + } + + enum l1-vpn-auto-discovery-safi { + value 69; + description + "Layer 1 VPN Auto-Discovery SAFI."; + } + + enum evpn-safi { + value 70; + description + "Ethernet VPN (EVPN) SAFI."; + } + + enum bgp-ls-safi { + value 71; + description + "BGP-LS SAFI."; + } + + enum bgp-ls-vpn-safi { + value 72; + description + "BGP-LS VPN SAFI."; + } + + enum sr-policy-safi { + value 73; + description + "SR Policy SAFI."; + } + + enum sd-wan-capabilities-safi { + value 74; + description + "SD-WAN Capabilities SAFI."; + } + + enum routing-policy-safi { + value 75; + description + "Routing Policy SAFI."; + } + + enum classful-transport-safi { + value 76; + description + "Classful-Transport SAFI."; + } + + enum tunneled-traffic-flowspec-safi { + value 77; + description + "Tunneled Traffic Flowspec SAFI."; + } + + enum mcast-tree-safi { + value 78; + description + "MCAST-TREE SAFI."; + } + + enum bgp-dps-safi { + value 79; + description + "BGP-DPS (Dynamic Path Selection) SAFI."; + } + + enum bgp-ls-spf-safi { + value 80; + description + "BGP-LS-SPF SAFI."; + } + + enum bgp-car-safi { + value 83; + description + "BGP CAR SAFI."; + } + + enum bgp-vpn-car-safi { + value 84; + description + "BGP VPN CAR SAFI."; + } + + enum bgp-mup-safi { + value 85; + description + "BGP-MUP SAFI."; + } + + enum labeled-vpn-safi { + value 128; + description + "MPLS Labeled VPN SAFI."; + } + + enum multicast-mpls-vpn-safi { + value 129; + description + "Multicast for BGP/MPLS IP VPN SAFI."; + } + + enum route-target-safi { + value 132; + description + "Route Target SAFI."; + } + + enum flow-spec-safi { + value 133; + description + "Dissemination of Flow Specification rules SAFI."; + } + + enum l3vpn-flow-spec-safi { + value 134; + description + "L3VPN Dissemination of Flow Specification rules SAFI."; + } + + enum vpn-auto-discovery-safi { + value 140; + description + "VPN Auto-Discovery SAFI."; + } + } + description + "Enumeration for BGP SAFI."; + reference + "RFC 4760: Multiprotocol Extensions for BGP-4."; + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang deleted file mode 100644 index 222066adf..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2023-10-23.yang +++ /dev/null @@ -1,1004 +0,0 @@ - module ietf-eth-tran-service { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-service"; - - prefix "ethtsvc"; - import ietf-yang-types { - prefix "yang"; - reference "RFC 6991 - Common YANG Data Types"; - } - - import ietf-network { - prefix "nw"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-te-types { - prefix "te-types"; - reference "RFC 8776 - Traffic Engineering Common YANG Types"; - } - - import ietf-eth-tran-types { - prefix "etht-types"; - reference "RFC XXXX - A YANG Data Model for Transport - Network Client Signals"; - } - - import ietf-routing-types { - prefix "rt-types"; - reference "RFC 8294 - Common YANG Data Types for the - Routing Area"; - - } - - import ietf-te { - prefix "te"; - reference "RFC YYYY - A YANG Data Model for Traffic - Engineering Tunnels and Interfaces"; - } - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - WG List: - - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Italo Busi (italo.busi@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Anton Snitser (antons@sedonasys.com);0 - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (xufeng.liu.ietf@gmail.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com) - "; - - description - "This module defines a YANG data model for describing - the Ethernet services. The model fully conforms to the - Network Management Datastore Architecture (NMDA). - - Copyright (c) 2021 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -04 as an WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Groupings - */ - - grouping vlan-classification { - description - "A grouping which represents classification - on an 802.1Q VLAN tag."; - - leaf tag-type { - type etht-types:eth-tag-classify; - description - "The tag type used for VLAN classification."; - } - choice individual-bundling-vlan { - description - "VLAN based classification can be individual - or bundling."; - - case individual-vlan { - leaf vlan-value { - type etht-types:vlanid; - description - "VLAN ID value."; - } - } - - case vlan-bundling { - leaf vlan-range { - type etht-types:vid-range-type; - description - "List of VLAN ID values."; - } - } - } - } - - grouping vlan-write { - description - "A grouping which represents push/pop operations - of an 802.1Q VLAN tag."; - - leaf tag-type { - type etht-types:eth-tag-type; - description - "The VLAN tag type to push/swap."; - } - leaf vlan-value { - type etht-types:vlanid; - description - "The VLAN ID value to push/swap."; - } - /* - * To be added: this attribute is used when: - * a) the ETH service has only one CoS (as in current version) - * b) as a default when a mapping between a given CoS value - * and the PCP value is not defined (in future versions) - */ - leaf default-pcp { - type uint8 { - range "0..7"; - } - description - "The default Priority Code Point (PCP) value to push/swap"; - } - } - - grouping vlan-operations { - description - "A grouping which represents VLAN operations."; - - leaf pop-tags { - type uint8 { - range "1..2"; - } - description - "The number of VLAN tags to pop (or swap if used in - conjunction with push-tags)"; - } - container push-tags { - description - "The VLAN tags to push (or swap if used in - conjunction with pop-tags)"; - - container outer-tag { - presence - "Indicates existence of the outermost VLAN tag to - push/swap"; - - description - "The outermost VLAN tag to push/swap."; - - uses vlan-write; - } - container second-tag { - must - '../outer-tag/tag-type = "etht-types:s-vlan-tag-type" and ' + - 'tag-type = "etht-types:c-vlan-tag-type"' - { - - error-message - " - When pushing/swapping two tags, the outermost tag must - be specified and of S-VLAN type and the second - outermost tag must be of C-VLAN tag type. - "; - description - " - For IEEE 802.1Q interoperability, when pushing/swapping - two tags, it is required that the outermost tag exists - and is an S-VLAN, and the second outermost tag is a - C-VLAN. - "; - } - - presence - "Indicates existence of a second outermost VLAN tag to - push/swap"; - - description - "The second outermost VLAN tag to push/swap."; - uses vlan-write; - } - } - } - - grouping named-or-value-bandwidth-profile { - description - "A grouping to configure a bandwdith profile either by - referencing a named bandwidth profile or by - configuring the values of the bandwidth profile attributes."; - choice style { - description - "Whether the bandwidth profile is named or defined by value"; - - case named { - description - "Named bandwidth profile."; - leaf bandwidth-profile-name { - type leafref { - path "/ethtsvc:etht-svc/ethtsvc:globals/" - + "ethtsvc:named-bandwidth-profiles/" - + "ethtsvc:bandwidth-profile-name"; - } - description - "Name of the bandwidth profile."; - } - } - case value { - description - "Bandwidth profile configured by value."; - uses etht-types:etht-bandwidth-profiles; - } - } - } - - grouping bandwidth-profiles { - description - "A grouping which represent bandwidth profile configuration."; - - choice direction { - description - "Whether the bandwidth profiles are symmetrical or - asymmetrical"; - case symmetrical { - description - "The same bandwidth profile is used to describe both - the ingress and the egress bandwidth profile."; - container ingress-egress-bandwidth-profile { - description - "The bandwdith profile used in both directions."; - uses named-or-value-bandwidth-profile; - } - } - case asymmetrical { - description - "Ingress and egress bandwidth profiles can be specified."; - container ingress-bandwidth-profile { - description - "The bandwdith profile used in the ingress direction."; - uses named-or-value-bandwidth-profile; - } - container egress-bandwidth-profile { - description - "The bandwdith profile used in the egress direction."; - uses named-or-value-bandwidth-profile; - } - } - } - } - - grouping etht-svc-access-parameters { - description - "ETH services access parameters"; - - leaf access-node-id { - type te-types:te-node-id; - description - "The identifier of the access node in - the ETH TE topology."; - } - - leaf access-node-uri { - type nw:node-id; - description - "The identifier of the access node in the network."; - } - - leaf access-ltp-id { - type te-types:te-tp-id; - description - "The TE link termination point identifier, used - together with access-node-id to identify the - access LTP."; - } - - leaf access-ltp-uri { - type nt:tp-id; - description - "The link termination point identifier in network topology, - used together with access-node-uri to identify the - access LTP."; - } - - leaf access-role { - type identityref { - base etht-types:access-role; - } - description - "Indicate the role of access, e.g., working or protection. "; - } - - container pm-config { - uses pm-config-grouping; - description - "This grouping is used to set the threshold value for - performance monitoring. "; - } - - container state { - config false; - description - "The state is used to monitor the status of service. "; - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - description - "Indicating the operational state of client signal. "; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - description - "Indicating the provisional state of client signal, - especially when there is a change, i.e., revise, create. "; - } - } - - leaf performance { - type identityref { - base etht-types:performance; - } - config false; - description - "Performance Monitoring for the service. "; - } - - } - - grouping etht-svc-tunnel-parameters { - description - "ETH services tunnel parameters."; - choice technology { - description - "Service multiplexing is optional and flexible."; - - case native-ethernet { - /* - placeholder to support proprietary multiplexing - (for further discussion) - */ - list eth-tunnels { - key name; - description - "ETH Tunnel list in native Ethernet scenario."; - uses tunnels-grouping; - } - } - - case frame-base { - list otn-tunnels { - key name; - description - "OTN Tunnel list in Frame-based scenario."; - uses tunnels-grouping; - } - } - - case mpls-tp { - container pw { - description - "Pseudowire information for Ethernet over MPLS-TP."; - uses pw-segment-grouping; - } - } - } - - /* - * Open issue: can we constraints it to be used only with mp services? - */ - leaf src-split-horizon-group { - type string; - description - "Identify a split horizon group at the Tunnel source TTP"; - } - leaf dst-split-horizon-group { - type string; - description - "Identify a split horizon group at the Tunnel destination TTP"; - } - } - - grouping etht-svc-pm-threshold-config { - description - "Configuraiton parameters for Ethernet service PM thresholds."; - - leaf sending-rate-high { - type uint64; - description - "High threshold of packet sending rate in kbps."; - } - leaf sending-rate-low { - type uint64; - description - "Low threshold of packet sending rate in kbps."; - } - leaf receiving-rate-high { - type uint64; - description - "High threshold of packet receiving rate in kbps."; - } - leaf receiving-rate-low { - type uint64; - description - "Low threshold of packet receiving rate in kbps."; - } - } - - grouping etht-svc-pm-stats { - description - "Ethernet service PM statistics."; - - leaf sending-rate-too-high { - type uint32; - description - "Counter that indicates the number of times the - sending rate is above the high threshold"; - } - leaf sending-rate-too-low { - type uint32; - description - "Counter that indicates the number of times the - sending rate is below the low threshold"; - } - leaf receiving-rate-too-high { - type uint32; - description - "Counter that indicates the number of times the - receiving rate is above the high threshold"; - } - leaf receiving-rate-too-low { - type uint32; - description - "Counter that indicates the number of times the - receiving rate is below the low threshold"; - } - } - - grouping etht-svc-instance-config { - description - "Configuraiton parameters for Ethernet services."; - - leaf etht-svc-name { - type string; - description - "Name of the ETH service."; - } - - leaf etht-svc-title { - type string; - description - "The Identifier of the ETH service."; - } - - leaf user-label { - type string; - description - "Alias of the ETH service."; - } - - leaf etht-svc-descr { - type string; - description - "Description of the ETH service."; - } - - leaf etht-svc-customer { - type string; - description - "Customer of the ETH service."; - } - - leaf etht-svc-type { - type etht-types:service-type; - description - "Type of ETH service (p2p, mp2mp or rmp)."; - /* Add default as p2p */ - } - - leaf etht-svc-lifecycle { - type etht-types:lifecycle-status; - description - "Lifecycle state of ETH service."; - /* Add default as installed */ - } - uses te-types:te-topology-identifier; - - uses resilience-grouping; - list etht-svc-end-points { - key etht-svc-end-point-name; - description - "The logical end point for the ETH service. "; - uses etht-svc-end-point-grouping; - } - - container alarm-shreshold { - description "threshold configuration for the E2E client signal"; - uses alarm-shreshold-grouping; - } - - container underlay { - description - "The unterlay tunnel information that carrying the - ETH service. "; - uses etht-svc-tunnel-parameters; - } - - leaf admin-status { - type identityref { - base te-types:tunnel-admin-state-type; - } - default te-types:tunnel-admin-state-up; - description "ETH service administrative state."; - } - } - - grouping etht-svc-instance-state { - description - "State parameters for Ethernet services."; - - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - default te-types:tunnel-state-up; - description "ETH service operational state."; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - description "ETH service provisioning state."; - } - leaf creation-time { - type yang:date-and-time; - description - "Time of ETH service creation."; - } - leaf last-updated-time { - type yang:date-and-time; - description - "Time of ETH service last update."; - } - - leaf created-by { - type string; - description - "The client signal is created by whom, - can be a system or staff ID."; - } - leaf last-updated-by { - type string; - description - "The client signal is last updated by whom, - can be a system or staff ID."; - } - leaf owned-by { - type string; - description - "The client signal is last updated by whom, - can be a system ID."; - } - container pm-state { - description - "PM data of E2E Ethernet service"; - uses pm-state-grouping; - } - container error-info { - description "error messages of configuration"; - uses error-info-grouping; - } - } - - grouping pm-state-grouping { - leaf latency { - description - "latency value of the E2E Ethernet service"; - type uint32; - units microsecond; - } - } - - grouping error-info-grouping { - leaf error-code { - description "error code"; - type uint16; - } - - leaf error-description { - description "detail message of error"; - type string; - } - - leaf error-timestamp { - description "the date and time error is happened"; - type yang:date-and-time; - } - } - - grouping alarm-shreshold-grouping { - leaf latency-threshold { - description "a threshold for the E2E client signal service's - latency. Once the latency value exceed this threshold, an alarm - should be triggered."; - type uint32; - units microsecond; - } - } - - /* - * Data nodes - */ - - container etht-svc { - description - "ETH services."; - - container globals { - description - "Globals Ethernet configuration data container"; - list named-bandwidth-profiles { - key bandwidth-profile-name; - description - "List of named bandwidth profiles used by - Ethernet services."; - - leaf bandwidth-profile-name { - type string; - description - "Name of the bandwidth profile."; - } - uses etht-types:etht-bandwidth-profiles; - } - } - list etht-svc-instances { - key etht-svc-name; - description - "The list of p2p ETH service instances"; - - uses etht-svc-instance-config; - - container state { - config false; - description - "Ethernet Service states."; - - uses etht-svc-instance-state; - } - } - } - - grouping resilience-grouping { - description - "Grouping for resilience configuration. "; - container resilience { - description - "To configure the data plane protection parameters, - currently a placeholder only, future candidate attributes - include, Revert, WTR, Hold-off Timer, ..."; - uses te:protection-restoration-properties; - } - } - - grouping etht-svc-end-point-grouping { - description - "Grouping for the end point configuration."; - leaf etht-svc-end-point-name { - type string; - description - "The name of the logical end point of ETH service. "; - } - - leaf etht-svc-end-point-id { - type string; - description - "The identifier of the logical end point of ETH service."; - } - - leaf etht-svc-end-point-descr { - type string; - description - "The description of the logical end point of ETH service. "; - } - - leaf topology-role { - type identityref { - base etht-types:topology-role; - } - description - "Indicating the underlay topology role, - e.g., hub,spoke, any-to-any "; - } - - container resilience { - description - "Placeholder for resilience configuration, for future study. "; - } - - list etht-svc-access-points { - key access-point-id; - min-elements "1"; - /* - Open Issue: - Is it possible to limit the max-elements only for p2p services? - max-elements "2"; - */ - description - "List of the ETH trasport services access point instances."; - - leaf access-point-id { - type string; - description - "ID of the service access point instance"; - } - uses etht-svc-access-parameters; - } - - leaf service-classification-type { - type identityref { - base etht-types:service-classification-type; - } - description - "Service classification type."; - } - - choice service-classification { - description - "Access classification can be port-based or - VLAN based."; - case port-classification { - /* no additional information */ - } - - case vlan-classification { - container outer-tag { - presence "The outermost VLAN tag exists"; - description - "Classifies traffic using the outermost VLAN tag."; - - uses vlan-classification; - } - container second-tag { - must - '../outer-tag/tag-type = "etht-types:classify-s-vlan" and ' + - 'tag-type = "etht-types:classify-c-vlan"' - { - error-message - " - When matching two tags, the outermost tag must be - specified and of S-VLAN type and the second - outermost tag must be of C-VLAN tag type. - "; - description - " - For IEEE 802.1Q interoperability, when matching two - tags, it is required that the outermost tag exists - and is an S-VLAN, and the second outermost tag is a - C-VLAN. - "; - } - presence "The second outermost VLAN tag exists"; - - description - "Classifies traffic using the second outermost VLAN tag."; - - uses vlan-classification; - } - } - } - - /* - * Open issue: can we constraints it to be used only with mp services? - */ - leaf split-horizon-group { - type string; - description "Identify a split horizon group"; - } - uses bandwidth-profiles; - - container vlan-operations { - description - "Configuration of VLAN operations."; - choice direction { - description - "Whether the VLAN operations are symmetrical or - asymmetrical"; - case symmetrical { - container symmetrical-operation { - uses vlan-operations; - description - "Symmetrical operations. - Expressed in the ingress direction, but - the reverse operation is applied to egress traffic"; - } - } - case asymmetrical { - container asymmetrical-operation { - description "Asymmetrical operations"; - container ingress { - uses vlan-operations; - description "Ingress operations"; - } - container egress { - uses vlan-operations; - description "Egress operations"; - } - } - } - } - } - } - - grouping pm-config-grouping { - description - "Grouping used for Performance Monitoring Configuration. "; - leaf pm-enable { - type boolean; - description - "Whether to enable the performance monitoring."; - } - - leaf sending-rate-high { - type uint64; - description - "The upperbound of sending rate."; - } - - leaf sending-rate-low { - type uint64; - description - "The lowerbound of sending rate."; - } - - leaf receiving-rate-high { - type uint64; - description - "The upperbound of receiving rate."; - } - - leaf receiving-rate-low { - type uint64; - description - "The lowerbound of receiving rate."; - } - } - - grouping pw-segment-grouping { - description - "Grouping used for PW configuration. "; - leaf pw-id { - type string; - description - "The Identifier information of pseudowire. "; - } - - leaf pw-name { - type string; - description - "The name information of pseudowire."; - } - - leaf transmit-label { - type rt-types:mpls-label; - description - "Transmit label information in PW. "; - } - - leaf receive-label { - type rt-types:mpls-label; - description - "Receive label information in PW. "; - } - leaf encapsulation-type { - type identityref { - base etht-types:encapsulation-type; - } - description - "The encapsulation type, raw or tag. "; - } - - leaf oper-status { - type identityref { - base te-types:tunnel-state-type; - } - config false; - description - "The operational state of the PW segment. "; - } - - container ingress-bandwidth-profile { - description - "Bandwidth Profile for ingress. "; - uses pw-segment-named-or-value-bandwidth-profile; - } - - list pw-paths { - key path-id; - description - "A list of pw paths. "; - - leaf path-id { - type uint8; - description - "The identifier of pw paths. "; - - } - - list tp-tunnels { - key name; - description - "Names of TP Tunnel underlay"; - leaf name { - type string; - description - "Names of TP Tunnel underlay"; - } - } - } - - } - grouping pw-segment-named-or-value-bandwidth-profile { - description - "A grouping to configure a bandwdith profile either by - referencing a named bandwidth profile or by - configuring the values of the bandwidth profile attributes."; - choice style { - description - "Whether the bandwidth profile is named or defined by value"; - case named { - description - "Named bandwidth profile."; - leaf bandwidth-profile-name { - type leafref { - path "/ethtsvc:etht-svc/ethtsvc:globals/" - + "ethtsvc:named-bandwidth-profiles/" - + "ethtsvc:bandwidth-profile-name"; - } - description - "Name of the bandwidth profile."; - } - } - case value { - description - "Bandwidth profile configured by value."; - uses etht-types:pw-segement-bandwidth-profile-grouping; - } - } - } - - grouping tunnels-grouping { - description - "A group of tunnels. "; - leaf name { - type leafref { - path "/te:te/te:tunnels/te:tunnel/te:name"; - require-instance false; - } - description "Dependency tunnel name"; - } - leaf encoding { - type identityref { - base te-types:lsp-encoding-types; - } - description "LSP encoding type"; - reference "RFC3945"; - } - leaf switching-type { - type identityref { - base te-types:switching-capabilities; - } - description "LSP switching type"; - reference "RFC3945"; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang new file mode 100644 index 000000000..d1207fd7c --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-eth-tran-service@2024-01-11.yang @@ -0,0 +1,987 @@ +module ietf-eth-tran-service { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-service"; + prefix etht-svc; + + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + + import ietf-routing-types { + prefix rt-types; + reference + "RFC 8294: Common YANG Data Types for the Routing Area"; + } + + import ietf-te-types { + prefix te-types; + reference "RFCYYYY: Traffic Engineering Common YANG Types"; + } + // RFC Editor: replace YYYY with the actual RFC number assigned + // to the RFC once draft-ietf-teas-rfc8776-update + // becomes an RFC, update date information and remove this note. + + import ietf-network { + prefix nw; + reference + "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix "nt"; + reference + "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-te { + prefix "te"; + reference + "RFCKKKK: A YANG Data Model for Traffic Engineering Tunnels + and Interfaces"; + } + // RFC Editor: replace KKKK with the actual RFC number assigned + // to the RFC once draft-ietf-teas-yang-te + // becomes an RFC, update date information and remove this note. + + import ietf-eth-tran-types { + prefix etht-types; + reference + "RFCXXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a YANG data model for describing + Ethernet transport network client services. + + The model fully conforms to the Network Management + Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Groupings + */ + + grouping vlan-classification { + description + "A grouping which represents classification + on an 802.1Q VLAN tag."; + + leaf tag-type { + type etht-types:eth-tag-classify; + description + "The tag type used for VLAN classification."; + } + choice individual-bundling-vlan { + description + "VLAN based classification can be individual + or bundling."; + + case individual-vlan { + leaf vlan-value { + type etht-types:vlanid; + description + "VLAN ID value."; + } + } + case vlan-bundling { + leaf vlan-range { + type etht-types:vid-range-type; + description + "List of VLAN ID values."; + } + } + } + } + + grouping vlan-write { + description + "A grouping which represents push/pop operations + of an 802.1Q VLAN tag."; + + leaf tag-type { + type etht-types:eth-tag-type; + description + "The VLAN tag type to push/swap."; + } + leaf vlan-value { + type etht-types:vlanid; + description + "The VLAN ID value to push/swap."; + } +/* + * To be added: this attribute is used when: + * a) the ETH service has only one CoS (as in current version) + * b) as a default when a mapping between a given CoS value + * and the PCP value is not defined (in future versions) + */ + leaf default-pcp { + type uint8 { + range "0..7"; + } + description + "The default Priority Code Point (PCP) value to push/swap"; + } + } + + grouping vlan-operations { + description + "A grouping which represents VLAN operations."; + + leaf pop-tags { + type uint8 { + range "1..2"; + } + description + "The number of VLAN tags to pop (or swap if used in + conjunction with push-tags)"; + } + container push-tags { + description + "The VLAN tags to push (or swap if used in + conjunction with pop-tags)"; + container outer-tag { + presence + "Indicates existence of the outermost VLAN tag to + push/swap"; + description + "The outermost VLAN tag to push/swap."; + uses vlan-write; + } + container second-tag { + must + '../outer-tag/tag-type = "etht-types:s-vlan-tag-type" and ' + + 'tag-type = "etht-types:c-vlan-tag-type"' + { + error-message + " + When pushing/swapping two tags, the outermost tag must + be specified and of S-VLAN type and the second + outermost tag must be of C-VLAN tag type. + "; + description + " + For IEEE 802.1Q interoperability, when pushing/swapping + two tags, it is required that the outermost tag exists + and is an S-VLAN, and the second outermost tag is a + C-VLAN. + "; + } + presence + "Indicates existence of a second outermost VLAN tag to + push/swap"; + description + "The second outermost VLAN tag to push/swap."; + uses vlan-write; + } + } + } + + grouping named-or-value-bandwidth-profile { + description + "A grouping to configure a bandwdith profile either by + referencing a named bandwidth profile or by + configuring the values of the bandwidth profile attributes."; + choice style { + description + "Whether the bandwidth profile is named or defined by value"; + case named { + description + "Named bandwidth profile."; + leaf bandwidth-profile-name { + type leafref { + path "/etht-svc:etht-svc/etht-svc:globals/" + + "etht-svc:named-bandwidth-profiles/" + + "etht-svc:bandwidth-profile-name"; + } + description + "Name of the bandwidth profile."; + } + } + case value { + description + "Bandwidth profile configured by value."; + uses etht-types:etht-bandwidth-profiles; + } + } + } + + grouping bandwidth-profiles { + description + "A grouping which represent bandwidth profile configuration."; + + choice direction { + description + "Whether the bandwidth profiles are symmetrical or + asymmetrical"; + case symmetrical { + description + "The same bandwidth profile is used to describe both + the ingress and the egress bandwidth profile."; + container ingress-egress-bandwidth-profile { + description + "The bandwdith profile used in both directions."; + uses named-or-value-bandwidth-profile; + } + } + case asymmetrical { + description + "Ingress and egress bandwidth profiles can be specified."; + container ingress-bandwidth-profile { + description + "The bandwdith profile used in the ingress direction."; + uses named-or-value-bandwidth-profile; + } + container egress-bandwidth-profile { + description + "The bandwdith profile used in the egress direction."; + uses named-or-value-bandwidth-profile; + } + } + } + } + + grouping etht-svc-access-parameters { + description + "ETH services access parameters"; + + leaf access-node-id { + type te-types:te-node-id; + description + "The identifier of the access node in + the ETH TE topology."; + } + leaf access-node-uri { + type nw:node-id; + description + "The identifier of the access node in the network."; + } + leaf access-ltp-id { + type te-types:te-tp-id; + description + "The TE link termination point identifier, used + together with access-node-id to identify the + access LTP."; + } + leaf access-ltp-uri { + type nt:tp-id; + description + "The link termination point identifier in network topology, + used together with access-node-uri to identify the + access LTP."; + } + leaf access-role { + type identityref { + base etht-types:access-role; + } + description + "Indicate the role of access, e.g., working or protection. "; + } + container pm-config { + uses pm-config-grouping; + description + "This grouping is used to set the threshold value for + performance monitoring. "; + } + container state { + config false; + description + "The state is used to monitor the status of service. "; + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + description + "Indicating the operational state of client signal. "; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + description + "Indicating the provisional state of client signal, + especially when there is a change, i.e., revise, create. "; + } + } + leaf performance { + type identityref { + base etht-types:performance; + } + config false; + description + "Performance Monitoring for the service. "; + } + } + + grouping etht-svc-tunnel-parameters { + description + "ETH services tunnel parameters."; + + choice technology { + description + "Service multiplexing is optional and flexible."; + case native-ethernet { + /* + placeholder to support proprietary multiplexing + (for further discussion) + */ + list eth-tunnels { + key name; + description + "ETH Tunnel list in native Ethernet scenario."; + uses tunnels-grouping; + } + } + case frame-base { + list otn-tunnels { + key name; + description + "OTN Tunnel list in Frame-based scenario."; + uses tunnels-grouping; + } + } + case mpls-tp { + container pw { + description + "Pseudowire information for Ethernet over MPLS-TP."; + uses pw-segment-grouping; + } + } + } + /* + * Open issue: + * can we constraints it to be used only with mp services? + */ + leaf src-split-horizon-group { + type string; + description + "Identify a split horizon group at the source Tunnel + Termination Point (TTP)."; + } + leaf dst-split-horizon-group { + type string; + description + "Identify a split horizon group at the destination Tunnel + Termination Point (TTP)."; + } + } + + grouping etht-svc-pm-threshold-config { + description + "Configuraiton parameters for Ethernet service PM thresholds."; + + leaf sending-rate-high { + type uint64; + description + "High threshold of packet sending rate in kbps."; + } + leaf sending-rate-low { + type uint64; + description + "Low threshold of packet sending rate in kbps."; + } + leaf receiving-rate-high { + type uint64; + description + "High threshold of packet receiving rate in kbps."; + } + leaf receiving-rate-low { + type uint64; + description + "Low threshold of packet receiving rate in kbps."; + } + } + + grouping etht-svc-pm-stats { + description + "Ethernet service PM statistics."; + + leaf sending-rate-too-high { + type uint32; + description + "Counter that indicates the number of times the + sending rate is above the high threshold"; + } + leaf sending-rate-too-low { + type uint32; + description + "Counter that indicates the number of times the + sending rate is below the low threshold"; + } + leaf receiving-rate-too-high { + type uint32; + description + "Counter that indicates the number of times the + receiving rate is above the high threshold"; + } + leaf receiving-rate-too-low { + type uint32; + description + "Counter that indicates the number of times the + receiving rate is below the low threshold"; + } + } + + grouping etht-svc-instance-config { + description + "Configuraiton parameters for Ethernet services."; + + leaf etht-svc-name { + type string; + description + "Name of the ETH service."; + } + leaf etht-svc-title { + type string; + description + "The Identifier of the ETH service."; + } + leaf user-label { + type string; + description + "Alias of the ETH service."; + } + leaf etht-svc-descr { + type string; + description + "Description of the ETH service."; + } + leaf etht-svc-customer { + type string; + description + "Customer of the ETH service."; + } + leaf etht-svc-type { + type etht-types:service-type; + description + "Type of ETH service (p2p, mp2mp or rmp)."; + /* Add default as p2p */ + } + leaf etht-svc-lifecycle { + type etht-types:lifecycle-status; + description + "Lifecycle state of ETH service."; + /* Add default as installed */ + } + uses te-types:te-topology-identifier; + uses resilience-grouping; + list etht-svc-end-points { + key etht-svc-end-point-name; + description + "The logical end point for the ETH service. "; + uses etht-svc-end-point-grouping; + } + container alarm-threshold { + description + "threshold configuration for the E2E client signal"; + uses alarm-threshold-grouping; + } + container underlay { + description + "The unterlay tunnel information that carrying the + ETH service. "; + uses etht-svc-tunnel-parameters; + } + leaf admin-status { + type identityref { + base te-types:tunnel-admin-state-type; + } + default te-types:tunnel-admin-state-up; + description "ETH service administrative state."; + } + } + + grouping etht-svc-instance-state { + description + "State parameters for Ethernet services."; + + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + default te-types:tunnel-state-up; + description + "ETH service operational state."; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + description + "ETH service provisioning state."; + } + leaf creation-time { + type yang:date-and-time; + description + "Time of ETH service creation."; + } + leaf last-updated-time { + type yang:date-and-time; + description + "Time of ETH service last update."; + } + leaf created-by { + type string; + description + "The client signal is created by whom, + can be a system or staff ID."; + } + leaf last-updated-by { + type string; + description + "The client signal is last updated by whom, + can be a system or staff ID."; + } + leaf owned-by { + type string; + description + "The client signal is last updated by whom, + can be a system ID."; + } + container pm-state { + description + "PM data of E2E Ethernet service"; + uses pm-state-grouping; + } + container error-info { + description "error messages of configuration"; + uses error-info-grouping; + } + } + + grouping pm-state-grouping { + description + "Performance Monitoring (PM) state attributes"; + leaf latency { + type uint32; + units microsecond; + description + "latency value of the E2E Ethernet service"; + } + } + + grouping error-info-grouping { + description + "Error information parameters"; + + leaf error-code { + type uint16; + description "error code"; + } + leaf error-description { + type string; + description "detail message of error"; + } + leaf error-timestamp { + type yang:date-and-time; + description "the date and time error is happened"; + } + } + + grouping alarm-threshold-grouping { + description + "Alarm threshold parameters."; + leaf latency-threshold { + type uint32; + units microsecond; + description + "a threshold for the E2E client signal service's + latency. Once the latency value exceed this threshold, + an alarm should be triggered."; + } + } + + grouping resilience-grouping { + description + "Grouping for resilience configuration. "; + container resilience { + description + "To configure the data plane protection parameters, + currently a placeholder only, future candidate attributes + include, Revert, WTR, Hold-off Timer, ..."; + uses te:protection-restoration-properties; + } + } + + grouping etht-svc-end-point-grouping { + description + "Grouping for the end point configuration."; + + leaf etht-svc-end-point-name { + type string; + description + "The name of the logical end point of ETH service. "; + } + leaf etht-svc-end-point-id { + type string; + description + "The identifier of the logical end point of ETH service."; + } + leaf etht-svc-end-point-descr { + type string; + description + "The description of the logical end point of ETH service. "; + } + leaf topology-role { + type identityref { + base etht-types:topology-role; + } + description + "Indicating the underlay topology role, + e.g., hub,spoke, any-to-any "; + } + container resilience { + description + "Placeholder for resilience configuration, for future + study."; + } + list etht-svc-access-points { + key access-point-id; + min-elements "1"; + /* + Open Issue: + Is it possible to limit the max-elements only for p2p + services? + max-elements "2"; + */ + description + "List of the ETH trasport services access point instances."; + leaf access-point-id { + type string; + description + "ID of the service access point instance"; + } + uses etht-svc-access-parameters; + } + leaf service-classification-type { + type identityref { + base etht-types:service-classification-type; + } + description + "Service classification type."; + } + choice service-classification { + description + "Access classification can be port-based or + VLAN based."; + case port-classification { + /* no additional information */ + } + case vlan-classification { + container outer-tag { + presence "The outermost VLAN tag exists"; + description + "Classifies traffic using the outermost VLAN tag."; + uses vlan-classification; + } + container second-tag { + must + '../outer-tag/tag-type = "etht-types:classify-s-vlan"' + + ' and tag-type = "etht-types:classify-c-vlan"' + { + error-message + " + When matching two tags, the outermost tag must be + specified and of S-VLAN type and the second + outermost tag must be of C-VLAN tag type. + "; + description + " + For IEEE 802.1Q interoperability, when matching two + tags, it is required that the outermost tag exists + and is an S-VLAN, and the second outermost tag is a + C-VLAN. + "; + } + presence "The second outermost VLAN tag exists"; + description + "Classifies traffic using the second outermost VLAN + tag."; + uses vlan-classification; + } + } + } + /* + * Open issue: + * can we constraints it to be used only with mp services? + */ + leaf split-horizon-group { + type string; + description "Identify a split horizon group"; + } + uses bandwidth-profiles; + container vlan-operations { + description + "Configuration of VLAN operations."; + choice direction { + description + "Whether the VLAN operations are symmetrical or + asymmetrical"; + case symmetrical { + container symmetrical-operation { + uses vlan-operations; + description + "Symmetrical operations. + Expressed in the ingress direction, but + the reverse operation is applied to egress traffic"; + } + } + case asymmetrical { + container asymmetrical-operation { + description "Asymmetrical operations"; + container ingress { + uses vlan-operations; + description "Ingress operations"; + } + container egress { + uses vlan-operations; + description "Egress operations"; + } + } + } + } + } + } + + grouping pm-config-grouping { + description + "Grouping used for Performance Monitoring Configuration. "; + + leaf pm-enable { + type boolean; + description + "Whether to enable the performance monitoring."; + } + leaf sending-rate-high { + type uint64; + description + "The upperbound of sending rate."; + } + leaf sending-rate-low { + type uint64; + description + "The lowerbound of sending rate."; + } + leaf receiving-rate-high { + type uint64; + description + "The upperbound of receiving rate."; + } + leaf receiving-rate-low { + type uint64; + description + "The lowerbound of receiving rate."; + } + } + + grouping pw-segment-grouping { + description + "Grouping used for PW configuration. "; + + leaf pw-id { + type string; + description + "The Identifier information of pseudowire. "; + } + leaf pw-name { + type string; + description + "The name information of pseudowire."; + } + leaf transmit-label { + type rt-types:mpls-label; + description + "Transmit label information in PW. "; + } + leaf receive-label { + type rt-types:mpls-label; + description + "Receive label information in PW. "; + } + leaf encapsulation-type { + type identityref { + base etht-types:encapsulation-type; + } + description + "The encapsulation type, raw or tag. "; + } + leaf oper-status { + type identityref { + base te-types:tunnel-state-type; + } + config false; + description + "The operational state of the PW segment. "; + } + container ingress-bandwidth-profile { + description + "Bandwidth Profile for ingress. "; + uses pw-segment-named-or-value-bandwidth-profile; + } + list pw-paths { + key path-id; + description + "A list of pw paths. "; + leaf path-id { + type uint8; + description + "The identifier of pw paths. "; + } + list tp-tunnels { + key name; + description + "Names of TP Tunnel underlay"; + leaf name { + type string; + description + "Names of TP Tunnel underlay"; + } + } + } + } + + grouping pw-segment-named-or-value-bandwidth-profile { + description + "A grouping to configure a bandwdith profile either by + referencing a named bandwidth profile or by + configuring the values of the bandwidth profile attributes."; + + choice style { + description + "Whether the bandwidth profile is named or defined by value"; + case named { + description + "Named bandwidth profile."; + leaf bandwidth-profile-name { + type leafref { + path "/etht-svc:etht-svc/etht-svc:globals/" + + "etht-svc:named-bandwidth-profiles/" + + "etht-svc:bandwidth-profile-name"; + } + description + "Name of the bandwidth profile."; + } + } + case value { + description + "Bandwidth profile configured by value."; + uses etht-types:pw-segement-bandwidth-profile-grouping; + } + } + } + + grouping tunnels-grouping { + description + "A group of tunnels. "; + leaf name { + type leafref { + path "/te:te/te:tunnels/te:tunnel/te:name"; + require-instance false; + } + description "Dependency tunnel name"; + } + leaf encoding { + type identityref { + base te-types:lsp-encoding-types; + } + description "LSP encoding type"; + reference "RFC3945"; + } + leaf switching-type { + type identityref { + base te-types:switching-capabilities; + } + description "LSP switching type"; + reference "RFC3945"; + } + } + + /* + * Data nodes + */ + + container etht-svc { + description + "ETH services."; + + container globals { + description + "Globals Ethernet configuration data container"; + list named-bandwidth-profiles { + key bandwidth-profile-name; + description + "List of named bandwidth profiles used by + Ethernet services."; + + leaf bandwidth-profile-name { + type string; + description + "Name of the bandwidth profile."; + } + uses etht-types:etht-bandwidth-profiles; + } + } + list etht-svc-instances { + key etht-svc-name; + description + "The list of p2p ETH service instances"; + + uses etht-svc-instance-config; + container state { + config false; + description + "Ethernet Service states."; + uses etht-svc-instance-state; + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang deleted file mode 100644 index f46908b34..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2023-10-23.yang +++ /dev/null @@ -1,457 +0,0 @@ - module ietf-eth-tran-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-types"; - - prefix "etht-types"; - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - WG List: - - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Italo Busi (italo.busi@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (xufeng.liu.ietf@gmail.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com) - "; - - description - "This module defines the ETH types. - The model fully conforms to the Network Management - Datastore Architecture (NMDA). - - Copyright (c) 2019 IETF Trust and the persons - identified as authors of the code. All rights reserved. - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -05 as a WG draft"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Identities - */ - - identity eth-vlan-tag-type { - description - "ETH VLAN tag type."; - } - - identity c-vlan-tag-type { - base eth-vlan-tag-type; - description - "802.1Q Customer VLAN"; - } - - identity s-vlan-tag-type { - base eth-vlan-tag-type; - description - "802.1Q Service VLAN (QinQ)"; - } - - identity service-classification-type { - description - "Service classification."; - } - - identity port-classification { - base service-classification-type; - description - "Port classification."; - } - identity vlan-classification { - base service-classification-type; - description - "VLAN classification."; - } - - identity eth-vlan-tag-classify { - description - "VLAN tag classification."; - } - - identity classify-c-vlan { - base eth-vlan-tag-classify; - description - "Classify 802.1Q Customer VLAN tag. - Only C-tag type is accepted"; - } - - identity classify-s-vlan { - base eth-vlan-tag-classify; - description - "Classify 802.1Q Service VLAN (QinQ) tag. - Only S-tag type is accepted"; - } - - identity classify-s-or-c-vlan { - base eth-vlan-tag-classify; - description - "Classify S-VLAN or C-VLAN tag-classify. - Either tag is accepted"; - } - - identity bandwidth-profile-type-ir { - description - "Bandwidth Profile Types"; - } - - identity mef-10-bwp { - base bandwidth-profile-type-ir; - description - "MEF 10 Bandwidth Profile"; - } - - identity rfc-2697-bwp { - base bandwidth-profile-type-ir; - description - "RFC 2697 Bandwidth Profile"; - } - identity rfc-2698-bwp { - base bandwidth-profile-type-ir; - description - "RFC 2698 Bandwidth Profile"; - } - - identity rfc-4115-bwp { - base bandwidth-profile-type-ir; - description - "RFC 4115 Bandwidth Profile"; - } - - identity service-type-ir { - description - "Type of Ethernet service."; - } - - identity p2p-svc { - base service-type-ir; - description - "Ethernet point-to-point service (EPL, EVPL)."; - } - - identity rmp-svc { - base service-type-ir; - description - "Ethernet rooted-multitpoint service (E-TREE, EP-TREE)."; - } - - identity mp2mp-svc { - base service-type-ir; - description - "Ethernet multipoint-to-multitpoint service (E-LAN, EP-LAN)."; - } - - identity lifecycle-status-ir { - description - "Lifecycle Status."; - } - - identity installed { - base lifecycle-status-ir; - description - "Installed."; - } - - identity planned { - base lifecycle-status-ir; - description - "Planned."; - } - - identity pending-removal { - base lifecycle-status-ir; - description - "Pending Removal."; - } - - /* - * Type Definitions - */ - - typedef eth-tag-type { - type identityref { - base eth-vlan-tag-type; - } - description - "Identifies a specific ETH VLAN tag type."; - } - - typedef eth-tag-classify { - type identityref { - base eth-vlan-tag-classify; - } - description - "Identifies a specific VLAN tag classification."; - } - - typedef vlanid { - type uint16 { - range "1..4094"; - } - description - "The 12-bit VLAN-ID used in the VLAN Tag header."; - } - - typedef vid-range-type { - type string { - pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + - "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; - } - description - "A list of VLAN Ids, or non overlapping VLAN ranges, in - ascending order, between 1 and 4094. - This type is used to match an ordered list of VLAN Ids, or - contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the - range 1 to 4094, and included in the list in non overlapping - ascending order. - - For example: 1,10-100,50,500-1000"; - } - - typedef bandwidth-profile-type { - type identityref { - base bandwidth-profile-type-ir; - } - description - "Identifies a specific Bandwidth Profile type."; - } - - typedef service-type { - type identityref { - base service-type-ir; - } - description - "Identifies the type of Ethernet service."; - } - - typedef lifecycle-status { - type identityref { - base lifecycle-status-ir; - } - description - "Identifies the lLifecycle Status ."; - } - - /* - * Grouping Definitions - */ - - grouping etht-bandwidth-profiles { - description - "Bandwidth profile configuration paramters."; - - leaf bandwidth-profile-type { - type etht-types:bandwidth-profile-type; - description - "The type of bandwidth profile."; - } - leaf CIR { - type uint64; - description - "Committed Information Rate in Kbps"; - } - leaf CBS { - type uint64; - description - "Committed Burst Size in in KBytes"; - } - leaf EIR { - type uint64; - /* Need to indicate that EIR is not supported by RFC 2697 - - must - '../bw-profile-type = "mef-10-bwp" or ' + - '../bw-profile-type = "rfc-2698-bwp" or ' + - '../bw-profile-type = "rfc-4115-bwp"' - - must - '../bw-profile-type != "rfc-2697-bwp"' - */ - description - "Excess Information Rate in Kbps - In case of RFC 2698, PIR = CIR + EIR"; - } - leaf EBS { - type uint64; - description - "Excess Burst Size in KBytes. - In case of RFC 2698, PBS = CBS + EBS"; - } - leaf color-aware { - type boolean; - description - "Indicates weather the color-mode is - color-aware or color-blind."; - } - leaf coupling-flag { - type boolean; - /* Need to indicate that Coupling Flag is defined only for MEF 10 - - must - '../bw-profile-type = "mef-10-bwp"' - */ - description - "Coupling Flag."; - } - } - - identity topology-role { - description - "The role of underlay topology: e.g., hub, spoke, - any-to-any."; - } - - identity resilience { - description - "Placeholder for resilience information in data plane, - for future study. "; - } - - identity access-role { - description - "Indicating whether the access is a working or protection access."; - } - - identity root-primary { - base access-role; - description - "Designates the primary root UNI of an E-Tree service, and may also - designates the UNI access role of E-LINE and E-LAN service."; - } - - identity root-backup { - base access-role; - description - "Designates the backup root UNI of an E-Tree service."; - } - - identity leaf-access { - base access-role; - description - "Designates the leaf UNI of an E-Tree service."; - } - - identity leaf-edge { - base access-role; - description ""; - } - - identity performance { - description - "Placeholder for performance information, for future study."; - } - - identity encapsulation-type { - description - "Indicating how the service is encapsulated (to PW), e.g, raw or tag. "; - } - grouping pw-segement-bandwidth-profile-grouping { - description - "bandwidth profile grouping for PW segment. "; - leaf bandwidth-profile-type { - type etht-types:bandwidth-profile-type; - description - "The type of bandwidth profile."; - } - leaf CIR { - type uint64; - description - "Committed Information Rate in Kbps"; - } - leaf CBS { - type uint64; - description - "Committed Burst Size in in KBytes"; - } - leaf EIR { - type uint64; - /* Need to indicate that EIR is not supported by RFC 2697 - - must - '../bw-profile-type = "mef-10-bwp" or ' + - '../bw-profile-type = "rfc-2698-bwp" or ' + - '../bw-profile-type = "rfc-4115-bwp"' - - must - '../bw-profile-type != "rfc-2697-bwp"' - */ - description - "Excess Information Rate in Kbps - In case of RFC 2698, PIR = CIR + EIR"; - } - leaf EBS { - type uint64; - description - "Excess Burst Size in KBytes. - In case of RFC 2698, PBS = CBS + EBS"; - } - } - grouping eth-bandwidth { - description - "Available bandwith for ethernet."; - leaf eth-bandwidth { - type uint64{ - range "0..10000000000"; - } - units "Kbps"; - description - "Available bandwith value expressed in kilobits per second"; - } - } - - grouping eth-label-restriction { - description - "Label Restriction for ethernet."; - leaf tag-type { - type etht-types:eth-tag-type; - description "VLAN tag type."; - } - leaf priority { - type uint8; - description "priority."; - } - } - grouping eth-label { - description - "Label for ethernet."; - leaf vlanid { - type etht-types:vlanid; - description - "VLAN tag id."; - } - } - - grouping eth-label-step { - description "Label step for Ethernet VLAN"; - leaf eth-step { - type uint16 { - range "1..4095"; - } - default 1; - description - "Label step which represent possible increments for - an Ethernet VLAN tag."; - reference - "IEEE 802.1ad: Provider Bridges."; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang new file mode 100644 index 000000000..78c849d7b --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-eth-tran-types@2024-01-11.yang @@ -0,0 +1,470 @@ +module ietf-eth-tran-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-eth-tran-types"; + prefix etht-types; + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a collection of common YANG identity, data + type and grouping definitions for describing Ethernet transport + network clients. + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Identities + */ + + identity eth-vlan-tag-type { + description + "ETH VLAN tag type."; + } + + identity c-vlan-tag-type { + base eth-vlan-tag-type; + description + "802.1Q Customer VLAN"; + } + + identity s-vlan-tag-type { + base eth-vlan-tag-type; + description + "802.1Q Service VLAN (QinQ)"; + } + + identity service-classification-type { + description + "Service classification."; + } + + identity port-classification { + base service-classification-type; + description + "Port classification."; + } + + identity vlan-classification { + base service-classification-type; + description + "VLAN classification."; + } + + identity eth-vlan-tag-classify { + description + "VLAN tag classification."; + } + + identity classify-c-vlan { + base eth-vlan-tag-classify; + description + "Classify 802.1Q Customer VLAN tag. + Only C-tag type is accepted"; + } + + identity classify-s-vlan { + base eth-vlan-tag-classify; + description + "Classify 802.1Q Service VLAN (QinQ) tag. + Only S-tag type is accepted"; + } + + identity classify-s-or-c-vlan { + base eth-vlan-tag-classify; + description + "Classify S-VLAN or C-VLAN tag-classify. + Either tag is accepted"; + } + + identity bandwidth-profile-type { + description + "Bandwidth Profile Types"; + } + + identity mef-10-bwp { + base bandwidth-profile-type; + description + "MEF 10 Bandwidth Profile"; + } + + identity rfc-2697-bwp { + base bandwidth-profile-type; + description + "RFC 2697 Bandwidth Profile"; + } + + identity rfc-2698-bwp { + base bandwidth-profile-type; + description + "RFC 2698 Bandwidth Profile"; + } + + identity rfc-4115-bwp { + base bandwidth-profile-type; + description + "RFC 4115 Bandwidth Profile"; + } + + identity service-type { + description + "Type of Ethernet service."; + } + + identity p2p-svc { + base service-type; + description + "Ethernet point-to-point service (EPL, EVPL)."; + } + + identity rmp-svc { + base service-type; + description + "Ethernet rooted-multitpoint service (E-TREE, EP-TREE)."; + } + + identity mp2mp-svc { + base service-type; + description + "Ethernet multipoint-to-multitpoint service + (E-LAN, EP-LAN)."; + } + + identity lifecycle-status { + description + "Lifecycle Status."; + } + + identity installed { + base lifecycle-status; + description + "Installed."; + } + + identity planned { + base lifecycle-status; + description + "Planned."; + } + + identity pending-removal { + base lifecycle-status; + description + "Pending Removal."; + } + + identity topology-role { + description + "The role of underlay topology: e.g., hub, spoke, + any-to-any."; + } + + identity resilience { + description + "Placeholder for resilience information in data plane, + for future study. "; + } + + identity access-role { + description + "Indicating whether the access is a working or protection + access."; + } + + identity root-primary { + base access-role; + description + "Designates the primary root UNI of an E-Tree service, and + may also designates the UNI access role of E-LINE and E-LAN + service."; + } + + identity root-backup { + base access-role; + description + "Designates the backup root UNI of an E-Tree service."; + } + + identity leaf-access { + base access-role; + description + "Designates the leaf UNI of an E-Tree service."; + } + + identity performance { + description + "Placeholder for performance information, for future study."; + } + + identity encapsulation-type { + description + "Indicating how the service is encapsulated (to PW), e.g, raw or + tag. "; + } + + /* + * Data Types + */ + + typedef eth-tag-type { + type identityref { + base eth-vlan-tag-type; + } + description + "Identifies a specific ETH VLAN tag type."; + } + + typedef eth-tag-classify { + type identityref { + base eth-vlan-tag-classify; + } + description + "Identifies a specific VLAN tag classification."; + } + + typedef vlanid { + type uint16 { + range "1..4094"; + } + description + "The 12-bit VLAN-ID used in the VLAN Tag header."; + } + + typedef vid-range-type { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of VLAN Ids, or non overlapping VLAN ranges, in + ascending order, between 1 and 4094. + This type is used to match an ordered list of VLAN Ids, or + contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the + range 1 to 4094, and included in the list in non overlapping + ascending order. + + For example: 1,10-100,50,500-1000"; + } + + typedef bandwidth-profile-type { + type identityref { + base bandwidth-profile-type; + } + description + "Identifies a specific Bandwidth Profile type."; + } + + typedef service-type { + type identityref { + base service-type; + } + description + "Identifies the type of Ethernet service."; + } + + typedef lifecycle-status { + type identityref { + base lifecycle-status; + } + description + "Identifies the lLifecycle Status ."; + } + + /* + * Groupings + */ + + grouping etht-bandwidth-profiles { + description + "Bandwidth profile configuration paramters."; + + leaf bandwidth-profile-type { + type etht-types:bandwidth-profile-type; + description + "The type of bandwidth profile."; + } + leaf CIR { + type uint64; + description + "Committed Information Rate in Kbps"; + } + leaf CBS { + type uint64; + description + "Committed Burst Size in in KBytes"; + } + leaf EIR { + type uint64; + /* Need to indicate that EIR is not supported by RFC 2697 + + must + '../bw-profile-type = "mef-10-bwp" or ' + + '../bw-profile-type = "rfc-2698-bwp" or ' + + '../bw-profile-type = "rfc-4115-bwp"' + + must + '../bw-profile-type != "rfc-2697-bwp"' + */ + description + "Excess Information Rate in Kbps + In case of RFC 2698, PIR = CIR + EIR"; + } + leaf EBS { + type uint64; + description + "Excess Burst Size in KBytes. + In case of RFC 2698, PBS = CBS + EBS"; + } + leaf color-aware { + type boolean; + description + "Indicates weather the color-mode is + color-aware or color-blind."; + } + leaf coupling-flag { + type boolean; + /* Need to indicate that Coupling Flag is defined only for + MEF 10 + + must + '../bw-profile-type = "mef-10-bwp"' + */ + description + "Coupling Flag."; + } + } + + grouping pw-segement-bandwidth-profile-grouping { + description + "bandwidth profile grouping for PW segment."; + + leaf bandwidth-profile-type { + type etht-types:bandwidth-profile-type; + description + "The type of bandwidth profile."; + } + leaf CIR { + type uint64; + description + "Committed Information Rate in Kbps"; + } + leaf CBS { + type uint64; + description + "Committed Burst Size in in KBytes"; + } + leaf EIR { + type uint64; + /* Need to indicate that EIR is not supported by RFC 2697 + + must + '../bw-profile-type = "mef-10-bwp" or ' + + '../bw-profile-type = "rfc-2698-bwp" or ' + + '../bw-profile-type = "rfc-4115-bwp"' + + must + '../bw-profile-type != "rfc-2697-bwp"' + */ + description + "Excess Information Rate in Kbps + In case of RFC 2698, PIR = CIR + EIR"; + } + leaf EBS { + type uint64; + description + "Excess Burst Size in KBytes. + In case of RFC 2698, PBS = CBS + EBS"; + } + } + + grouping eth-bandwidth { + description + "Available bandwith for ethernet."; + leaf eth-bandwidth { + type uint64{ + range "0..10000000000"; + } + units "Kbps"; + description + "Available bandwith value expressed in kilobits per second"; + } + } + + grouping eth-label-restriction { + description + "Label Restriction for ethernet."; + leaf tag-type { + type etht-types:eth-tag-type; + description "VLAN tag type."; + } + leaf priority { + type uint8; + description "priority."; + } + } + + grouping eth-label { + description + "Label for ethernet."; + leaf vlanid { + type etht-types:vlanid; + description + "VLAN tag id."; + } + } + + grouping eth-label-step { + description "Label step for Ethernet VLAN"; + leaf eth-step { + type uint16 { + range "1..4095"; + } + default 1; + description + "Label step which represent possible increments for + an Ethernet VLAN tag."; + reference + "IEEE 802.1ad: Provider Bridges."; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang b/src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang deleted file mode 100644 index 790bafc31..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-inet-types@2013-07-15.yang +++ /dev/null @@ -1,459 +0,0 @@ - module ietf-inet-types { - - namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; - prefix "inet"; - - organization - "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; - - contact - "WG Web: - WG List: - - WG Chair: David Kessens - - - WG Chair: Juergen Schoenwaelder - - - Editor: Juergen Schoenwaelder - "; - - description - "This module contains a collection of generally useful derived - YANG data types for Internet addresses and related things. - - Copyright (c) 2013 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (http://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 6991; see - the RFC itself for full legal notices."; - - revision 2013-07-15 { - description - "This revision adds the following new data types: - - ip-address-no-zone - - ipv4-address-no-zone - - ipv6-address-no-zone"; - reference - "RFC 6991: Common YANG Data Types"; - } - - revision 2010-09-24 { - description - "Initial revision."; - reference - "RFC 6021: Common YANG Data Types"; - } - - /*** collection of types related to protocol fields ***/ - - typedef ip-version { - type enumeration { - enum unknown { - value "0"; - description - "An unknown or unspecified version of the Internet - protocol."; - } - enum ipv4 { - value "1"; - description - "The IPv4 protocol as defined in RFC 791."; - } - enum ipv6 { - value "2"; - description - "The IPv6 protocol as defined in RFC 2460."; - } - } - description - "This value represents the version of the IP protocol. - - In the value set and its semantics, this type is equivalent - to the InetVersion textual convention of the SMIv2."; - reference - "RFC 791: Internet Protocol - RFC 2460: Internet Protocol, Version 6 (IPv6) Specification - RFC 4001: Textual Conventions for Internet Network Addresses"; - } - - typedef dscp { - type uint8 { - range "0..63"; - } - description - "The dscp type represents a Differentiated Services Code Point - that may be used for marking packets in a traffic stream. - - In the value set and its semantics, this type is equivalent - to the Dscp textual convention of the SMIv2."; - reference - "RFC 3289: Management Information Base for the Differentiated - Services Architecture - RFC 2474: Definition of the Differentiated Services Field - (DS Field) in the IPv4 and IPv6 Headers - RFC 2780: IANA Allocation Guidelines For Values In - the Internet Protocol and Related Headers"; - } - - typedef ipv6-flow-label { - type uint32 { - range "0..1048575"; - } - description - "The ipv6-flow-label type represents the flow identifier or Flow - Label in an IPv6 packet header that may be used to - discriminate traffic flows. - - In the value set and its semantics, this type is equivalent - to the IPv6FlowLabel textual convention of the SMIv2."; - reference - "RFC 3595: Textual Conventions for IPv6 Flow Label - RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; - } - - typedef port-number { - type uint16 { - range "0..65535"; - } - description - "The port-number type represents a 16-bit port number of an - Internet transport-layer protocol such as UDP, TCP, DCCP, or - SCTP. Port numbers are assigned by IANA. A current list of - all assignments is available from . - - Note that the port number value zero is reserved by IANA. In - situations where the value zero does not make sense, it can - be excluded by subtyping the port-number type. - In the value set and its semantics, this type is equivalent - to the InetPortNumber textual convention of the SMIv2."; - reference - "RFC 768: User Datagram Protocol - RFC 793: Transmission Control Protocol - RFC 4960: Stream Control Transmission Protocol - RFC 4340: Datagram Congestion Control Protocol (DCCP) - RFC 4001: Textual Conventions for Internet Network Addresses"; - } - - /*** collection of types related to autonomous systems ***/ - - typedef as-number { - type uint32; - description - "The as-number type represents autonomous system numbers - which identify an Autonomous System (AS). An AS is a set - of routers under a single technical administration, using - an interior gateway protocol and common metrics to route - packets within the AS, and using an exterior gateway - protocol to route packets to other ASes. IANA maintains - the AS number space and has delegated large parts to the - regional registries. - - Autonomous system numbers were originally limited to 16 - bits. BGP extensions have enlarged the autonomous system - number space to 32 bits. This type therefore uses an uint32 - base type without a range restriction in order to support - a larger autonomous system number space. - - In the value set and its semantics, this type is equivalent - to the InetAutonomousSystemNumber textual convention of - the SMIv2."; - reference - "RFC 1930: Guidelines for creation, selection, and registration - of an Autonomous System (AS) - RFC 4271: A Border Gateway Protocol 4 (BGP-4) - RFC 4001: Textual Conventions for Internet Network Addresses - RFC 6793: BGP Support for Four-Octet Autonomous System (AS) - Number Space"; - } - - /*** collection of types related to IP addresses and hostnames ***/ - - typedef ip-address { - type union { - type inet:ipv4-address; - type inet:ipv6-address; - } - description - "The ip-address type represents an IP address and is IP - version neutral. The format of the textual representation - implies the IP version. This type supports scoped addresses - by allowing zone identifiers in the address format."; - reference - "RFC 4007: IPv6 Scoped Address Architecture"; - } - - typedef ipv4-address { - type string { - pattern - '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' - + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' - + '(%[\p{N}\p{L}]+)?'; - } - description - "The ipv4-address type represents an IPv4 address in - dotted-quad notation. The IPv4 address may include a zone - index, separated by a % sign. - - The zone index is used to disambiguate identical address - values. For link-local addresses, the zone index will - typically be the interface index number or the name of an - interface. If the zone index is not present, the default - zone of the device will be used. - - The canonical format for the zone index is the numerical - format"; - } - - typedef ipv6-address { - type string { - pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' - + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' - + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' - + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' - + '(%[\p{N}\p{L}]+)?'; - pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' - + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' - + '(%.+)?'; - } - description - "The ipv6-address type represents an IPv6 address in full, - mixed, shortened, and shortened-mixed notation. The IPv6 - address may include a zone index, separated by a % sign. - - The zone index is used to disambiguate identical address - values. For link-local addresses, the zone index will - typically be the interface index number or the name of an - interface. If the zone index is not present, the default - zone of the device will be used. - - The canonical format of IPv6 addresses uses the textual - representation defined in Section 4 of RFC 5952. The - canonical format for the zone index is the numerical - format as described in Section 11.2 of RFC 4007."; - reference - "RFC 4291: IP Version 6 Addressing Architecture - RFC 4007: IPv6 Scoped Address Architecture - RFC 5952: A Recommendation for IPv6 Address Text - Representation"; - } - - typedef ip-address-no-zone { - type union { - type inet:ipv4-address-no-zone; - type inet:ipv6-address-no-zone; - } - description - "The ip-address-no-zone type represents an IP address and is - IP version neutral. The format of the textual representation - implies the IP version. This type does not support scoped - addresses since it does not allow zone identifiers in the - address format."; - reference - "RFC 4007: IPv6 Scoped Address Architecture"; - } - - typedef ipv4-address-no-zone { - type inet:ipv4-address { - pattern '[0-9\.]*'; - } - description - "An IPv4 address without a zone index. This type, derived from - ipv4-address, may be used in situations where the zone is - known from the context and hence no zone index is needed."; - } - - typedef ipv6-address-no-zone { - type inet:ipv6-address { - pattern '[0-9a-fA-F:\.]*'; - } - description - "An IPv6 address without a zone index. This type, derived from - ipv6-address, may be used in situations where the zone is - known from the context and hence no zone index is needed."; - reference - "RFC 4291: IP Version 6 Addressing Architecture - RFC 4007: IPv6 Scoped Address Architecture - RFC 5952: A Recommendation for IPv6 Address Text - Representation"; - } - - typedef ip-prefix { - type union { - type inet:ipv4-prefix; - type inet:ipv6-prefix; - } - description - "The ip-prefix type represents an IP prefix and is IP - version neutral. The format of the textual representations - implies the IP version."; - } - - typedef ipv4-prefix { - type string { - pattern - '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' - + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' - + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; - } - description - "The ipv4-prefix type represents an IPv4 address prefix. - The prefix length is given by the number following the - slash character and must be less than or equal to 32. - - A prefix length value of n corresponds to an IP address - mask that has n contiguous 1-bits from the most - significant bit (MSB) and all other bits set to 0. - - The canonical format of an IPv4 prefix has all bits of - the IPv4 address set to zero that are not part of the - IPv4 prefix."; - } - - typedef ipv6-prefix { - type string { - pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' - + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' - + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' - + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' - + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; - pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' - + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' - + '(/.+)'; - } - - description - "The ipv6-prefix type represents an IPv6 address prefix. - The prefix length is given by the number following the - slash character and must be less than or equal to 128. - - A prefix length value of n corresponds to an IP address - mask that has n contiguous 1-bits from the most - significant bit (MSB) and all other bits set to 0. - - The IPv6 address should have all bits that do not belong - to the prefix set to zero. - - The canonical format of an IPv6 prefix has all bits of - the IPv6 address set to zero that are not part of the - IPv6 prefix. Furthermore, the IPv6 address is represented - as defined in Section 4 of RFC 5952."; - reference - "RFC 5952: A Recommendation for IPv6 Address Text - Representation"; - } - - /*** collection of domain name and URI types ***/ - - typedef domain-name { - type string { - pattern - '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' - + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' - + '|\.'; - length "1..253"; - } - description - "The domain-name type represents a DNS domain name. The - name SHOULD be fully qualified whenever possible. - - Internet domain names are only loosely specified. Section - 3.5 of RFC 1034 recommends a syntax (modified in Section - 2.1 of RFC 1123). The pattern above is intended to allow - for current practice in domain name use, and some possible - future expansion. It is designed to hold various types of - domain names, including names used for A or AAAA records - (host names) and other records, such as SRV records. Note - that Internet host names have a stricter syntax (described - in RFC 952) than the DNS recommendations in RFCs 1034 and - 1123, and that systems that want to store host names in - schema nodes using the domain-name type are recommended to - adhere to this stricter standard to ensure interoperability. - - The encoding of DNS names in the DNS protocol is limited - to 255 characters. Since the encoding consists of labels - prefixed by a length bytes and there is a trailing NULL - byte, only 253 characters can appear in the textual dotted - notation. - - The description clause of schema nodes using the domain-name - type MUST describe when and how these names are resolved to - IP addresses. Note that the resolution of a domain-name value - may require to query multiple DNS records (e.g., A for IPv4 - and AAAA for IPv6). The order of the resolution process and - which DNS record takes precedence can either be defined - explicitly or may depend on the configuration of the - resolver. - - Domain-name values use the US-ASCII encoding. Their canonical - format uses lowercase US-ASCII characters. Internationalized - domain names MUST be A-labels as per RFC 5890."; - reference - "RFC 952: DoD Internet Host Table Specification - RFC 1034: Domain Names - Concepts and Facilities - RFC 1123: Requirements for Internet Hosts -- Application - and Support - RFC 2782: A DNS RR for specifying the location of services - (DNS SRV) - RFC 5890: Internationalized Domain Names in Applications - (IDNA): Definitions and Document Framework"; - } - - typedef host { - type union { - type inet:ip-address; - type inet:domain-name; - } - description - "The host type represents either an IP address or a DNS - domain name."; - } - - typedef uri { - type string; - description - "The uri type represents a Uniform Resource Identifier - (URI) as defined by STD 66. - - Objects using the uri type MUST be in US-ASCII encoding, - and MUST be normalized as described by RFC 3986 Sections - 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary - percent-encoding is removed, and all case-insensitive - characters are set to lowercase except for hexadecimal - digits, which are normalized to uppercase as described in - Section 6.2.2.1. - - The purpose of this normalization is to help provide - unique URIs. Note that this normalization is not - sufficient to provide uniqueness. Two URIs that are - textually distinct after this normalization may still be - equivalent. - - Objects using the uri type may restrict the schemes that - they permit. For example, 'data:' and 'urn:' schemes - might not be appropriate. - - A zero-length URI is not a valid URI. This can be used to - express 'URI absent' where required. - - In the value set and its semantics, this type is equivalent - to the Uri SMIv2 textual convention defined in RFC 5017."; - reference - "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax - RFC 3305: Report from the Joint W3C/IETF URI Planning Interest - Group: Uniform Resource Identifiers (URIs), URLs, - and Uniform Resource Names (URNs): Clarifications - and Recommendations - RFC 5017: MIB Textual Conventions for Uniform Resource - Identifiers (URIs)"; - } - - } diff --git a/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang b/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang new file mode 100644 index 000000000..b28621b9f --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-inet-types@2025-06-23.yang @@ -0,0 +1,669 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF Network Modeling (NETMOD) Working Group"; + + contact + "WG Web: + WG List: + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2025 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; + see the RFC itself for full legal notices."; + + revision 2025-06-23 { + description + "This revision adds the following new data types: + - inet:ip-address-and-prefix + - inet:ipv4-address-and-prefix + - inet:ipv6-address-and-prefix + - inet:protocol-number + - inet:upper-layer-protocol-number + - inet:host-name + - inet:email-address + - inet:ip-address-link-local + - inet:ipv4-address-link-local + - inet:ipv6-address-link-local + The inet:host union was changed to use inet:host-name instead + of inet:domain-name. Several pattern statements have been + improved."; + reference + "RFC XXXX: Common YANG Data Types"; + } + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - inet:ip-address-no-zone + - inet:ipv4-address-no-zone + - inet:ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 8200."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or + Flow Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. + + Port numbers are assigned by IANA. The current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 9293: Transmission Control Protocol (TCP) + RFC 9260: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef protocol-number { + type uint8; + description + "The protocol-number type represents an 8-bit Internet + protocol number, carried in the 'protocol' field of the + IPv4 header or in the 'next header' field of the IPv6 + header. + + Protocol numbers are assigned by IANA. The current list of + all assignments is available from ."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef upper-layer-protocol-number { + type protocol-number; + description + "The upper-layer-protocol-number represents the upper-layer + protocol number carried in an IP packet. For IPv6 packets + with extension headers, this is the protocol number carried + in the last 'next header' field of the chain of IPv6 extension + headers."; + reference + "RFC 791: Internet Protocol + RFC 8200: Internet Protocol, Version 6 (IPv6) Specification"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type ipv4-address; + type ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%.+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. If a system uses zone names + that are not represented in UTF-8, then an implementation + needs to use some mechanism to transform the local name + into UTF-8. The definition of such a mechanism is outside + the scope of this document. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[A-Za-z0-9][A-Za-z0-9\-\._~/]*)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + If a system uses zone names that are not represented in + UTF-8, then an implementation needs to use some mechanism + to transform the local name into UTF-8. The definition of + such a mechanism is outside the scope of this document. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type ipv4-address-no-zone; + type ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived + from the type ipv4-address, may be used in situations where + the zone is known from the context and no zone index is + needed."; + } + + typedef ipv6-address-no-zone { + type ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived + from the type ipv6-address, may be used in situations where + the zone is known from the context and no zone index is + needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-link-local { + type union { + type ipv4-address-link-local; + type ipv6-address-link-local; + } + description + "The ip-address-link-local type represents a link-local IP + address and is IP version neutral. The format of the textual + representation implies the IP version."; + } + + typedef ipv4-address-link-local { + type ipv4-address { + pattern '169\.254\..*'; + } + description + "A link-local IPv4 address in the prefix 169.254.0.0/16 as + defined in section 2.1. of RFC 3927."; + reference + "RFC 3927: Dynamic Configuration of IPv4 Link-Local Addresses"; + } + + typedef ipv6-address-link-local { + type ipv6-address { + pattern '[fF][eE]80:.*'; + } + description + "A link-local IPv6 address in the prefix fe80::/10 as defined + in section 2.5.6. of RFC 4291."; + reference + "RFC 4291: IP Version 6 Addressing Architecture"; + } + + typedef ip-prefix { + type union { + type ipv4-prefix; + type ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix. + + The definition of ipv4-prefix does not require that bits, + which are not part of the prefix, are set to zero. However, + implementations have to return values in canonical format, + which requires non-prefix bits to be set to zero. This means + that 192.0.2.1/24 must be accepted as a valid value but it + will be converted into the canonical format 192.0.2.0/24."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952. + + The definition of ipv6-prefix does not require that bits, + which are not part of the prefix, are set to zero. However, + implementations have to return values in canonical format, + which requires non-prefix bits to be set to zero. This means + that 2001:db8::1/64 must be accepted as a valid value but it + will be converted into the canonical format 2001:db8::/64."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-and-prefix { + type union { + type ipv4-address-and-prefix; + type ipv6-address-and-prefix; + } + description + "The ip-address-and-prefix type represents an IP address and + prefix and is IP version neutral. The format of the textual + representations implies the IP version."; + } + + typedef ipv4-address-and-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-address-and-prefix type represents an IPv4 + address and an associated IPv4 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0."; + } + + typedef ipv6-address-and-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-address-and-prefix type represents an IPv6 + address and an associated IPv6 prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format requires that the IPv6 address is + represented as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + length "1..253"; + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. This + type does not support wildcards (see RFC 4592) or + classless in-addr.arpa delegations (see RFC 2317). + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. Note that Internet host names have a + stricter syntax (described in RFC 952) than the DNS + recommendations in RFCs 1034 and 1123. Schema nodes + representing host names should use the host-name type + instead of the domain-type. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2317: Classless IN-ADDR.ARPA delegation + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 4592: The Role of Wildcards in the Domain Name System + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework + RFC 9499: DNS Terminology"; + } + + typedef host-name { + type domain-name { + length "2..max"; + pattern '[a-zA-Z0-9\-\.]+'; + } + description + "The host-name type represents (fully qualified) host names. + Host names must be at least two characters long (see RFC 952) + and they are restricted to labels consisting of letters, digits + and hyphens separated by dots (see RFC1123 and RFC 952)."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1123: Requirements for Internet Hosts -- Application + and Support"; + } + + typedef host { + type union { + type ip-address; + type host-name; + } + description + "The host type represents either an IP address or a (fully + qualified) host name."; + } + + typedef uri { + type string { + pattern '[a-z][a-z0-9+.-]*:.*'; + } + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by the rule 'URI' in RFC 3986. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. Characters that can be + represented without using percent-encoding are represented + as characters (without percent-encoding), and all + case-insensitive characters are set to lowercase except + for hexadecimal digits within a percent-encoded triplet, + which are normalized to uppercase as described in + Section 6.2.2.1 of RFC 3986. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + + typedef email-address { + type string { + pattern '.+@.+'; + } + description + "The email-address type represents an internationalized + email address. + + The email address format is defined by the addr-spec + ABNF rule in RFC 5322 section 3.4.1. This format has + been extended by RFC 6532 to support internationalized + email addresses. Implementations MUST support the + internationalization extensions of RFC 6532. Support + of the obsolete obs-local-part, obs-domain, and + obs-qtext parts of RFC 5322 is not required. + + The domain part may use both A-labels and U-labels + (see RFC 5890). The canonical format of the domain part + uses lowercase characters and U-labels (RFC 5890) where + applicable."; + reference + "RFC 5322: Internet Message Format + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework + RFC 6531: SMTP Extension for Internationalized Email"; + } + +} \ No newline at end of file diff --git a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang deleted file mode 100644 index 188336931..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2022-10-14.yang +++ /dev/null @@ -1,1414 +0,0 @@ - module ietf-layer1-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-layer1-types"; - prefix "l1-types"; - - import ietf-routing-types { - prefix rt-types; - reference - "RFC 8294: Common YANG Data Types for the Routing Area"; - } - - organization - "IETF CCAMP Working Group"; - contact - "WG Web: - WG List: - - Editor: Haomian Zheng - - - Editor: Italo Busi - "; - - description - "This module defines Layer 1 types. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2022 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Revised BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices. - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - - - - - they appear in all capitals, as shown here."; - - revision "2022-10-14" { - description - "Initial Version"; - reference - "RFC XXXX: A YANG Data Model for Layer 1 Types"; - // RFC Editor: replace XXXX with actual RFC number, update date - // information and remove this note - } - - /* - * Identities - */ - - identity tributary-slot-granularity { - description - "Tributary Slot Granularity (TSG)"; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity tsg-1.25G { - base tributary-slot-granularity; - description - "1.25G tributary slot granularity"; - } - - identity tsg-2.5G { - base tributary-slot-granularity; - description - "2.5G tributary slot granularity"; - } - - identity tsg-5G { - base tributary-slot-granularity; - description - "5G tributary slot granularity"; - } - - identity odu-type { - description - "Base identity from which specific Optical Data Unit (ODU) - type is derived."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU0 { - base odu-type; - description - "ODU0 type (1.24Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU1 { - base odu-type; - description - "ODU1 type (2.49Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU2 { - base odu-type; - description - "ODU2 type (10.03Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU2e { - base odu-type; - description - "ODU2e type (10.39Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU3 { - base odu-type; - description - "ODU3 type (40.31Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODU4 { - base odu-type; - description - "ODU4 type (104.79Gb/s)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODUflex { - base odu-type; - description - "ODUflex type (flexible bit rate, not resizable). - - It could be used for any type of ODUflex, including - ODUflex(CBR), ODUflex(GFP), ODUflex(GFP,n,k), ODUflex(IMP,s), - ODUflex(IMP) and ODUflex(FlexE-aware)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ODUflex-resizable { - base odu-type; - description - "ODUflex protocol (flexible bit rate, resizable). - - - - - It could be used only for ODUflex(GFP,n,k)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity protocol { - description - "Base identity from which specific protocol is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity Ethernet { - base protocol; - description - "Ethernet protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity Fibre-Channel { - base protocol; - description - "Fibre-Channel (FC) protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SDH { - base protocol; - description - "SDH protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SONET { - base protocol; - description - "SONET protocol."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - - - - identity client-signal { - description - "Base identity from which specific Constant Bit Rate (CBR) - client signal is derived"; - } - - identity coding-func { - description - "Base identity from which specific coding function - is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-1Gb { - base client-signal; - description - "Client signal type of 1GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-10Gb-LAN { - base client-signal; - description - "Client signal type of ETH-10Gb-LAN (10.3 Gb/s)"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet"; - } - - identity ETH-10Gb-WAN { - base client-signal; - description - "Client signal type of ETH-10Gb-WAN (9.95 Gb/s)"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - - - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet"; - } - - identity ETH-40Gb { - base client-signal; - description - "Client signal type of 40GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-100Gb { - base client-signal; - description - "Client signal type of 100GbE"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity STM-1 { - base client-signal; - base coding-func; - description - "Client signal type of STM-1; - STM-1 G.707 (N=1) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-4 { - base client-signal; - - - - - base coding-func; - description - "Client signal type of STM-4; - STM-4 G.707 (N=4) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-16 { - base client-signal; - base coding-func; - description - "Client signal type of STM-16; - STM-16 G.707 (N=16) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-64 { - base client-signal; - base coding-func; - description - "Client signal type of STM-64; - STM-64 G.707 (N=64) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity STM-256 { - base client-signal; - - - - - base coding-func; - description - "Client signal type of STM-256; - STM-256 G.707 (N=256) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-3 { - base client-signal; - base coding-func; - description - "Client signal type of OC3; - OC-3 GR-253-CORE (N=3) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-12 { - base client-signal; - base coding-func; - description - "Client signal type of OC12; - OC-12 GR-253-CORE (N=12) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-48 { - base client-signal; - base coding-func; - description - "Client signal type of OC48; - OC-48 GR-253-CORE (N=48) coding function."; - - - - - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-192 { - base client-signal; - base coding-func; - description - "Client signal type of OC192; - OC-192 GR-253-CORE (N=192) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity OC-768 { - base client-signal; - base coding-func; - description - "Client signal type of OC768; - OC-768 GR-253-CORE (N=768) coding function."; - reference - "ANSI T1.105-1995: Synchronous Optical Network (SONET) - Basic Description including Multiplex Structure, Rates, - and Formats - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-100 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-100; - FC-100 FC-FS-2 (1.0625 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-200; - FC-200 FC-FS-2 (2.125 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-400 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-400; - FC-400 FC-FS-2 (4.250 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-800 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-800; - FC-800 FC-FS-2 (8.500 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-1200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-1200; - FC-1200 FC-10GFC (10.51875 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-1600 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-1600; - FC-1600 FC-FS-3 (14.025 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FC-3200 { - base client-signal; - base coding-func; - description - "Client signal type of Fibre Channel FC-3200; - FC-3200 FC-FS-4 (28.05 Gb/s) coding function."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN) - - - - - MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FICON-4G { - base client-signal; - description - "Client signal type of Fibre Connection 4G"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity FICON-8G { - base client-signal; - description - "Client signal type of Fibre Connection 8G"; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks - - ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - - identity ETH-1000X { - base coding-func; - description - "1000BASE-X PCS clause 36 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-10GW { - base coding-func; - description - "10GBASE-W (WAN PHY) PCS clause 49 and WIS clause 50 - coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-10GR { - base coding-func; - description - "10GBASE-R (LAN PHY) PCS clause 49 coding function."; - - - - - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-40GR { - base coding-func; - description - "40GBASE-R PCS clause 82 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ETH-100GR { - base coding-func; - description - "100GBASE-R PCS clause 82 coding function."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity optical-interface-func { - description - "Base identity from which optical-interface-function - is derived."; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity SX-PMD-1000 { - base optical-interface-func; - description - "SX-PMD-clause-38 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LX-PMD-1000 { - base optical-interface-func; - description - "LX-PMD-clause-38 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LX10-PMD-1000 { - base optical-interface-func; - - - - - description - "LX10-PMD-clause-59 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity BX10-PMD-1000 { - base optical-interface-func; - description - "BX10-PMD-clause-59 Optical Interface function for - 1000BASE-X PCS-36"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LW-PMD-10G { - base optical-interface-func; - description - "LW-PMD-clause-52 Optical Interface function for - 10GBASE-W PCS-49-WIS-50"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity EW-PMD-10G { - base optical-interface-func; - description - "EW-PMD-clause-52 Optical Interface function for - 10GBASE-W PCS-49-WIS-50"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR-PMD-10G { - base optical-interface-func; - description - "LR-PMD-clause-52 Optical Interface function for - 10GBASE-R PCS-49"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER-PMD-10G { - base optical-interface-func; - description - "ER-PMD-clause-52 Optical Interface function for - 10GBASE-R PCS-49"; - - - - - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR4-PMD-40G { - base optical-interface-func; - description - "LR4-PMD-clause-87 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER4-PMD-40G { - base optical-interface-func; - description - "ER4-PMD-clause-87 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity FR-PMD-40G { - base optical-interface-func; - description - "FR-PMD-clause-89 Optical Interface function for - 40GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity LR4-PMD-100G { - base optical-interface-func; - description - "LR4-PMD-clause-88 Optical Interface function for - 100GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - identity ER4-PMD-100G { - base optical-interface-func; - description - "ER4-PMD-clause-88 Optical Interface function for - 100GBASE-R PCS-82"; - reference - "MEF63: Subscriber Layer 1 Service Attributes"; - } - - - - - /* - * Typedefs - */ - - typedef otn-tpn { - type uint16 { - range "1..4095"; - } - description - "Tributary Port Number (TPN) for OTN. "; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks."; - } - - typedef otn-ts { - type uint16 { - range "1..4095"; - } - description - "Tributary Slot (TS) for OTN."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of Evolving - G.709 Optical Transport Networks."; - } - - typedef otn-label-range-type { - type enumeration { - enum trib-slot { - description - "Defines a range of OTN tributary slots (TS)."; - } - enum trib-port { - description - "Defines a range of OTN tributary ports (TPN)."; - } - } - description - "Defines the type of OTN label range: TS or TPN. "; - } - - typedef gfp-k { - type enumeration { - enum 2 { - description - "The ODU2.ts rate (1,249,177.230 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,2). "; - } - - - - - enum 3 { - description - "The ODU3.ts rate (1,254,470.354 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,3). "; - } - enum 4 { - description - "The ODU4.ts rate (1,301,467.133 kbit/s) is used - to compute the rate of an ODUflex(GFP,n,4). "; - } - } - description - "The ODUk.ts used to compute the rate of an ODUflex(GFP,n,k)"; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-8 and L.7: Interfaces for - the Optical Transport Network (OTN)"; - } - - typedef flexe-client-rate { - type union { - type uint16; - type enumeration { - enum "10G" { - description - "Represents a 10G FlexE Client signal (s=2)"; - } - enum "40G" { - description - "Represents a 40G FlexE Client signal (s=8)"; - } - } - } - description - "The FlexE Client signal rate (s x 5,156,250.000 kbit/s) - used to compute the rate of an ODUflex(IMP, s). - Valid values for s are s=2 (10G), s=4 (40G) and - s=5 x n (n x 25G). - In the first two cases an enumeration value - (either 10G or 40G) is used, while in the latter case - the value of n is used"; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the - Optical Transport Network (OTN)"; - } - - typedef odtu-flex-type { - type enumeration { - enum "2" { - - - - - description - "The ODTU2.ts ODTU type."; - } - enum "3" { - description - "The ODTU3.ts ODTU type."; - } - enum "4" { - description - "The ODTU4.ts ODTU type."; - } - enum "Cn" { - description - "The ODTUCn.ts ODTU type."; - } - } - description - "The type of Optical Data Tributary Unit (ODTU), - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by an ODUflex LSP, according to - the (19-1a) and (20-1a) formulas defined in G.709."; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-7, clause 19.6 and - clause 20.5: Interfaces for the Optical Transport - Network (OTN)"; - } - - typedef bandwidth-scientific-notation { - type string { - pattern - '0(\.0?)?([eE](\+)?0?)?|' - + '[1-9](\.[0-9]{0,6})?[eE](\+)?(9[0-6]|[1-8][0-9]|0?[0-9])?'; - } - units "bps"; - description - "Bandwidth values, expressed using the scientific notation - in bits per second. - - The encoding format is the external decimal-significant - character sequences specified in IEEE 754 and ISO/IEC C99 - for 32-bit decimal floating-point numbers: - (-1)**(S) * 10**(Exponent) * (Significant), - where Significant uses 7 digits. - - An implementation for this representation MAY use decimal32 - or binary32. The range of the Exponent is from -95 to +96 - for decimal32, and from -38 to +38 for binary32. - As a bandwidth value, the format is restricted to be - - - - - normalized, non-negative, and non-fraction: - n.dddddde{+}dd, N.DDDDDDE{+}DD, 0e0 or 0E0, - where 'd' and 'D' are decimal digits; 'n' and 'N' are - non-zero decimal digits; 'e' and 'E' indicate a power of ten. - Some examples are 0e0, 1e10, and 9.953e9."; - reference - "IEEE Std 754-2008: IEEE Standard for Floating-Point - Arithmetic. - ISO/IEC C99: Information technology - Programming - Languages - C."; - } - - /* - * Groupings - */ - - grouping otn-link-bandwidth { - description - "Bandwidth attributes for OTN links"; - container otn { - description - "Bandwidth attributes for OTN links"; - list odulist { - key "odu-type"; - description - "OTN bandwidth definition"; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - leaf number { - type uint16; - description "Number of ODUs"; - } - leaf ts-number { - when 'derived-from-or-self(../odu-type,"ODUflex") or - derived-from-or-self(../odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - type uint16 { - range "1..4095"; - } - description - - - - - "The number of Tributary Slots (TS) that - could be used by all the ODUflex LSPs."; - } - } - } - } - - grouping otn-path-bandwidth { - description - "Bandwidth attributes for OTN paths."; - container otn { - description - "Bandwidth attributes for OTN paths."; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - choice oduflex-type { - when 'derived-from-or-self(./odu-type,"ODUflex") or - derived-from-or-self(./odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - description - "Types of ODUflex used to compute the ODUflex - nominal bit rate."; - reference - "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the - Optical Transport Network (OTN)"; - case generic { - leaf nominal-bit-rate { - type union { - type l1-types:bandwidth-scientific-notation; - type rt-types:bandwidth-ieee-float32; - } - mandatory true; - description - "Nominal ODUflex bit rate."; - } - } - case cbr { - leaf client-type { - type identityref { - base client-signal; - - - - - } - mandatory true; - description - "The type of Constant Bit Rate (CBR) client signal - of an ODUflex(CBR)."; - } - } - case gfp-n-k { - leaf gfp-n { - type uint8 { - range "1..80"; - } - mandatory true; - description - "The value of n for an ODUflex(GFP,n,k)."; - reference - "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: - Interfaces for the Optical Transport Network (OTN)"; - } - leaf gfp-k { - type gfp-k; - description - "The value of k for an ODUflex(GFP,n,k). - - If omitted, it is calculated from the value of gfp-n - as described in Table 7-8 of G.709"; - reference - "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: - Interfaces for the Optical Transport Network (OTN)"; - } - } - case flexe-client { - leaf flexe-client { - type flexe-client-rate; - mandatory true; - description - "The rate of the FlexE-client for an ODUflex(IMP,s)."; - } - } - case flexe-aware { - leaf flexe-aware-n { - type uint16; - mandatory true; - description - "The rate of FlexE-aware client signal - for ODUflex(FlexE-aware)"; - } - } - - - - - case packet { - leaf opuflex-payload-rate { - type union { - type l1-types:bandwidth-scientific-notation; - type rt-types:bandwidth-ieee-float32; - } - mandatory true; - description - "Either the GFP-F encapsulated packet client nominal - bit rate for an ODUflex(GFP) or the 64b/66b encoded - packet client nominal bit rate for an ODUflex(IMP)."; - } - } - } - } - } - - grouping otn-max-path-bandwidth { - description - "Maximum bandwidth attributes for OTN paths."; - container otn { - description - "Maximum bandwidth attributes for OTN paths."; - leaf odu-type { - type identityref { - base odu-type; - } - description "ODU type"; - } - leaf max-ts-number { - when 'derived-from-or-self(../odu-type,"ODUflex") or - derived-from-or-self(../odu-type, - "ODUflex-resizable")' { - description - "Applicable when odu-type is ODUflex or - ODUflex-resizable"; - } - type uint16 { - range "1..4095"; - } - description - "The maximum number of Tributary Slots (TS) that could be - used by an ODUflex LSP."; - } - } - } - - grouping otn-label-range-info { - - - - - description - "Label range information for OTN. - - This grouping SHOULD be used together with the - otn-label-start-end and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - container otn-label-range { - description - "Label range information for OTN."; - leaf range-type { - type otn-label-range-type; - description "The type of range (e.g., TPN or TS) - to which the label range applies"; - } - leaf tsg { - type identityref { - base tributary-slot-granularity; - } - description - "Tributary slot granularity (TSG) to which the label range - applies. - - This leaf MUST be present when the range-type is TS. - - This leaf MAY be omitted when mapping an ODUk over an OTUk - Link. In this case the range-type is tpn, with only one - entry (ODUk), and the tpn range has only one value (1)."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf-list odu-type-list { - type identityref { - base odu-type; - } - description - "List of ODU types to which the label range applies. - - An Empty odu-type-list means that the label range - applies to all the supported ODU types."; - } - leaf priority { - type uint8 { - range 0..7; - } - description - - - - - "Priority in Interface Switching Capability - Descriptor (ISCD)."; - reference - "RFC4203: OSPF Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS)"; - } - } - } - - grouping otn-label-start-end { - description - "The OTN label-start or label-end used to specify an OTN label - range. - - This grouping is dependent on the range-type defined in the - otn-label-range-info grouping. - - This grouping SHOULD be used together with the - otn-label-range-info and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - container otn { - description - "Label start or label end for OTN."; - choice range-type { - description - "OTN label range type, either TPN range or TS range"; - case trib-port { - leaf tpn { - when "../../../../otn-label-range/range-type = - 'trib-port'" { - description - "Valid only when range-type represented by - trib-port"; - } - type otn-tpn; - description - "Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - case trib-slot { - leaf ts { - when "../../../../otn-label-range/range-type = - 'trib-slot'" { - - - - - description - "Valid only when range-type represented by - trib-slot"; - } - type otn-ts; - description - "Tributary Slot (TS) number."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks"; - } - } - } - } - } - - grouping otn-label-hop { - description "OTN Label"; - reference - "RFC7139, section 6: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks"; - container otn { - description - "Label hop for OTN."; - leaf tpn { - type otn-tpn; - description - "Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - leaf tsg { - type identityref { - base tributary-slot-granularity; - } - description "Tributary Slot Granularity (TSG)."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf ts-list { - type string { - pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" - + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; - } - description - "A list of available Tributary Slots (TS) ranging - - - - - between 1 and 4095. If multiple values or - ranges are given, they all MUST be disjoint - and MUST be in ascending order. - For example 1-20,25,50-1000."; - reference - "RFC 7139: GMPLS Signaling Extensions for Control - of Evolving G.709 Optical Transport Networks"; - } - } - } - - grouping otn-label-step { - description - "Label step for OTN. - - This grouping is dependent on the range-type defined in the - otn-label-range-info grouping. - - This grouping SHOULD be used together with the - otn-label-range-info and otn-label-start-end groupings to - provide OTN technology-specific label information to the - models which use the label-restriction-info grouping defined - in the module ietf-te-types."; - container otn { - description - "Label step for OTN"; - choice range-type { - description - "OTN label range type, either TPN range or TS range"; - case trib-port { - leaf tpn { - when "../../../otn-label-range/range-type = - 'trib-port'" { - description - "Valid only when range-type represented by - trib-port"; - } - type otn-tpn; - description - "Label step which represents possible increments for - Tributary Port Number (TPN)."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - case trib-slot { - leaf ts { - - - - - when "../../../otn-label-range/range-type = - 'trib-slot'" { - description - "Valid only when range-type represented by - trib-slot"; - } - type otn-ts; - description - "Label step which represents possible increments for - Tributary Slot (TS) number."; - reference - "RFC7139: GMPLS Signaling Extensions for Control of - Evolving G.709 Optical Transport Networks."; - } - } - } - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang new file mode 100644 index 000000000..5269ea60a --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-layer1-types@2024-02-22.yang @@ -0,0 +1,1361 @@ +module ietf-layer1-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-layer1-types"; + prefix "l1-types"; + + import ietf-routing-types { + prefix rt-types; + reference + "RFC 8294: Common YANG Data Types for the Routing Area"; + } + + organization + "IETF CCAMP Working Group"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Italo Busi + "; + + description + "This module defines Layer 1 YANG types. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here."; + + revision "2024-02-22" { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Layer 1 Types"; + // RFC Editor: replace RFC XXXX with actual RFC number, + // update date information and remove this note. + } + + /* + * Identities + */ + + identity tributary-slot-granularity { + description + "Tributary Slot Granularity (TSG)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity tsg-1.25G { + base tributary-slot-granularity; + description + "1.25G tributary slot granularity."; + } + + identity tsg-2.5G { + base tributary-slot-granularity; + description + "2.5G tributary slot granularity."; + } + + identity tsg-5G { + base tributary-slot-granularity; + description + "5G tributary slot granularity."; + } + + identity odu-type { + description + "Base identity from which specific Optical Data Unit (ODU) + type is derived."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU0 { + base odu-type; + description + "ODU0 type (1.24Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU1 { + base odu-type; + description + "ODU1 type (2.49Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU2 { + base odu-type; + description + "ODU2 type (10.03Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU2e { + base odu-type; + description + "ODU2e type (10.39Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU3 { + base odu-type; + description + "ODU3 type (40.31Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODU4 { + base odu-type; + description + "ODU4 type (104.79Gb/s)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ODUflex { + base odu-type; + description + "ODUflex type (flexible bit rate, not resizable). + + It could be used for any type of ODUflex, including + ODUflex(CBR), ODUflex(GFP), ODUflex(GFP,n,k), ODUflex(IMP,s), + ODUflex(IMP) and ODUflex(FlexE-aware)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + identity ODUflex-resizable { + base odu-type; + description + "ODUflex protocol (flexible bit rate, resizable). + + It could be used only for ODUflex(GFP,n,k)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity protocol { + description + "Base identity from which specific protocol is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity Ethernet { + base protocol; + description + "Ethernet protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity Fibre-Channel { + base protocol; + description + "Fibre-Channel (FC) protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SDH { + base protocol; + description + "SDH protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SONET { + base protocol; + description + "SONET protocol."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity client-signal { + description + "Base identity from which specific Constant Bit Rate (CBR) + client signal is derived"; + } + + identity coding-func { + description + "Base identity from which specific coding function + is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-1Gb { + base client-signal; + description + "Client signal type of 1GbE."; + reference + "IEEE 802.3-2018, Clause 36: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-10Gb-LAN { + base client-signal; + description + "Client signal type of ETH-10Gb-LAN (10.3 Gb/s)."; + reference + "IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-10Gb-WAN { + base client-signal; + description + "Client signal type of ETH-10Gb-WAN (9.95 Gb/s)."; + reference + "IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-40Gb { + base client-signal; + description + "Client signal type of 40GbE."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity ETH-100Gb { + base client-signal; + description + "Client signal type of 100GbE."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + + identity STM-1 { + base client-signal; + base coding-func; + description + "Client signal type of STM-1; + STM-1 G.707 (N=1) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-4 { + base client-signal; + base coding-func; + description + "Client signal type of STM-4; + STM-4 G.707 (N=4) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-16 { + base client-signal; + base coding-func; + description + "Client signal type of STM-16; + STM-16 G.707 (N=16) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-64 { + base client-signal; + base coding-func; + description + "Client signal type of STM-64; + STM-64 G.707 (N=64) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity STM-256 { + base client-signal; + base coding-func; + description + "Client signal type of STM-256; + STM-256 G.707 (N=256) coding function."; + reference + "ITU-T G.707 v7.0 (01/2007): Network node interface for the + synchronous digital hierarchy (SDH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-3 { + base client-signal; + base coding-func; + description + "Client signal type of OC3; + OC-3 GR-253-CORE (N=3) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-12 { + base client-signal; + base coding-func; + description + "Client signal type of OC12; + OC-12 GR-253-CORE (N=12) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-48 { + base client-signal; + base coding-func; + description + "Client signal type of OC48; + OC-48 GR-253-CORE (N=48) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-192 { + base client-signal; + base coding-func; + description + "Client signal type of OC192; + OC-192 GR-253-CORE (N=192) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity OC-768 { + base client-signal; + base coding-func; + description + "Client signal type of OC768; + OC-768 GR-253-CORE (N=768) coding function."; + reference + "ANSI T1.105-2001: Synchronous Optical Network (SONET) + Basic Description including Multiplex Structure, Rates, + and Formats + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-100 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-100; + FC-100 FC-FS-2 (1.0625 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-200; + FC-200 FC-FS-2 (2.125 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-400 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-400; + FC-400 FC-FS-2 (4.250 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-800 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-800; + FC-800 FC-FS-2 (8.500 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-1200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-1200; + FC-1200 FC-10GFC (10.51875 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-1600 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-1600; + FC-1600 FC-FS-3 (14.025 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FC-3200 { + base client-signal; + base coding-func; + description + "Client signal type of Fibre Channel FC-3200; + FC-3200 FC-FS-4 (28.05 Gb/s) coding function."; + reference + "ANSI INCITS 230-1994 R1999): Information Technology - + Fibre Channel - Physical and Signaling Interface (FC-PH) + + RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks + + ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN) + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-1000X { + base coding-func; + description + "1000BASE-X PCS clause 36 coding function."; + reference + "IEEE 802.3-2018, Clause 36: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-10GW { + base coding-func; + description + "IEEE 802.3-2018, Clause 50: IEEE Standard for Ethernet + + 10GBASE-W (WAN PHY) PCS clause 49 and WIS clause 50 + coding function."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-10GR { + base coding-func; + description + "10GBASE-R (LAN PHY) PCS clause 49 coding function."; + reference + "IEEE 802.3-2018, Clause 49: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-40GR { + base coding-func; + description + "40GBASE-R PCS clause 82 coding function."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ETH-100GR { + base coding-func; + description + "100GBASE-R PCS clause 82 coding function."; + reference + "IEEE 802.3-2018, Clause 82: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity optical-interface-func { + description + "Base identity from which optical-interface-function + is derived."; + reference + "MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity SX-PMD-1000 { + base optical-interface-func; + description + "SX-PMD-clause-38 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 38: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LX-PMD-1000 { + base optical-interface-func; + description + "LX-PMD-clause-38 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 38: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LX10-PMD-1000 { + base optical-interface-func; + description + "LX10-PMD-clause-59 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 59: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity BX10-PMD-1000 { + base optical-interface-func; + description + "BX10-PMD-clause-59 Optical Interface function for + 1000BASE-X PCS-36."; + reference + "IEEE 802.3-2018, Clause 59: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LW-PMD-10G { + base optical-interface-func; + description + "LW-PMD-clause-52 Optical Interface function for + 10GBASE-W PCS-49-WIS-50."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity EW-PMD-10G { + base optical-interface-func; + description + "EW-PMD-clause-52 Optical Interface function for + 10GBASE-W PCS-49-WIS-50."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR-PMD-10G { + base optical-interface-func; + description + "LR-PMD-clause-52 Optical Interface function for + 10GBASE-R PCS-49."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ER-PMD-10G { + base optical-interface-func; + description + "ER-PMD-clause-52 Optical Interface function for + 10GBASE-R PCS-49."; + reference + "IEEE 802.3-2018, Clause 52: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR4-PMD-40G { + base optical-interface-func; + description + "LR4-PMD-clause-87 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 87: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity ER4-PMD-40G { + base optical-interface-func; + description + "ER4-PMD-clause-87 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 87: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity FR-PMD-40G { + base optical-interface-func; + description + "FR-PMD-clause-89 Optical Interface function for + 40GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 89: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + identity LR4-PMD-100G { + base optical-interface-func; + description + "LR4-PMD-clause-88 Optical Interface function for + 100GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 88: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + identity ER4-PMD-100G { + base optical-interface-func; + description + "ER4-PMD-clause-88 Optical Interface function for + 100GBASE-R PCS-82."; + reference + "IEEE 802.3-2018, Clause 88: IEEE Standard for Ethernet + + MEF63: Subscriber Layer 1 Service Attributes"; + } + + /* + * Typedefs + */ + + typedef otn-tpn { + type uint16 { + range "1..4095"; + } + description + "Tributary Port Number (TPN) for OTN."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks."; + } + + typedef otn-ts { + type uint16 { + range "1..4095"; + } + description + "Tributary Slot (TS) for OTN."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of Evolving + G.709 Optical Transport Networks."; + } + + typedef otn-label-range-type { + type enumeration { + enum trib-slot { + description + "Defines a range of OTN tributary slots (TS)."; + } + enum trib-port { + description + "Defines a range of OTN tributary ports (TPN)."; + } + } + description + "Defines the type of OTN label range: TS or TPN."; + } + + typedef gfp-k { + type enumeration { + enum 2 { + description + "The ODU2.ts rate (1,249,177.230 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,2)."; + } + enum 3 { + description + "The ODU3.ts rate (1,254,470.354 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,3)."; + } + enum 4 { + description + "The ODU4.ts rate (1,301,467.133 kbit/s) is used + to compute the rate of an ODUflex(GFP,n,4)."; + } + } + description + "The ODUk.ts used to compute the rate of an ODUflex(GFP,n,k)."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-8 and L.7: Interfaces for + the Optical Transport Network (OTN)"; + } + + typedef flexe-client-rate { + type union { + type uint16; + type enumeration { + enum "10G" { + description + "Represents a 10G FlexE Client signal (s=2)."; + } + enum "40G" { + description + "Represents a 40G FlexE Client signal (s=8)."; + } + } + } + description + "The FlexE Client signal rate (s x 5,156,250.000 kbit/s) + used to compute the rate of an ODUflex(IMP, s). + + Valid values for s are s=2 (10G), s=4 (40G) and + s=5 x n (n x 25G). + + In the first two cases an enumeration value + (either 10G or 40G) is used, while in the latter case + the value of n is used."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the + Optical Transport Network (OTN)"; + } + + typedef odtu-flex-type { + type enumeration { + enum "2" { + description + "The ODTU2.ts ODTU type."; + } + enum "3" { + description + "The ODTU3.ts ODTU type."; + } + enum "4" { + description + "The ODTU4.ts ODTU type."; + } + enum "Cn" { + description + "The ODTUCn.ts ODTU type."; + } + } + description + "The type of Optical Data Tributary Unit (ODTU), + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by an ODUflex LSP, according to + the (19-1a) and (20-1a) formulas defined in G.709."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-7, clause 19.6 and + clause 20.5: Interfaces for the Optical Transport + Network (OTN)"; + } + + typedef bandwidth-scientific-notation { + type string { + pattern + '0(\.0?)?([eE](\+)?0?)?|' + + '[1-9](\.[0-9]{0,6})?[eE](\+)?(9[0-6]|[1-8][0-9]|0?[0-9])?'; + } + units "bps"; + description + "Bandwidth values, expressed using the scientific notation + in bits per second. + + The encoding format is the external decimal-significant + character sequences specified in IEEE 754 and ISO/IEC 9899:1999 + for 32-bit decimal floating-point numbers: + (-1)**(S) * 10**(Exponent) * (Significant), + where Significant uses 7 digits. + + An implementation for this representation MAY use decimal32 + or binary32. The range of the Exponent is from -95 to +96 + for decimal32, and from -38 to +38 for binary32. + As a bandwidth value, the format is restricted to be + normalized, non-negative, and non-fraction: + n.dddddde{+}dd, N.DDDDDDE{+}DD, 0e0 or 0E0, + where 'd' and 'D' are decimal digits; 'n' and 'N' are + non-zero decimal digits; 'e' and 'E' indicate a power of ten. + Some examples are 0e0, 1e10, and 9.953e9."; + reference + "IEEE Std 754-2001: IEEE Standard for Floating-Point + Arithmetic + + ISO/IEC 9899:1999: Information technology - Programming + Languages - C"; + } + + /* + * Groupings + */ + + grouping otn-link-bandwidth { + description + "Bandwidth attributes for OTN links."; + container otn-bandwidth { + description + "Bandwidth attributes for OTN links."; + list odulist { + key "odu-type"; + description + "OTN bandwidth definition"; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type"; + } + leaf number { + type uint16; + description "Number of ODUs."; + } + leaf ts-number { + when 'derived-from-or-self(../odu-type,"ODUflex") or + derived-from-or-self(../odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + type uint16 { + range "1..4095"; + } + description + "The number of Tributary Slots (TS) that + could be used by all the ODUflex LSPs."; + } + } + } + } + + grouping otn-path-bandwidth { + description + "Bandwidth attributes for OTN paths."; + container otn-bandwidth { + description + "Bandwidth attributes for OTN paths."; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type"; + } + choice oduflex-type { + when 'derived-from-or-self(./odu-type,"ODUflex") or + derived-from-or-self(./odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + description + "Types of ODUflex used to compute the ODUflex + nominal bit rate."; + reference + "ITU-T G.709 v6.0 (06/2020), Table 7-2: Interfaces for the + Optical Transport Network (OTN)"; + case generic { + leaf nominal-bit-rate { + type union { + type l1-types:bandwidth-scientific-notation; + type rt-types:bandwidth-ieee-float32; + } + mandatory true; + description + "Nominal ODUflex bit rate."; + } + } + case cbr { + leaf client-type { + type identityref { + base client-signal; + } + mandatory true; + description + "The type of Constant Bit Rate (CBR) client signal + of an ODUflex(CBR)."; + } + } + case gfp-n-k { + leaf gfp-n { + type uint8 { + range "1..80"; + } + mandatory true; + description + "The value of n for an ODUflex(GFP,n,k)."; + reference + "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: + Interfaces for the Optical Transport Network (OTN)"; + } + leaf gfp-k { + type gfp-k; + description + "The value of k for an ODUflex(GFP,n,k). + + If omitted, it is calculated from the value of gfp-n + as described in Table 7-8 of G.709."; + reference + "ITU-T G.709 v6.0 (06/2020), Tables 7-8 and L.7: + Interfaces for the Optical Transport Network (OTN)"; + } + } + case flexe-client { + leaf flexe-client { + type flexe-client-rate; + mandatory true; + description + "The rate of the FlexE-client for an ODUflex(IMP,s)."; + } + } + case flexe-aware { + leaf flexe-aware-n { + type uint16; + mandatory true; + description + "The rate of FlexE-aware client signal + for ODUflex(FlexE-aware)"; + } + } + case packet { + leaf opuflex-payload-rate { + type union { + type l1-types:bandwidth-scientific-notation; + type rt-types:bandwidth-ieee-float32; + } + mandatory true; + description + "Either the GFP-F encapsulated packet client nominal + bit rate for an ODUflex(GFP) or the 64b/66b encoded + packet client nominal bit rate for an ODUflex(IMP)."; + } + } + } + } + } + + grouping otn-max-path-bandwidth { + description + "Maximum bandwidth attributes for OTN paths."; + container otn-bandwidth { + description + "Maximum bandwidth attributes for OTN paths."; + leaf odu-type { + type identityref { + base odu-type; + } + description "ODU type."; + } + leaf max-ts-number { + when 'derived-from-or-self(../odu-type,"ODUflex") or + derived-from-or-self(../odu-type, + "ODUflex-resizable")' { + description + "Applicable when odu-type is ODUflex or + ODUflex-resizable."; + } + type uint16 { + range "1..4095"; + } + description + "The maximum number of Tributary Slots (TS) that could be + used by an ODUflex LSP."; + } + } + } + + grouping otn-label-range-info { + description + "Label range information for OTN. + + This grouping SHOULD be used together with the + otn-label-start-end and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + container otn-label-range { + description + "Label range information for OTN."; + leaf range-type { + type otn-label-range-type; + description "The type of range (e.g., TPN or TS) + to which the label range applies"; + } + leaf tsg { + type identityref { + base tributary-slot-granularity; + } + description + "Tributary slot granularity (TSG) to which the label range + applies. + + This leaf MUST be present when the range-type is TS. + + This leaf MAY be omitted when mapping an ODUk over an OTUk + Link. In this case the range-type is tpn, with only one + entry (ODUk), and the tpn range has only one value (1)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf-list odu-type-list { + type identityref { + base odu-type; + } + description + "List of ODU types to which the label range applies. + + An Empty odu-type-list means that the label range + applies to all the supported ODU types."; + } + leaf priority { + type uint8 { + range 0..7; + } + description + "Priority in Interface Switching Capability + Descriptor (ISCD)."; + reference + "RFC4203: OSPF Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS)"; + } + } + } + + grouping otn-label-start-end { + description + "The OTN label-start or label-end used to specify an OTN label + range. + + This grouping is dependent on the range-type defined in the + otn-label-range-info grouping. + + This grouping SHOULD be used together with the + otn-label-range-info and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + container otn-label { + description + "Label start or label end for OTN. + + It is either a TPN or a TS depending on the OTN label range + type specified in the 'range-type' leaf defined in the + otn-label-range-info grouping."; + leaf tpn { + when "../../../../otn-label-range/range-type = + 'trib-port'" { + description + "Valid only when range-type represented by + trib-port."; + } + type otn-tpn; + description + "Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf ts { + when "../../../../otn-label-range/range-type = + 'trib-slot'" { + description + "Valid only when range-type represented by + trib-slot."; + } + type otn-ts; + description + "Tributary Slot (TS) number."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + } + } + + grouping otn-label-hop { + description "OTN Label"; + reference + "RFC7139, section 6: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + container otn-label { + description + "Label hop for OTN."; + leaf tpn { + type otn-tpn; + description + "Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf tsg { + type identityref { + base tributary-slot-granularity; + } + description "Tributary Slot Granularity (TSG)."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf ts-list { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of available Tributary Slots (TS) ranging + between 1 and 4095. If multiple values or + ranges are given, they all MUST be disjoint + and MUST be in ascending order. + For example 1-20,25,50-1000."; + reference + "RFC 7139: GMPLS Signaling Extensions for Control + of Evolving G.709 Optical Transport Networks"; + } + } + } + + grouping otn-label-step { + description + "Label step for OTN. + + This grouping is dependent on the range-type defined in the + otn-label-range-info grouping. + + This grouping SHOULD be used together with the + otn-label-range-info and otn-label-start-end groupings to + provide OTN technology-specific label information to the + models which use the label-restriction-info grouping defined + in the module ietf-te-types."; + container otn-label-step { + description + "Label step for OTN. + + It is either a TPN or a TS depending on the OTN label range + type specified in the 'range-type' leaf defined in the + otn-label-range-info grouping."; + leaf tpn { + when "../../../otn-label-range/range-type = + 'trib-port'" { + description + "Valid only when range-type represented by + trib-port."; + } + type otn-tpn; + description + "Label step which represents possible increments for + Tributary Port Number (TPN)."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + leaf ts { + when "../../../otn-label-range/range-type = + 'trib-slot'" { + description + "Valid only when range-type represented by + trib-slot"; + } + type otn-ts; + description + "Label step which represents possible increments for + Tributary Slot (TS) number."; + reference + "RFC7139: GMPLS Signaling Extensions for Control of + Evolving G.709 Optical Transport Networks"; + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang deleted file mode 100644 index 587612e8e..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2023-07-06.yang +++ /dev/null @@ -1,2405 +0,0 @@ - module ietf-otn-topology { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-otn-topology"; - prefix "otnt"; - - import ietf-network { - prefix "nw"; - reference "RFC 8345: A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC 8345: A YANG Data Model for Network Topologies"; - } - - import ietf-te-topology { - prefix "tet"; - reference - "RFC 8795: YANG Data Model for Traffic Engineering - (TE) Topologies"; - } - - import ietf-layer1-types { - prefix "l1-types"; - reference - "I-D.ietf-ccamp-layer1-types: A YANG Data Model - for Layer 1 Types"; - } - - organization - "IETF CCAMP Working Group"; - contact - "WG Web: - WG List: - - Editor: Haomian Zheng - - - Editor: Italo Busi - - - Editor: Xufeng Liu - - - Editor: Sergio Belotti - - - - - - Editor: Oscar Gonzalez de Dios - "; - - description - "This module defines a protocol independent Layer 1/ODU topology - data model. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2023 IETF Trust and the persons identified - as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Revised BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices. - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - they appear in all capitals, as shown here."; - - revision 2023-07-06 { - description - "Initial Revision"; - reference - "RFC XXXX: A YANG Data Model for Optical Transport Network - Topology"; - // RFC Ed.: replace XXXX with actual RFC number, update date - // information and remove this note - } - - /* - * Groupings - */ - - grouping label-range-info { - description - "OTN technology-specific label range related information with - a presence container indicating that the label range is an - OTN technology-specific label range. - - This grouping SHOULD be used together with the - - - - - otn-label-start-end and otn-label-step groupings to provide - OTN technology-specific label information to the models which - use the label-restriction-info grouping defined in the module - ietf-te-types."; - uses l1-types:otn-label-range-info { - refine otn-label-range { - presence - "Indicates the label range is an OTN label range. - - This container MUST NOT be present if there are other - presence containers or attributes indicating another type - of label range."; - } - } - } - - /* - * Data nodes - */ - - augment "/nw:networks/nw:network/nw:network-types/" - + "tet:te-topology" { - container otn-topology { - presence "indicates a topology type of Optical Transport - Network (OTN)-electrical layer."; - description "OTN topology type"; - } - description "augment network types to include OTN newtork"; - } - - augment "/nw:networks/nw:network/nw:node/tet:te" - + "/tet:te-node-attributes" { - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description "Augment only for OTN network."; - } - description "Augment TE node attributes."; - container otn-node { - presence "The TE node is an OTN node."; - description - "Introduce new TE node type for OTN node."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes" { - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description "Augment only for OTN network."; - } - description "Augment link configuration"; - - container otn-link { - description - "Attributes of the OTN Link."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs set up - on this OTN Link."; - } - leaf tsg { - type identityref { - base l1-types:tributary-slot-granularity; - } - description "Tributary slot granularity."; - reference - "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical - Transport Network (OTN)"; - } - leaf distance { - type uint32; - description "distance in the unit of kilometers"; - } - } - container client-svc { - presence - "When present, indicates that the Link supports Costant - Bit Rate (CBR) client signals."; - description - "Attributes of the Link supporting CBR client signals."; - leaf-list supported-client-signal { - type identityref { - base l1-types:client-signal; - } - min-elements 1; - description - "List of client signal types supported by the Link."; - } - } - } - - augment "/nw:networks/nw:network/nw:node/nt:termination-point/" - + "tet:te" { - - - - - when "../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description "Augment only for OTN network"; - } - description "OTN TP attributes config in ODU topology."; - - container otn-ltp { - description - "Attributes of the OTN Link Termination Point (LTP)."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs set up - on this OTN Link Termination Point (LTP)."; - } - } - container client-svc { - presence - "When present, indicates that the Link Termination Point - (LTP) supports Costant Bit Rate (CBR) client signals."; - description - "OTN LTP Service attributes."; - leaf-list supported-client-signal { - type identityref { - base l1-types:client-signal; - } - description - "List of client signal types supported by the LTP."; - } - } - } - - /* - * Augment TE bandwidth - */ - - augment "/nw:networks/nw:network/nw:node/nt:termination-point/" - + "tet:te/" - + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - - - - - description - "Augment maximum LSP TE bandwidth for the link termination - point (LTP)."; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link Termination - Point (LTP) is used to compute the number of Tributary - Slots (TS) required by the ODUflex LSPs set up on this - OTN LTP."; - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the TE node - connectivity matrices."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN - connectivity matrices."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - - - - - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the - connectivity matrix entry."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN - connectivity matrix entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the TE node - connectivity matrices information source."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - - - - - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN - connectivity matrices."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-constraints/tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints of the - connectivity matrix entry information source"; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN - connectivity matrix entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:client-layer-adaptation/tet:switching-capability/" - + "tet:te-bandwidth/tet:technology" { - - - - - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment client TE bandwidth of the tunnel termination point - (TTP)"; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - terminated on this OTN Tunnel Termination Point - (TTP)."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/tet:path-constraints/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - - - - - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay paths of these OTN Local - Link Connectivities."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/tet:path-constraints/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE bandwidth path constraints for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-link-bandwidth { - augment otn { - description - "Augment OTN link bandwidth information."; - leaf odtu-flex-type { - type l1-types:odtu-flex-type; - description - "The type of Optical Data Tributary Unit (ODTU) - whose nominal bitrate is used to compute the number of - Tributary Slots (TS) required by the ODUflex LSPs - set up along the underlay path of this OTN Local - Link Connectivyt entry."; - } - } - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" - - - - - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum LSP TE bandwidth for the TE link."; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum TE bandwidth for the TE link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment maximum reservable TE bandwidth for the TE link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment unreserved TE bandwidth for the TE Link"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:interface-switching-capability/" - + "tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum LSP TE bandwidth for the TE link - information source"; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - - - - - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum TE bandwidth for the TE link - information source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment maximum reservable TE bandwidth for the TE link - information-source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - - - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment unreserved TE bandwidth of the TE link - information source"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on this OTN Link."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:interface-switching-capability/" - + "tet:max-lsp-bandwidth/" - + "tet:te-bandwidth/tet:technology" { - description - "Augment maximum LSP TE bandwidth of the TE link - template"; - case otn { - uses l1-types:otn-max-path-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:max-link-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment maximum TE bandwidth the TE link template"; - uses l1-types:otn-link-bandwidth { - description - - - - - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:max-resv-link-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment maximum reservable TE bandwidth for the TE link - template."; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:unreserved-bandwidth/" - + "tet:te-bandwidth" { - description - "Augment unreserved TE bandwidth the TE link template"; - uses l1-types:otn-link-bandwidth { - description - "The odtu-flex-type attribute of the OTN Link is used - to compute the number of Tributary Slots (TS) required - by the ODUflex LSPs set up on the OTN Link that uses this - Link Template."; - } - } - - /* - * Augment TE label range information - */ - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE node - connectivity matrices."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the source LTP - of the connectivity matrix entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the destination LTP - of the connectivity matrix entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE node - connectivity matrices information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the source LTP - of the connectivity matrix entry information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the destination LTP - of the connectivity matrix entry information source."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TTP - Local Link Connectivities."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TTP - Local Link Connectivity entry."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range information for the TE link."; - uses label-range-info; - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction" { - when "../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment TE label range information for the TE link - information source."; - uses label-range-info; - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction" { - description - "Augment TE label range information for the TE link template."; - uses label-range-info; - } - - /* - * Augment TE label - */ - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/" - + "tet:label-restriction/tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - - - - - } - description - "Augment TE label range end for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:label-restrictions/" - + "tet:label-restriction/tet:label-step/" - + "tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE node - connectivity matrices"; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:underlay/tet:primary-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path of the - TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:underlay/tet:backup-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path of the - TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TE node connectivity - matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - - - - - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TE node connectivity - matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TE node connectivity matrices"; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - - - - - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:from/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - - - - - "Augment TE label range step for the source LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:to/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the destination LTP - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:primary-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:backup-path/tet:path-element/" - + "tet:type/tet:label/tet:label-hop/" - + "tet:te-label/tet:technology" { - - - - - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:optimizations/" - + "tet:algorithm/tet:metric/tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/tet:optimizations/" - + "tet:algorithm/tet:metric/tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - - - - - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:te-node-attributes/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the connectivity matrix entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE node connectivity - matrices information source."; - case otn { - - - - - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE node connectivity - matrices information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/" - + "tet:connectivity-matrices/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE node connectivity - matrices information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - - - - - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TE node connectivity matrices of the information - source entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TE node connectivity matrices of the information - source entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TE node connectivity matrices - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TE node connectivity matrices - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - - - - - of the TE node connectivity matrices information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - - - - - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:from/tet:label-restrictions/" - + "tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the source LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:to/tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the destination LTP - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the connectivity matrix entry information source."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the connectivity matrix entry - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - - - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the connectivity matrix entry - information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:information-source-entry/tet:connectivity-matrices/" - + "tet:connectivity-matrix/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the connectivity matrix entry information source."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - - - - - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/" - + "tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/" - + "tet:te-label/tet:technology"{ - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/" - + "tet:technology"{ - when "../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - - - - - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TTP - Local Link Connectivities."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TTP Local Link Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TTP Local Link Connectivities."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TTP Local Link - Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TTP Local Link - Connectivities."; - case otn { - - - - - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TTP Local Link Connectivities."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - - - - - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TTP - Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - - - - - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-exclude-objects/" - + "tet:route-object-exclude-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects excluded - by the path computation of the TTP Local Link - Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:optimizations/tet:algorithm/tet:metric/" - + "tet:optimization-metric/" - + "tet:explicit-route-include-objects/" - + "tet:route-object-include-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the explicit route objects included - by the path computation of the TTP Local Link - Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nw:node/tet:te/" - + "tet:tunnel-termination-point/" - + "tet:local-link-connectivities/" - + "tet:local-link-connectivity/" - + "tet:path-properties/tet:path-route-objects/" - + "tet:path-route-object/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - - - - - OTN topology type."; - } - description - "Augment TE label hop for the computed path route objects - of the TTP Local Link Connectivity entry."; - case otn { - uses l1-types:otn-label-hop; - } - } - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay primary path - of the TE link."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - when "../../../../../../../../" - + "nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label hop for the underlay backup path - of the TE link."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - - - - - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE link."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE link."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range step for the TE link."; - case otn { - uses l1-types:otn-label-step; - } - - - - - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range start for the TE link - information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - when "../../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - description - "Augment TE label range end for the TE link - information source."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/nw:network/nt:link/tet:te/" - + "tet:information-source-entry/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - when "../../../../../../nw:network-types/tet:te-topology/" - + "otnt:otn-topology" { - description - "Augmentation parameters apply only for networks with - OTN topology type."; - } - - - - - description - "Augment TE label range step for the TE link - information source."; - case otn { - uses l1-types:otn-label-step; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - description - "Augment TE label hop for the underlay primary path - of the TE link template."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" - + "tet:label/tet:label-hop/tet:te-label/tet:technology" { - description - "Augment TE label hop for the underlay backup path - of the TE link template."; - case otn { - uses l1-types:otn-label-hop; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-start/tet:te-label/tet:technology" { - description - "Augment TE label range start for the TE link template."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-end/tet:te-label/tet:technology" { - description - - - - - "Augment TE label range end for the TE link template."; - case otn { - uses l1-types:otn-label-start-end; - } - } - - augment "/nw:networks/tet:te/tet:templates/" - + "tet:link-template/tet:te-link-attributes/" - + "tet:label-restrictions/tet:label-restriction/" - + "tet:label-step/tet:technology" { - description - "Augment TE label range step for the TE link template."; - case otn { - uses l1-types:otn-label-step; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang new file mode 100644 index 000000000..90677e79e --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-otn-topology@2024-06-21.yang @@ -0,0 +1,2230 @@ +module ietf-otn-topology { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-otn-topology"; + prefix "otnt"; + + import ietf-network { + prefix "nw"; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix "nt"; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + import ietf-te-topology { + prefix "tet"; + reference + "RFC 8795: YANG Data Model for Traffic Engineering + (TE) Topologies"; + } + + import ietf-layer1-types { + prefix "l1-types"; + reference + "RFC YYYY: A YANG Data Model for Layer 1 Types"; + } + // RFC Editor: replace YYYY with actual RFC number assigned to + // [I-D.ietf-ccamp-layer1-types] and remove this note + + organization + "IETF CCAMP Working Group"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Italo Busi + + + Editor: Xufeng Liu + + + Editor: Sergio Belotti + + + Editor: Oscar Gonzalez de Dios + "; + + description + "This module defines a protocol independent Layer 1/ODU topology + data model. The model fully conforms + to the Network Management Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons identified + as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here."; + + revision 2024-06-21 { + description + "Initial Revision"; + reference + "RFC XXXX: A YANG Data Model for Optical Transport Network + Topology"; + } + // RFC Editor: replace XXXX with actual RFC number, update date + // information and remove this note + + /* + * Groupings + */ + + grouping label-range-info { + description + "OTN technology-specific label range related information with + a presence container indicating that the label range is an + OTN technology-specific label range. + + This grouping SHOULD be used together with the + otn-label-start-end and otn-label-step groupings to provide + OTN technology-specific label information to the models which + use the label-restriction-info grouping defined in the module + ietf-te-types."; + uses l1-types:otn-label-range-info { + refine otn-label-range { + presence + "Indicates the label range is an OTN label range. + + This container MUST NOT be present if there are other + presence containers or attributes indicating another type + of label range."; + } + } + } + + /* + * Data nodes + */ + + augment "/nw:networks/nw:network/nw:network-types/" + + "tet:te-topology" { + container otn-topology { + presence "indicates a topology type of Optical Transport + Network (OTN)-electrical layer."; + description "OTN topology type"; + } + description "augment network types to include OTN."; + } + + augment "/nw:networks/nw:network/nw:node/tet:te" + + "/tet:te-node-attributes" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description "Augment TE node attributes."; + container otn-node { + presence "The TE node is an OTN node."; + description + "Introduce new TE node type for OTN node."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description "Augment link configuration"; + + container otn-link { + description + "Attributes of the OTN Link."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs set up + on this OTN Link."; + } + leaf tsg { + type identityref { + base l1-types:tributary-slot-granularity; + } + description "Tributary slot granularity."; + reference + "ITU-T G.709 v6.0 (06/2020): Interfaces for the Optical + Transport Network (OTN)"; + } + leaf distance { + type uint32; + description "distance in the unit of kilometers"; + } + } + container client-svc { + presence + "When present, indicates that the Link supports Constant + Bit Rate (CBR) client signals."; + description + "Attributes of the Link supporting CBR client signals."; + leaf-list supported-client-signal { + type identityref { + base l1-types:client-signal; + } + min-elements 1; + description + "List of client signal types supported by the Link."; + } + } + } + + augment "/nw:networks/nw:network/nw:node/nt:termination-point/" + + "tet:te" { + when "../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description "Augment only for OTN."; + } + description + "Augment link termination point (LTP) configuration."; + + container otn-link-tp { + description + "Attributes of the OTN Link Termination Point (LTP)."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs set up + on this OTN Link Termination Point (LTP)."; + } + } + container client-svc { + presence + "When present, indicates that the Link Termination Point + (LTP) supports Constant Bit Rate (CBR) client signals."; + description + "OTN LTP Service attributes."; + leaf-list supported-client-signal { + type identityref { + base l1-types:client-signal; + } + description + "List of client signal types supported by the LTP."; + } + } + } + + /* + * Augment TE bandwidth + */ + + augment "/nw:networks/nw:network/nw:node/nt:termination-point/" + + "tet:te/" + + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the link termination + point (LTP)."; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link Termination + Point (LTP) is used to compute the number of Tributary + Slots (TS) required by the ODUflex LSPs set up on this + OTN LTP."; + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the TE node + connectivity matrices."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN + connectivity matrices."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the + connectivity matrix entry."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN + connectivity matrix entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the TE node + connectivity matrices information source."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN + connectivity matrices."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-constraints/tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints of the + connectivity matrix entry information source"; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN + connectivity matrix entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:client-layer-adaptation/tet:switching-capability/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment client TE bandwidth of the tunnel termination point + (TTP)"; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + terminated on this OTN Tunnel Termination Point + (TTP)."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/tet:path-constraints/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay paths of these OTN Local + Link Connectivities."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/tet:path-constraints/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE bandwidth path constraints for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-link-bandwidth { + augment otn-bandwidth { + description + "Augment OTN link bandwidth information."; + leaf odtu-flex-type { + type l1-types:odtu-flex-type; + description + "The type of Optical Data Tributary Unit (ODTU) + whose nominal bitrate is used to compute the number of + Tributary Slots (TS) required by the ODUflex LSPs + set up along the underlay path of this OTN Local + Link Connectivity entry."; + } + } + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:interface-switching-capability/tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the TE link."; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum TE bandwidth for the TE link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum reservable TE bandwidth for the TE link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment unreserved TE bandwidth for the TE Link"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:interface-switching-capability/" + + "tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum LSP TE bandwidth for the TE link + information source"; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum TE bandwidth for the TE link + information source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment maximum reservable TE bandwidth for the TE link + information-source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment unreserved TE bandwidth of the TE link + information source"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on this OTN Link."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:interface-switching-capability/" + + "tet:max-lsp-bandwidth/" + + "tet:te-bandwidth/tet:technology" { + description + "Augment maximum LSP TE bandwidth of the TE link + template"; + case otn { + uses l1-types:otn-max-path-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:max-link-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment maximum TE bandwidth the TE link template"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:max-resv-link-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment maximum reservable TE bandwidth for the TE link + template."; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:unreserved-bandwidth/" + + "tet:te-bandwidth" { + description + "Augment unreserved TE bandwidth the TE link template"; + uses l1-types:otn-link-bandwidth { + description + "The odtu-flex-type attribute of the OTN Link is used + to compute the number of Tributary Slots (TS) required + by the ODUflex LSPs set up on the OTN Link that uses this + Link Template."; + } + } + + /* + * Augment TE label range information + */ + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE node + connectivity matrices."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the source LTP + of the connectivity matrix entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the destination LTP + of the connectivity matrix entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE node + connectivity matrices information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the source LTP + of the connectivity matrix entry information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the destination LTP + of the connectivity matrix entry information source."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TTP + Local Link Connectivities."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TTP + Local Link Connectivity entry."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE link."; + uses label-range-info; + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction" { + when "../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range information for the TE link + information source."; + uses label-range-info; + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction" { + description + "Augment TE label range information for the TE link template."; + uses label-range-info; + } + + /* + * Augment TE label + */ + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/" + + "tet:label-restriction/tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:label-restrictions/" + + "tet:label-restriction/tet:label-step/" + + "tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE node + connectivity matrices"; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:underlay/tet:primary-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path of the + TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:underlay/tet:backup-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path of the + TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TE node connectivity + matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TE node connectivity + matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TE node connectivity matrices"; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:from/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the source LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:to/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the destination LTP + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:primary-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:backup-path/tet:path-element/" + + "tet:type/tet:label/tet:label-hop/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:optimizations/" + + "tet:algorithm/tet:metric/tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/tet:optimizations/" + + "tet:algorithm/tet:metric/tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:te-node-attributes/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the connectivity matrix entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/" + + "tet:connectivity-matrices/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE node connectivity + matrices information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TE node connectivity matrices of the information + source entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TE node connectivity matrices of the information + source entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TE node connectivity matrices + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TE node connectivity matrices + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TE node connectivity matrices information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:from/tet:label-restrictions/" + + "tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the source LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:to/tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the destination LTP + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the connectivity matrix entry + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the connectivity matrix entry + information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:information-source-entry/tet:connectivity-matrices/" + + "tet:connectivity-matrix/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the connectivity matrix entry information source."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/" + + "tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/" + + "tet:te-label/tet:technology"{ + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/" + + "tet:technology"{ + when "../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TTP + Local Link Connectivities."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TTP Local Link + Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TTP Local Link + Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TTP Local Link Connectivities."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TTP + Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-exclude-objects/" + + "tet:route-object-exclude-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects excluded + by the path computation of the TTP Local Link + Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:optimizations/tet:algorithm/tet:metric/" + + "tet:optimization-metric/" + + "tet:explicit-route-include-objects/" + + "tet:route-object-include-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the explicit route objects included + by the path computation of the TTP Local Link + Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nw:node/tet:te/" + + "tet:tunnel-termination-point/" + + "tet:local-link-connectivities/" + + "tet:local-link-connectivity/" + + "tet:path-properties/tet:path-route-objects/" + + "tet:path-route-object/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the computed path route objects + of the TTP Local Link Connectivity entry."; + case otn { + uses l1-types:otn-label-hop; + } + } + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay primary path + of the TE link."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + when "../../../../../../../../" + + "nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label hop for the underlay backup path + of the TE link."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE link."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE link."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE link."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range start for the TE link + information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + when "../../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range end for the TE link + information source."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/nw:network/nt:link/tet:te/" + + "tet:information-source-entry/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + when "../../../../../../nw:network-types/tet:te-topology/" + + "otnt:otn-topology" { + description + "Augmentation parameters apply only for networks with + OTN topology type."; + } + description + "Augment TE label range step for the TE link + information source."; + case otn { + uses l1-types:otn-label-step; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:underlay/tet:primary-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + description + "Augment TE label hop for the underlay primary path + of the TE link template."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:underlay/tet:backup-path/tet:path-element/tet:type/" + + "tet:label/tet:label-hop/tet:te-label/tet:technology" { + description + "Augment TE label hop for the underlay backup path + of the TE link template."; + case otn { + uses l1-types:otn-label-hop; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-start/tet:te-label/tet:technology" { + description + "Augment TE label range start for the TE link template."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-end/tet:te-label/tet:technology" { + description + "Augment TE label range end for the TE link template."; + case otn { + uses l1-types:otn-label-start-end; + } + } + + augment "/nw:networks/tet:te/tet:templates/" + + "tet:link-template/tet:te-link-attributes/" + + "tet:label-restrictions/tet:label-restriction/" + + "tet:label-step/tet:technology" { + description + "Augment TE label range step for the TE link template."; + case otn { + uses l1-types:otn-label-step; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang deleted file mode 100644 index 8e7d4aafa..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang +++ /dev/null @@ -1,475 +0,0 @@ -module ietf-te-packet-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-te-packet-types"; - prefix te-packet-types; - - /* Import TE generic types */ - - import ietf-te-types { - prefix te-types; - reference - "RFC 8776: Common YANG Data Types for Traffic Engineering"; - } - - organization - "IETF Traffic Engineering Architecture and Signaling (TEAS) - Working Group"; - contact - "WG Web: - WG List: - - Editor: Tarek Saad - - - Editor: Rakesh Gandhi - - - Editor: Vishnu Pavan Beeram - - - Editor: Xufeng Liu - - - Editor: Igor Bryskin - "; - description - "This YANG module contains a collection of generally useful YANG - data type definitions specific to MPLS TE. The model fully - conforms to the Network Management Datastore Architecture - (NMDA). - - Copyright (c) 2020 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject to - the license terms contained in, the Simplified BSD License set - forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 8776; see the - RFC itself for full legal notices."; - - revision 2020-06-10 { - description - "Latest revision of TE MPLS types."; - reference - "RFC 8776: Common YANG Data Types for Traffic Engineering"; - } - - /** - * Typedefs - */ - - typedef te-bandwidth-requested-type { - type enumeration { - enum specified { - description - "Bandwidth is explicitly specified."; - } - enum auto { - description - "Bandwidth is automatically computed."; - } - } - description - "Enumerated type for specifying whether bandwidth is - explicitly specified or automatically computed."; - } - - typedef te-class-type { - type uint8; - description - "Diffserv-TE Class-Type. Defines a set of Traffic Trunks - crossing a link that is governed by a specific set of - bandwidth constraints. Class-Type is used for the purposes - of link bandwidth allocation, constraint-based routing, and - admission control."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - typedef bc-type { - type uint8 { - range "0..7"; - } - description - "Diffserv-TE bandwidth constraints as defined in RFC 4124."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - typedef bandwidth-kbps { - type uint64; - units "Kbps"; - description - "Bandwidth values, expressed in kilobits per second."; - } - - typedef bandwidth-mbps { - type uint64; - units "Mbps"; - description - "Bandwidth values, expressed in megabits per second."; - } - - typedef bandwidth-gbps { - type uint64; - units "Gbps"; - description - "Bandwidth values, expressed in gigabits per second."; - } - - identity backup-protection-type { - description - "Base identity for the backup protection type."; - } - - identity backup-protection-link { - base backup-protection-type; - description - "Backup provides link protection only."; - } - - identity backup-protection-node-link { - base backup-protection-type; - description - "Backup offers node (preferred) or link protection."; - } - - identity bc-model-type { - description - "Base identity for the Diffserv-TE Bandwidth Constraints - Model type."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - identity bc-model-rdm { - base bc-model-type; - description - "Russian Dolls Bandwidth Constraints Model type."; - reference - "RFC 4127: Russian Dolls Bandwidth Constraints Model for - Diffserv-aware MPLS Traffic Engineering"; - } - - identity bc-model-mam { - base bc-model-type; - description - "Maximum Allocation Bandwidth Constraints Model type."; - reference - "RFC 4125: Maximum Allocation Bandwidth Constraints Model for - Diffserv-aware MPLS Traffic Engineering"; - } - - identity bc-model-mar { - base bc-model-type; - description - "Maximum Allocation with Reservation Bandwidth Constraints - Model type."; - reference - "RFC 4126: Max Allocation with Reservation Bandwidth - Constraints Model for Diffserv-aware MPLS Traffic Engineering - & Performance Comparisons"; - } - - grouping performance-metrics-attributes-packet { - description - "Contains PM attributes."; - uses te-types:performance-metrics-attributes { - augment "performance-metrics-one-way" { - leaf one-way-min-delay { - type uint32 { - range "0..16777215"; - } - description - "One-way minimum delay or latency in microseconds."; - } - leaf one-way-min-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way minimum delay or latency normality."; - } - leaf one-way-max-delay { - type uint32 { - range "0..16777215"; - } - description - "One-way maximum delay or latency in microseconds."; - } - leaf one-way-max-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way maximum delay or latency normality."; - } - leaf one-way-delay-variation { - type uint32 { - range "0..16777215"; - } - description - "One-way delay variation in microseconds."; - reference - "RFC 5481: Packet Delay Variation Applicability - Statement, Section 4.2"; - } - leaf one-way-delay-variation-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way delay variation normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - leaf one-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - description - "One-way packet loss as a percentage of the total traffic - sent over a configurable interval. The finest precision - is 0.000003%, where the maximum is 50.331642%."; - reference - "RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.4"; - } - leaf one-way-packet-loss-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Packet loss normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - description - "PM one-way packet-specific augmentation for a generic PM - grouping."; - } - augment "performance-metrics-two-way" { - leaf two-way-min-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way minimum delay or latency in microseconds."; - } - leaf two-way-min-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way minimum delay or latency normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - leaf two-way-max-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way maximum delay or latency in microseconds."; - } - leaf two-way-max-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way maximum delay or latency normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - leaf two-way-delay-variation { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way delay variation in microseconds."; - reference - "RFC 5481: Packet Delay Variation Applicability - Statement, Section 4.2"; - } - leaf two-way-delay-variation-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way delay variation normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - leaf two-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - default "0"; - description - "Two-way packet loss as a percentage of the total traffic - sent over a configurable interval. The finest precision - is 0.000003%."; - } - leaf two-way-packet-loss-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way packet loss normality."; - } - description - "PM two-way packet-specific augmentation for a generic PM - grouping."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) Using - TE Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions"; - } - } - } - - grouping one-way-performance-metrics-packet { - description - "One-way packet PM throttle grouping."; - leaf one-way-min-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "One-way minimum delay or latency in microseconds."; - } - leaf one-way-max-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "One-way maximum delay or latency in microseconds."; - } - leaf one-way-delay-variation { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "One-way delay variation in microseconds."; - } - leaf one-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - default "0"; - description - "One-way packet loss as a percentage of the total traffic - sent over a configurable interval. The finest precision is - 0.000003%."; - } - } - - grouping two-way-performance-metrics-packet { - description - "Two-way packet PM throttle grouping."; - leaf two-way-min-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way minimum delay or latency in microseconds."; - } - leaf two-way-max-delay { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way maximum delay or latency in microseconds."; - } - leaf two-way-delay-variation { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Two-way delay variation in microseconds."; - } - leaf two-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - default "0"; - description - "Two-way packet loss as a percentage of the total traffic - sent over a configurable interval. The finest precision is - 0.000003%."; - } - } - - grouping performance-metrics-throttle-container-packet { - description - "Packet PM threshold grouping."; - uses te-types:performance-metrics-throttle-container { - augment "throttle/threshold-out" { - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - description - "PM threshold-out packet augmentation for a - generic grouping."; - } - augment "throttle/threshold-in" { - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - description - "PM threshold-in packet augmentation for a - generic grouping."; - } - augment "throttle/threshold-accelerated-advertisement" { - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - description - "PM accelerated advertisement packet augmentation for a - generic grouping."; - } - } - } -} diff --git a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang new file mode 100644 index 000000000..54393a9c3 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang @@ -0,0 +1,844 @@ +module ietf-te-packet-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-packet-types"; + prefix te-packet-types; + + import ietf-yang-types { + prefix yang; + reference + "RFC 9911: Common YANG Data Types"; + } + import ietf-te-types { + prefix te-types; + reference + "RFC XXXX: Common YANG Data Types for Traffic Engineering"; + } + + organization + "IETF Traffic Engineering Architecture and Signaling (TEAS) + Working Group"; + contact + "WG Web: + WG List: + + Editor: Tarek Saad + + + Editor: Rakesh Gandhi + + + Editor: Vishnu Pavan Beeram + + + Editor: Xufeng Liu + + + Editor: Igor Bryskin + "; + description + "This YANG module contains a collection of generally useful YANG + data type definitions specific to Packet Traffic Engineering + (TE). + + The model conforms to the Network Management Datastore + Architecture (NMDA). + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2026 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject to + the license terms contained in, the Revised BSD License set + forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX + (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself + for full legal notices."; + + // RFC Ed.: update the date below with the date of RFC publication + // and remove this note. + + revision 2026-01-15 { + description + "This revision adds the following new identities: + - bandwidth-profile-type; + - link-metric-delay-variation; + - link-metric-loss; + - path-metric-delay-variation; + - path-metric-loss. + + This revision adds the following new groupings: + - bandwidth-profile-parameters; + - te-packet-path-bandwidth; + - te-packet-link-bandwidth. + + This revision provides also few editorial changes."; + reference + "RFC XXXX: Common YANG Data Types for Traffic Engineering"; + } + revision 2020-06-10 { + description + "Latest revision of TE MPLS types."; + reference + "RFC 8776: Common YANG Data Types for Traffic Engineering"; + } + + /* + * Identities + */ + + identity bandwidth-profile-type { + description + "Bandwidth Profile Types"; + } + + identity mef-10 { + base bandwidth-profile-type; + description + "MEF 10 Bandwidth Profile"; + reference + "MEF 10.3: Ethernet Services Attributes Phase 3"; + } + + identity rfc-2697 { + base bandwidth-profile-type; + description + "RFC 2697 Bandwidth Profile"; + reference + "RFC 2697: A Single Rate Three Color Marker"; + } + + identity rfc-2698 { + base bandwidth-profile-type; + description + "RFC 2698 Bandwidth Profile"; + reference + "RFC 2698: A Two Rate Three Color Marker"; + } + + // Derived identities from te-types:link-metric-type + + identity link-metric-delay-variation { + base te-types:link-metric-type; + description + "The Unidirectional Delay Variation Metric, + measured in units of microseconds."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions, + Section 4.3 + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions, + Section 4.3"; + } + + identity link-metric-loss { + base te-types:link-metric-type; + description + "The Unidirectional Link Loss Metric, + measured in units of 0.000003%."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions, + Section 4.4 + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions, + Section 4.4"; + } + + // Derived identities from te-types:path-metric-type + + identity path-metric-delay-variation { + base te-types:path-metric-type; + description + "The Path Delay Variation Metric, + measured in units of microseconds."; + reference + "RFC 8233: Extensions to the Path Computation Element + Communication Protocol (PCEP) to Compute + Service-Aware Label Switched Paths (LSPs), + Section 3.1.2"; + } + + identity path-metric-loss { + base te-types:path-metric-type; + description + "The Path Loss Metric, measured in units of 0.000003%."; + reference + "RFC 8233: Extensions to the Path Computation Element + Communication Protocol (PCEP) to Compute + Service-Aware Label Switched Paths (LSPs), + Section 3.1.3"; + } + + identity backup-protection-type { + description + "Base identity for the backup protection type."; + } + + identity backup-protection-link { + base backup-protection-type; + description + "Backup provides link protection only."; + } + + identity backup-protection-node-link { + base backup-protection-type; + description + "Backup offers node (preferred) or link protection."; + } + + identity bc-model-type { + description + "Base identity for the Diffserv-TE Bandwidth Constraints + Model type."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + identity bc-model-rdm { + base bc-model-type; + description + "Russian Dolls Bandwidth Constraints Model type."; + reference + "RFC 4127: Russian Dolls Bandwidth Constraints Model for + Diffserv-aware MPLS Traffic Engineering"; + } + + identity bc-model-mam { + base bc-model-type; + description + "Maximum Allocation Bandwidth Constraints Model type."; + reference + "RFC 4125: Maximum Allocation Bandwidth Constraints Model for + Diffserv-aware MPLS Traffic Engineering"; + } + + identity bc-model-mar { + base bc-model-type; + description + "Maximum Allocation with Reservation Bandwidth Constraints + Model type."; + reference + "RFC 4126: Max Allocation with Reservation Bandwidth + Constraints Model for Diffserv-aware MPLS Traffic + Engineering & Performance Comparisons"; + } + + /* + * Typedefs + */ + + typedef te-bandwidth-requested-type { + type enumeration { + enum specified-value { + description + "Bandwidth value is explicitly specified."; + } + enum specified-profile { + description + "Bandwidth profile is explicitly specified."; + } + enum auto { + description + "Bandwidth is automatically computed."; + } + } + description + "Enumerated type for specifying whether bandwidth is + explicitly specified or automatically computed."; + } + + typedef te-class-type { + type uint8; + description + "Diffserv-TE Class-Type. + Defines a set of Traffic Trunks crossing a link that is + governed by a specific set of bandwidth constraints. + + Class-Type is used for the purposes of link bandwidth + allocation, constraint-based routing, and admission control."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + typedef bc-type { + type uint8 { + range "0..7"; + } + description + "Diffserv-TE bandwidth constraints as defined in RFC 4124."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + typedef bandwidth-kbps { + type uint64; + units "kilobits per second"; + description + "Bandwidth values, expressed in kilobits per second."; + } + + typedef bandwidth-mbps { + type uint64; + units "megabits per second"; + description + "Bandwidth values, expressed in megabits per second."; + } + + typedef bandwidth-gbps { + type uint64; + units "gigabits per second"; + description + "Bandwidth values, expressed in gigabits per second."; + } + + /* + * Groupings + */ + + grouping performance-metrics-attributes-packet { + description + "Contains Performance Metrics (PM) information."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; + uses te-types:performance-metrics-attributes { + augment "performance-metrics-one-way" { + description + "Performance Metrics (PM) one-way packet-specific + augmentation for a generic PM grouping."; + leaf one-way-min-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + description + "One-way minimum delay or latency."; + } + leaf one-way-min-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way minimum delay or latency normality."; + } + leaf one-way-max-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + description + "One-way maximum delay or latency."; + } + leaf one-way-max-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way maximum delay or latency normality."; + } + leaf one-way-delay-variation { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + description + "One-way delay variation."; + reference + "RFC 5481: Packet Delay Variation Applicability + Statement, Section 4.2"; + } + leaf one-way-delay-variation-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way delay variation normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) + Using TE Metric Extensions"; + } + leaf one-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + units "percent"; + description + "One-way packet loss as a percentage of the total traffic + sent over a configurable interval. + + The finest precision is 0.000003%."; + reference + "RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.4"; + } + leaf one-way-packet-loss-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Packet loss normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) + Using TE Metric Extensions"; + } + } + augment "performance-metrics-two-way" { + description + "Performance Metrics (PM) two-way packet-specific + augmentation for a generic PM grouping."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE + Metric Extensions"; + leaf two-way-min-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way minimum delay or latency."; + } + leaf two-way-min-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way minimum delay or latency normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) + Using TE Metric Extensions"; + } + leaf two-way-max-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way maximum delay or latency."; + } + leaf two-way-max-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way maximum delay or latency normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) + Using TE Metric Extensions"; + } + leaf two-way-delay-variation { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way delay variation."; + reference + "RFC 5481: Packet Delay Variation Applicability + Statement, Section 4.2"; + } + leaf two-way-delay-variation-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way delay variation normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) + Using TE Metric Extensions"; + } + leaf two-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + units "percent"; + default "0"; + description + "Two-way packet loss as a percentage of the total traffic + sent over a configurable interval. + + The finest precision is 0.000003%."; + } + leaf two-way-packet-loss-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way packet loss normality."; + } + } + } + } + + grouping one-way-performance-metrics-packet { + description + "One-way packet Performance Metrics (PM) throttle grouping."; + leaf one-way-min-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "One-way minimum delay or latency."; + } + leaf one-way-max-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "One-way maximum delay or latency."; + } + leaf one-way-delay-variation { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "One-way delay variation."; + } + leaf one-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + units "percent"; + default "0"; + description + "One-way packet loss as a percentage of the total traffic + sent over a configurable interval. + + The finest precision is 0.000003%."; + } + } + + grouping one-way-performance-metrics-gauge-packet { + description + "One-way packet Performance Metrics (PM) throttle grouping. + + This grouping is used to report the same metrics defined in + the one-way-performance-metrics-packet grouping, using gauges + instead of uint32 data types and referencing IPPM RFCs + instead of IGP-TE RFCs."; + leaf one-way-min-delay { + type yang:gauge64; + units "microseconds"; + description + "One-way minimum delay or latency."; + } + leaf one-way-max-delay { + type yang:gauge64; + units "microseconds"; + description + "One-way maximum delay or latency."; + reference + "RFC 7679: A One-Way Delay Metric for IP Performance + Metrics (IPPM)"; + } + leaf one-way-delay-variation { + type yang:gauge64; + units "microseconds"; + description + "One-way delay variation."; + reference + "RFC 3393: IP Packet Delay Variation Metric for IP + Performance Metrics (IPPM)"; + } + leaf one-way-packet-loss { + type decimal64 { + fraction-digits 5; + range "0..100"; + } + description + "The ratio of packets dropped to packets transmitted between + two endpoints."; + reference + "RFC 7680: A One-Way Loss Metric for IP Performance + Metrics (IPPM)"; + } + } + + grouping two-way-performance-metrics-packet { + description + "Two-way packet Performance Metrics (PM) throttle grouping."; + leaf two-way-min-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way minimum delay or latency."; + } + leaf two-way-max-delay { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way maximum delay or latency."; + } + leaf two-way-delay-variation { + type uint32 { + range "0..16777215"; + } + units "microseconds"; + default "0"; + description + "Two-way delay variation."; + } + leaf two-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + units "percent"; + default "0"; + description + "Two-way packet loss as a percentage of the total traffic + sent over a configurable interval. + + The finest precision is 0.000003%."; + } + } + + grouping two-way-performance-metrics-gauge-packet { + description + "Two-way packet Performance Metrics (PM) throttle grouping. + + This grouping is used to report the same metrics defined in + the two-way-performance-metrics-packet grouping, using gauges + instead of uint32 data types and referencing IPPM RFCs + instead of IGP-TE RFCs."; + leaf two-way-min-delay { + type yang:gauge64; + units "microseconds"; + description + "Two-way minimum delay or latency."; + reference + "RFC 2681: A Round-trip Delay Metric for IPPM"; + } + leaf two-way-max-delay { + type yang:gauge64; + units "microseconds"; + description + "Two-way maximum delay or latency."; + reference + "RFC 2681: A Round-trip Delay Metric for IPPM"; + } + leaf two-way-delay-variation { + type yang:gauge64; + units "microseconds"; + description + "Two-way delay variation."; + reference + "RFC 5481: Packet Delay Variation Applicability Statement"; + } + leaf two-way-packet-loss { + type decimal64 { + fraction-digits 5; + range "0..100"; + } + description + "The ratio of packets dropped to packets transmitted between + two endpoints."; + } + } + + grouping performance-metrics-throttle-container-packet { + description + "Packet Performance Metrics (PM) threshold grouping."; + uses te-types:performance-metrics-throttle-container { + augment "throttle/threshold-out" { + description + "Performance Metrics (PM) threshold-out packet + augmentation for a generic grouping."; + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + } + augment "throttle/threshold-in" { + description + "Performance Metrics (PM) threshold-in packet augmentation + for a generic grouping."; + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + } + augment "throttle/threshold-accelerated-advertisement" { + description + "Performance Metrics (PM) accelerated advertisement packet + augmentation for a generic grouping."; + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + } + } + } + + grouping bandwidth-profile-parameters { + description + "Common parameters to define bandwidth profiles, also known as + traffic profiles in RFC 2475, that may be used to specify the + temporal properties of a packet stream (e.g., MPLS-TE LSPs), + e.g., as specified in MEF 10, RFC 2697 or RFC 2698."; + reference + "RFC 2475: An Architecture for Differentiated Services + MEF 10.3: Ethernet Services Attributes Phase 3 + RFC 2697: A Single Rate Three Color Marker + RFC 2698: A Two Rate Three Color Marker"; + leaf cir { + type uint64; + units "bits per second"; + description + "Committed Information Rate (CIR)."; + } + leaf cbs { + type uint64; + units "bytes"; + description + "Committed Burst Size (CBS)."; + } + leaf eir { + type uint64; + units "bits per second"; + description + "Excess Information Rate (EIR)."; + } + leaf ebs { + type uint64; + units "bytes"; + description + "Excess Burst Size (EBS)."; + } + leaf pir { + type uint64; + units "bits per second"; + description + "Peak Information Rate (PIR)."; + } + leaf pbs { + type uint64; + units "bytes"; + description + "Peak Burst Size (PBS)."; + } + } + + grouping te-packet-path-bandwidth { + description + "Bandwidth attributes for TE Packet paths."; + container packet-bandwidth { + description + "Bandwidth attributes for TE Packet paths."; + leaf specification-type { + type te-bandwidth-requested-type; + description + "The bandwidth specification type, either explicitly + specified or automatically computed."; + } + leaf set-bandwidth { + when "../specification-type = 'specified-value'" { + description + "When the bandwidth value is explicitly specified."; + } + type bandwidth-kbps; + description + "Set the bandwidth value explicitly, e.g., using offline + calculation."; + } + container bandwidth-profile { + when "../specification-type = 'specified-profile'" { + description + "When the bandwidth profile is explicitly specified."; + } + description + "Set the bandwidth profile attributes explicitly."; + leaf bandwidth-profile-name { + type string; + description + "Name of Bandwidth Profile."; + } + leaf bandwidth-profile-type { + type identityref { + base bandwidth-profile-type; + } + description + "Type of Bandwidth Profile."; + } + uses bandwidth-profile-parameters; + } + leaf class-type { + type te-types:te-ds-class; + description + "The Class-Type of traffic transported by the LSP."; + reference + "RFC 4124: Protocol Extensions for Support of + Diffserv-aware MPLS Traffic Engineering, + Section 4.3.1"; + } + leaf signaled-bandwidth { + type te-packet-types:bandwidth-kbps; + config false; + description + "The currently signaled bandwidth of the LSP. + + In the case where the bandwidth is specified + explicitly, then this will match the value of the + set-bandwidth leaf. + + In the cases where the bandwidth is dynamically + computed by the system, the current value of the + bandwidth should be reflected."; + } + } + } + + grouping te-packet-link-bandwidth { + description + "Bandwidth attributes for Packet TE links."; + leaf packet-bandwidth { + type uint64; + units "bits per second"; + description + "Bandwidth value for Packet TE links."; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang b/src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang similarity index 55% rename from src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang rename to src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang index 6fc0544de..beb464034 100644 --- a/src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang +++ b/src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang @@ -6,18 +6,28 @@ module ietf-te-types { import ietf-inet-types { prefix inet; reference - "RFC 6991: Common YANG Data Types"; + "RFC 9911: Common YANG Data Types, Section 4"; } import ietf-yang-types { prefix yang; reference - "RFC 6991: Common YANG Data Types"; + "RFC 9911: Common YANG Data Types, Section 3"; } import ietf-routing-types { prefix rt-types; reference "RFC 8294: Common YANG Data Types for the Routing Area"; } + import ietf-network { + prefix nw; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + import ietf-network-topology { + prefix nt; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } organization "IETF Traffic Engineering Architecture and Signaling (TEAS) @@ -27,7 +37,7 @@ module ietf-te-types { WG List: Editor: Tarek Saad - + Editor: Rakesh Gandhi @@ -42,9 +52,7 @@ module ietf-te-types { "; description "This YANG module contains a collection of generally useful - YANG data type definitions specific to TE. The model fully - conforms to the Network Management Datastore Architecture - (NMDA). + YANG data type definitions specific to TE. The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', @@ -52,882 +60,553 @@ module ietf-te-types { described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, they appear in all capitals, as shown here. - Copyright (c) 2020 IETF Trust and the persons identified as + Copyright (c) 2026 IETF Trust and the persons identified as authors of the code. All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted pursuant to, and subject to - the license terms contained in, the Simplified BSD License set + the license terms contained in, the Revised BSD License set forth in Section 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info). - This version of this YANG module is part of RFC 8776; see the - RFC itself for full legal notices."; - + All revisions of IETF and IANA published modules can be found + at the YANG Parameters registry group + (https://www.iana.org/assignments/yang-parameters). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2026-01-23 { + description + "This revision adds the following new identities: + - lsp-provisioning-error-reason; + - association-type-diversity; + - tunnel-admin-state-auto; + - lsp-restoration-restore-none; + - restoration-scheme-rerouting; + - path-metric-optimization-type; + - link-path-metric-type; + - link-metric-type and its derived identities; + - path-computation-error-reason and its derived identities; + - protocol-origin-type and its derived identities; + - svec-objective-function-type and its derived identities; + - svec-metric-type and its derived identities. + + This revision adds the following new data types: + - path-type. + + This revision adds the following new groupings: + - explicit-route-hop-with-srlg; + - encoding-and-switching-type; + - te-generic-node-id. + + This revision updates the following identities: + - objective-function-type; + - action-exercise; + - path-metric-type; + - path-metric-te; + - path-metric-igp; + - path-metric-hop; + - path-metric-delay-average; + - path-metric-delay-minimum; + - path-metric-residual-bandwidth; + - path-metric-optimize-includes; + - path-metric-optimize-excludes; + - te-optimization-criterion. + + This revision updates the following data types: + - te-node-id. + + This revision updates the following groupings: + - explicit-route-hop: + - adds the following leaves: + - node-id-uri; + - link-tp-id-uri; + - updates the following leaves: + - node-id; + - link-tp-id; + - record-route-state: + - adds the following leaves: + - node-id-uri; + - link-tp-id-uri; + - updates the following leaves: + - node-id; + - link-tp-id; + - optimization-metric-entry: + - updates the following leaves: + - metric-type; + - tunnel-constraints; + - adds the following leaves: + - network-id; + - path-constraints-route-objects: + - updates the following containers: + - explicit-route-objects-always; + - generic-path-metric-bounds: + - updates the following leaves: + - metric-type; + - generic-path-optimization + - adds the following leaves: + - tiebreaker; + - deprecate the following containers: + - tiebreakers. + + This revision obsoletes the following identities: + - of-minimize-agg-bandwidth-consumption; + - of-minimize-load-most-loaded-link; + - of-minimize-cost-path-set; + - lsp-protection-reroute-extra; + - lsp-protection-reroute. + + This revision provides also few editorial changes."; + reference + "RFC XXXX: Common YANG Data Types for Traffic Engineering"; + } revision 2020-06-10 { description - "Latest revision of TE types."; + "Initial Version of TE types."; reference "RFC 8776: Common YANG Data Types for Traffic Engineering"; } - /** - * Typedefs + /* + * Features */ - typedef admin-group { - type yang:hex-string { - /* 01:02:03:04 */ - length "1..11"; - } + feature p2mp-te { description - "Administrative group / resource class / color representation - in 'hex-string' type. - The most significant byte in the hex-string is the farthest - to the left in the byte sequence. Leading zero bytes in the - configured value may be omitted for brevity."; + "Indicates support for Point-to-Multipoint TE (P2MP-TE)."; reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2 - RFC 5305: IS-IS Extensions for Traffic Engineering - RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; + "RFC 4875: Extensions to Resource Reservation Protocol - + Traffic Engineering (RSVP-TE) for + Point-to-Multipoint TE Label Switched Paths (LSPs)"; } - typedef admin-groups { - type union { - type admin-group; - type extended-admin-group; - } + feature frr-te { description - "Derived types for TE administrative groups."; + "Indicates support for TE Fast Reroute (FRR)."; + reference + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; } - typedef extended-admin-group { - type yang:hex-string; + feature extended-admin-groups { description - "Extended administrative group / resource class / color - representation in 'hex-string' type. - The most significant byte in the hex-string is the farthest - to the left in the byte sequence. Leading zero bytes in the - configured value may be omitted for brevity."; + "Indicates support for TE link extended administrative + groups."; reference "RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; + Engineering (MPLS-TE)"; } - typedef path-attribute-flags { - type union { - type identityref { - base session-attributes-flags; - } - type identityref { - base lsp-attributes-flags; - } - } + feature named-path-affinities { description - "Path attributes flags type."; + "Indicates support for named path affinities."; } - typedef performance-metrics-normality { - type enumeration { - enum unknown { - value 0; - description - "Unknown."; - } - enum normal { - value 1; - description - "Normal. Indicates that the anomalous bit is not set."; - } - enum abnormal { - value 2; - description - "Abnormal. Indicates that the anomalous bit is set."; - } - } + feature named-extended-admin-groups { description - "Indicates whether a performance metric is normal (anomalous - bit not set), abnormal (anomalous bit set), or unknown."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + "Indicates support for named extended administrative groups."; } - typedef srlg { - type uint32; + feature named-srlg-groups { description - "SRLG type."; - reference - "RFC 4203: OSPF Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS) - RFC 5307: IS-IS Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS)"; + "Indicates support for named Shared Risk Link Group (SRLG)."; } - typedef te-common-status { - type enumeration { - enum up { - description - "Enabled."; - } - enum down { - description - "Disabled."; - } - enum testing { - description - "In some test mode."; - } - enum preparing-maintenance { - description - "The resource is disabled in the control plane to prepare - for a graceful shutdown for maintenance purposes."; - reference - "RFC 5817: Graceful Shutdown in MPLS and Generalized MPLS - Traffic Engineering Networks"; - } - enum maintenance { - description - "The resource is disabled in the data plane for maintenance - purposes."; - } - enum unknown { - description - "Status is unknown."; - } - } + feature named-path-constraints { description - "Defines a type representing the common states of a TE - resource."; + "Indicates support for named path constraints."; } - typedef te-bandwidth { - type string { - pattern '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' - + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' - + '[pP](\+)?(12[0-7]|' - + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+' - + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' - + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' - + '[pP](\+)?(12[0-7]|' - + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*'; - } + feature path-optimization-metric { description - "This is the generic bandwidth type. It is a string containing - a list of numbers separated by commas, where each of these - numbers can be non-negative decimal, hex integer, or - hex float: + "Indicates support for path optimization metrics."; + } - (dec | hex | float)[*(','(dec | hex | float))] + feature path-optimization-objective-function { + description + "Indicates support for path optimization objective functions."; + } - For the packet-switching type, the string encoding follows - the type 'bandwidth-ieee-float32' as defined in RFC 8294 - (e.g., 0x1p10), where the units are in bytes per second. + /* + * Identities + */ - For the Optical Transport Network (OTN) switching type, - a list of integers can be used, such as '0,2,3,1', indicating - two ODU0s and one ODU3. ('ODU' stands for 'Optical Data - Unit'.) For Dense Wavelength Division Multiplexing (DWDM), - a list of pairs of slot numbers and widths can be used, - such as '0,2,3,3', indicating a frequency slot 0 with - slot width 2 and a frequency slot 3 with slot width 3. - Canonically, the string is represented as all lowercase and in - hex, where the prefix '0x' precedes the hex number."; - reference - "RFC 8294: Common YANG Data Types for the Routing Area - ITU-T Recommendation G.709: Interfaces for the - optical transport network"; + identity lsp-provisioning-error-reason { + description + "Base identity for LSP provisioning errors."; } - typedef te-ds-class { - type uint8 { - range "0..7"; - } + identity session-attributes-flags { description - "The Differentiated Services Class-Type of traffic."; + "Base identity for the RSVP-TE session attributes flags."; + } + + identity local-protection-desired { + base session-attributes-flags; + description + "Local protection is desired."; reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering, Section 4.3.1"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.7.1"; } - typedef te-global-id { - type uint32; + identity se-style-desired { + base session-attributes-flags; description - "An identifier to uniquely identify an operator, which can be - either a provider or a client. - The definition of this type is taken from RFCs 6370 and 5003. - This attribute type is used solely to provide a globally - unique context for TE topologies."; + "Shared explicit style, to allow the LSP to be established + and share resources with the old LSP."; reference - "RFC 5003: Attachment Individual Identifier (AII) Types for - Aggregation - RFC 6370: MPLS Transport Profile (MPLS-TP) Identifiers"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; } - typedef te-hop-type { - type enumeration { - enum loose { - description - "A loose hop in an explicit path."; - } - enum strict { - description - "A strict hop in an explicit path."; - } - } + identity local-recording-desired { + base session-attributes-flags; description - "Enumerated type for specifying loose or strict paths."; + "Label recording is desired."; reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3.3"; + Section 4.7.1"; } - typedef te-link-access-type { - type enumeration { - enum point-to-point { - description - "The link is point-to-point."; - } - enum multi-access { - description - "The link is multi-access, including broadcast and NBMA."; - } - } + identity bandwidth-protection-desired { + base session-attributes-flags; description - "Defines a type representing the access type of a TE link."; + "Requests FRR bandwidth protection on LSRs, if present."; reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels"; } - typedef te-label-direction { - type enumeration { - enum forward { - description - "Label allocated for the forward LSP direction."; - } - enum reverse { - description - "Label allocated for the reverse LSP direction."; - } - } + identity node-protection-desired { + base session-attributes-flags; description - "Enumerated type for specifying the forward or reverse - label."; + "Requests FRR node protection on LSRs, if present."; + reference + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels"; } - typedef te-link-direction { - type enumeration { - enum incoming { - description - "The explicit route represents an incoming link on - a node."; - } - enum outgoing { - description - "The explicit route represents an outgoing link on - a node."; - } - } + identity path-reevaluation-request { + base session-attributes-flags; description - "Enumerated type for specifying the direction of a link on - a node."; + "Indicates that a path re-evaluation (of the + current path in use) is requested. + + Note that this does not trigger any LSP reroutes but + instead just signals a request to evaluate whether a + preferable path exists."; + reference + "RFC 4736: Reoptimization of Multiprotocol Label Switching + (MPLS) Traffic Engineering (TE) Loosely Routed + Label Switched Path (LSP)"; } - typedef te-metric { - type uint32; + identity soft-preemption-desired { + base session-attributes-flags; description - "TE metric."; + "Soft preemption of LSP resources is desired."; reference - "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a - second MPLS Traffic Engineering (TE) Metric"; + "RFC 5712: MPLS Traffic Engineering Soft Preemption"; } - typedef te-node-id { - type yang:dotted-quad; + identity lsp-attributes-flags { description - "A type representing the identifier for a node in a TE - topology. - The identifier is represented as 4 octets in dotted-quad - notation. - This attribute MAY be mapped to the Router Address TLV - described in Section 2.4.1 of RFC 3630, the TE Router ID - described in Section 3 of RFC 6827, the Traffic Engineering - Router ID TLV described in Section 4.3 of RFC 5305, or the - TE Router ID TLV described in Section 3.2.1 of RFC 6119. - The reachability of such a TE node MAY be achieved by a - mechanism such as that described in Section 6.2 of RFC 6827."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2, Section 2.4.1 - RFC 5305: IS-IS Extensions for Traffic Engineering, - Section 4.3 - RFC 6119: IPv6 Traffic Engineering in IS-IS, Section 3.2.1 - RFC 6827: Automatically Switched Optical Network (ASON) - Routing for OSPFv2 Protocols, Section 3"; + "Base identity for LSP attributes flags."; } - typedef te-oper-status { - type te-common-status; + identity end-to-end-rerouting-desired { + base lsp-attributes-flags; description - "Defines a type representing the operational status of - a TE resource."; + "Indicates end-to-end rerouting behavior for an LSP + undergoing establishment. + + This MAY also be used to specify the behavior of end-to-end + LSP recovery for established LSPs."; + reference + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol Traffic + Engineering (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-admin-status { - type te-common-status; + identity boundary-rerouting-desired { + base lsp-attributes-flags; description - "Defines a type representing the administrative status of - a TE resource."; + "Indicates boundary rerouting behavior for an LSP undergoing + establishment. + + This MAY also be used to specify segment-based LSP recovery + through nested crankback for established LSPs. + + The boundary Area Border Router (ABR) / Autonomous System + Border Router (ASBR) can decide to forward the PathErr + message upstream to either an upstream boundary ABR/ASBR or + the ingress LSR. + + Alternatively, it can try to select another egress boundary + LSR."; + reference + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol Traffic + Engineering (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-path-disjointness { - type bits { - bit node { - position 0; - description - "Node disjoint."; - } - bit link { - position 1; - description - "Link disjoint."; - } - bit srlg { - position 2; - description - "SRLG (Shared Risk Link Group) disjoint."; - } - } + identity segment-based-rerouting-desired { + base lsp-attributes-flags; description - "Type of the resource disjointness for a TE tunnel path."; + "Indicates segment-based rerouting behavior for an LSP + undergoing establishment. + + This MAY also be used to specify segment-based LSP recovery + for established LSPs."; reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol + Traffic Engineering (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-recovery-status { - type enumeration { - enum normal { - description - "Both the recovery span and the working span are fully - allocated and active, data traffic is being - transported over (or selected from) the working - span, and no trigger events are reported."; - } - enum recovery-started { - description - "The recovery action has been started but not completed."; - } - enum recovery-succeeded { - description - "The recovery action has succeeded. The working span has - reported a failure/degrade condition, and the user traffic - is being transported (or selected) on the recovery span."; - } - enum recovery-failed { - description - "The recovery action has failed."; - } - enum reversion-started { - description - "The reversion has started."; - } - enum reversion-succeeded { - description - "The reversion action has succeeded."; - } - enum reversion-failed { - description - "The reversion has failed."; - } - enum recovery-unavailable { - description - "The recovery is unavailable, as a result of either an - operator's lockout command or a failure condition - detected on the recovery span."; - } - enum recovery-admin { - description - "The operator has issued a command to switch the user - traffic to the recovery span."; - } - enum wait-to-restore { - description - "The recovery domain is recovering from a failure/degrade - condition on the working span that is being controlled by - the Wait-to-Restore (WTR) timer."; - } - } + identity lsp-integrity-required { + base lsp-attributes-flags; description - "Defines the status of a recovery action."; + "Indicates that LSP integrity is required."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS) - RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection"; + "RFC 4875: Extensions to Resource Reservation Protocol - + Traffic Engineering (RSVP-TE) for + Point-to-Multipoint TE Label Switched Paths (LSPs) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-template-name { - type string { - pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; - } + identity contiguous-lsp-desired { + base lsp-attributes-flags; description - "A type for the name of a TE node template or TE link - template."; + "Indicates that a contiguous LSP is desired."; + reference + "RFC 5151: Inter-Domain MPLS and GMPLS Traffic Engineering -- + Resource Reservation Protocol-Traffic Engineering + (RSVP-TE) Extensions + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-topology-event-type { - type enumeration { - enum add { - value 0; - description - "A TE node or TE link has been added."; - } - enum remove { - value 1; - description - "A TE node or TE link has been removed."; - } - enum update { - value 2; - description - "A TE node or TE link has been updated."; - } - } + identity lsp-stitching-desired { + base lsp-attributes-flags; description - "TE event type for notifications."; + "Indicates that LSP stitching is desired."; + reference + "RFC 5150: Label Switched Path Stitching with Generalized + Multiprotocol Label Switching Traffic Engineering + (GMPLS TE) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-topology-id { - type union { - type string { - length "0"; - // empty string - } - type string { - pattern '([a-zA-Z0-9\-_.]+:)*' - + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; - } - } + identity pre-planned-lsp-flag { + base lsp-attributes-flags; description - "An identifier for a topology. - It is optional to have one or more prefixes at the beginning, - separated by colons. The prefixes can be 'network-types' as - defined in the 'ietf-network' module in RFC 8345, to help the - user better understand the topology before further inquiry - is made."; + "Indicates that the LSP MUST be provisioned in the + control plane only."; reference - "RFC 8345: A YANG Data Model for Network Topologies"; + "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions for + Multi-Layer and Multi-Region Networks (MLN/MRN) + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - typedef te-tp-id { - type union { - type uint32; - // Unnumbered - type inet:ip-address; - // IPv4 or IPv6 address - } + identity non-php-behavior-flag { + base lsp-attributes-flags; description - "An identifier for a TE link endpoint on a node. - This attribute is mapped to a local or remote link identifier - as defined in RFCs 3630 and 5305."; + "Indicates that non-PHP (non-Penultimate Hop Popping) + behavior for the LSP is desired."; reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2 - RFC 5305: IS-IS Extensions for Traffic Engineering"; + "RFC 6511: Non-Penultimate Hop Popping Behavior and + Out-of-Band Mapping for RSVP-TE Label Switched + Paths + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - /* TE features */ - - feature p2mp-te { + identity oob-mapping-flag { + base lsp-attributes-flags; description - "Indicates support for Point-to-Multipoint TE (P2MP-TE)."; + "Indicates that signaling of the egress binding information + is out of band (e.g., via the Border Gateway Protocol + (BGP))."; reference - "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE - Label Switched Paths (LSPs)"; + "RFC 6511: Non-Penultimate Hop Popping Behavior and + Out-of-Band Mapping for RSVP-TE Label Switched + Paths + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - feature frr-te { + identity entropy-label-capability { + base lsp-attributes-flags; description - "Indicates support for TE Fast Reroute (FRR)."; + "Indicates entropy label capability."; reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; + "RFC 6790: The Use of Entropy Labels in MPLS Forwarding + RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO)"; } - feature extended-admin-groups { + identity oam-mep-entity-desired { + base lsp-attributes-flags; description - "Indicates support for TE link extended administrative - groups."; + "OAM Maintenance Entity Group End Point (MEP) entities + desired."; reference - "RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; + "RFC 7260: GMPLS RSVP-TE Extensions for Operations, + Administration, and Maintenance (OAM) + Configuration"; } - feature named-path-affinities { + identity oam-mip-entity-desired { + base lsp-attributes-flags; description - "Indicates support for named path affinities."; + "OAM Maintenance Entity Group Intermediate Points (MIP) + entities desired."; + reference + "RFC 7260: GMPLS RSVP-TE Extensions for Operations, + Administration, and Maintenance (OAM) + Configuration"; } - feature named-extended-admin-groups { + identity srlg-collection-desired { + base lsp-attributes-flags; description - "Indicates support for named extended administrative groups."; + "Shared Risk Link Group (SRLG) collection desired."; + reference + "RFC 7570: Label Switched Path (LSP) Attribute in the + Explicit Route Object (ERO) + RFC 8001: RSVP-TE Extensions for Collecting Shared Risk + Link Group (SRLG) Information"; } - feature named-srlg-groups { + identity loopback-desired { + base lsp-attributes-flags; description - "Indicates support for named SRLG groups."; + "Indicates that a particular node on the LSP is + required to enter loopback mode. + + This can also be used to specify the loopback state of the + node."; + reference + "RFC 7571: GMPLS RSVP-TE Extensions for Lock Instruct and + Loopback"; } - feature named-path-constraints { + identity p2mp-te-tree-eval-request { + base lsp-attributes-flags; description - "Indicates support for named path constraints."; + "P2MP-TE tree re-evaluation request."; + reference + "RFC 8149: RSVP Extensions for Reoptimization of Loosely + Routed Point-to-Multipoint Traffic Engineering + Label Switched Paths (LSPs)"; } - feature path-optimization-metric { + identity rtm-set-desired { + base lsp-attributes-flags; description - "Indicates support for path optimization metrics."; + "Residence Time Measurement (RTM) attribute flag requested."; + reference + "RFC 8169: Residence Time Measurement in MPLS Networks"; } - feature path-optimization-objective-function { + identity link-protection-type { description - "Indicates support for path optimization objective functions."; + "Base identity for the link protection type."; + reference + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } - /* - * Identities - */ - - identity session-attributes-flags { + identity link-protection-unprotected { + base link-protection-type; description - "Base identity for the RSVP-TE session attributes flags."; + "'Unprotected' link protection type."; + reference + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } - identity local-protection-desired { - base session-attributes-flags; + identity link-protection-extra-traffic { + base link-protection-type; description - "Local protection is desired."; + "'Extra-Traffic' link protection type."; reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.7.1"; - } - - identity se-style-desired { - base session-attributes-flags; - description - "Shared explicit style, to allow the LSP to be established - and share resources with the old LSP."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - - identity local-recording-desired { - base session-attributes-flags; - description - "Label recording is desired."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.7.1"; - } - - identity bandwidth-protection-desired { - base session-attributes-flags; - description - "Requests FRR bandwidth protection on LSRs, if present."; - reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; - } - - identity node-protection-desired { - base session-attributes-flags; - description - "Requests FRR node protection on LSRs, if present."; - reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; - } - - identity path-reevaluation-request { - base session-attributes-flags; - description - "This flag indicates that a path re-evaluation (of the - current path in use) is requested. Note that this does - not trigger any LSP reroutes but instead just signals a - request to evaluate whether a preferable path exists."; - reference - "RFC 4736: Reoptimization of Multiprotocol Label Switching - (MPLS) Traffic Engineering (TE) Loosely Routed Label Switched - Path (LSP)"; - } - - identity soft-preemption-desired { - base session-attributes-flags; - description - "Soft preemption of LSP resources is desired."; - reference - "RFC 5712: MPLS Traffic Engineering Soft Preemption"; - } - - identity lsp-attributes-flags { - description - "Base identity for LSP attributes flags."; - } - - identity end-to-end-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates end-to-end rerouting behavior for an LSP - undergoing establishment. This MAY also be used to - specify the behavior of end-to-end LSP recovery for - established LSPs."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol Traffic Engineering - (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity boundary-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates boundary rerouting behavior for an LSP undergoing - establishment. This MAY also be used to specify - segment-based LSP recovery through nested crankback for - established LSPs. The boundary Area Border Router (ABR) / - Autonomous System Border Router (ASBR) can decide to forward - the PathErr message upstream to either an upstream boundary - ABR/ASBR or the ingress LSR. Alternatively, it can try to - select another egress boundary LSR."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol Traffic Engineering - (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity segment-based-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates segment-based rerouting behavior for an LSP - undergoing establishment. This MAY also be used to specify - segment-based LSP recovery for established LSPs."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol Traffic Engineering - (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity lsp-integrity-required { - base lsp-attributes-flags; - description - "Indicates that LSP integrity is required."; - reference - "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE - Label Switched Paths (LSPs) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity contiguous-lsp-desired { - base lsp-attributes-flags; - description - "Indicates that a contiguous LSP is desired."; - reference - "RFC 5151: Inter-Domain MPLS and GMPLS Traffic Engineering -- - Resource Reservation Protocol-Traffic Engineering (RSVP-TE) - Extensions - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity lsp-stitching-desired { - base lsp-attributes-flags; - description - "Indicates that LSP stitching is desired."; - reference - "RFC 5150: Label Switched Path Stitching with Generalized - Multiprotocol Label Switching Traffic Engineering (GMPLS TE) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity pre-planned-lsp-flag { - base lsp-attributes-flags; - description - "Indicates that the LSP MUST be provisioned in the - control plane only."; - reference - "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions for - Multi-Layer and Multi-Region Networks (MLN/MRN) - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity non-php-behavior-flag { - base lsp-attributes-flags; - description - "Indicates that non-PHP (non-Penultimate Hop Popping) behavior - for the LSP is desired."; - reference - "RFC 6511: Non-Penultimate Hop Popping Behavior and Out-of-Band - Mapping for RSVP-TE Label Switched Paths - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity oob-mapping-flag { - base lsp-attributes-flags; - description - "Indicates that signaling of the egress binding information is - out of band (e.g., via the Border Gateway Protocol (BGP))."; - reference - "RFC 6511: Non-Penultimate Hop Popping Behavior and Out-of-Band - Mapping for RSVP-TE Label Switched Paths - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity entropy-label-capability { - base lsp-attributes-flags; - description - "Indicates entropy label capability."; - reference - "RFC 6790: The Use of Entropy Labels in MPLS Forwarding - RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO)"; - } - - identity oam-mep-entity-desired { - base lsp-attributes-flags; - description - "OAM Maintenance Entity Group End Point (MEP) entities - desired."; - reference - "RFC 7260: GMPLS RSVP-TE Extensions for Operations, - Administration, and Maintenance (OAM) Configuration"; - } - - identity oam-mip-entity-desired { - base lsp-attributes-flags; - description - "OAM Maintenance Entity Group Intermediate Points (MIP) - entities desired."; - reference - "RFC 7260: GMPLS RSVP-TE Extensions for Operations, - Administration, and Maintenance (OAM) Configuration"; - } - - identity srlg-collection-desired { - base lsp-attributes-flags; - description - "SRLG collection desired."; - reference - "RFC 7570: Label Switched Path (LSP) Attribute in the Explicit - Route Object (ERO) - RFC 8001: RSVP-TE Extensions for Collecting Shared Risk - Link Group (SRLG) Information"; - } - - identity loopback-desired { - base lsp-attributes-flags; - description - "This flag indicates that a particular node on the LSP is - required to enter loopback mode. This can also be - used to specify the loopback state of the node."; - reference - "RFC 7571: GMPLS RSVP-TE Extensions for Lock Instruct and - Loopback"; - } - - identity p2mp-te-tree-eval-request { - base lsp-attributes-flags; - description - "P2MP-TE tree re-evaluation request."; - reference - "RFC 8149: RSVP Extensions for Reoptimization of Loosely Routed - Point-to-Multipoint Traffic Engineering Label Switched Paths - (LSPs)"; - } - - identity rtm-set-desired { - base lsp-attributes-flags; - description - "Residence Time Measurement (RTM) attribute flag requested."; - reference - "RFC 8169: Residence Time Measurement in MPLS Networks"; - } - - identity link-protection-type { - description - "Base identity for the link protection type."; - } - - identity link-protection-unprotected { - base link-protection-type; - description - "Unprotected link type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; - } - - identity link-protection-extra-traffic { - base link-protection-type; - description - "Extra-Traffic protected link type."; - reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } identity link-protection-shared { base link-protection-type; description - "Shared protected link type."; + "'Shared' link protection type."; reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } identity link-protection-1-for-1 { base link-protection-type; description - "One-for-one (1:1) protected link type."; + "'Dedicated 1:1' link protection type."; reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } identity link-protection-1-plus-1 { base link-protection-type; description - "One-plus-one (1+1) protected link type."; + "'Dedicated 1+1' link protection type."; reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } identity link-protection-enhanced { base link-protection-type; description - "A compound link protection type derived from the underlay - TE tunnel protection configuration supporting the TE link."; + "'Enhanced' link protection type."; + reference + "RFC 4202: Routing Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS), + section 2.2 + RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description, section 7"; } identity association-type { @@ -942,7 +621,8 @@ module ietf-te-types { same tunnel for recovery."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery RFC 6780: RSVP ASSOCIATION Object Extensions"; } @@ -964,7 +644,7 @@ module ietf-te-types { independently configured on either endpoint."; reference "RFC 7551: RSVP-TE Extensions for Associated Bidirectional - Label Switched Paths (LSPs)"; + Label Switched Paths (LSPs)"; } identity association-type-single-sided-bidir { @@ -977,12 +657,23 @@ module ietf-te-types { reference "RFC 6780: RSVP ASSOCIATION Object Extensions RFC 7551: RSVP-TE Extensions for Associated Bidirectional - Label Switched Paths (LSPs)"; + Label Switched Paths (LSPs)"; + } + + identity association-type-diversity { + base association-type; + description + "Association Type diversity used to associate LSPs whose + paths are to be diverse from each other."; + reference + "RFC 8800: Path Computation Element Communication Protocol + (PCEP) Extension for Label Switched Path (LSP) + Diversity Constraint Signaling"; } identity objective-function-type { description - "Base objective function type."; + "Base identity for path objective function types."; } identity of-minimize-cost-path { @@ -991,7 +682,8 @@ module ietf-te-types { "Objective function for minimizing path cost."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity of-minimize-load-path { @@ -1001,7 +693,8 @@ module ietf-te-types { paths."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity of-maximize-residual-bandwidth { @@ -1010,36 +703,55 @@ module ietf-te-types { "Objective function for maximizing residual bandwidth."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity of-minimize-agg-bandwidth-consumption { base objective-function-type; + status obsolete; description "Objective function for minimizing aggregate bandwidth - consumption."; + consumption. + + This identity has been obsoleted: the + 'svec-of-minimize-agg-bandwidth-consumption' identity SHOULD + be used instead."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity of-minimize-load-most-loaded-link { base objective-function-type; + status obsolete; description "Objective function for minimizing the load on the link that - is carrying the highest load."; + is carrying the highest load. + + This identity has been obsoleted: the + 'svec-of-minimize-load-most-loaded-link' identity SHOULD + be used instead."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity of-minimize-cost-path-set { base objective-function-type; + status obsolete; description - "Objective function for minimizing the cost on a path set."; + "Objective function for minimizing the cost on a path set. + + This identity has been obsoleted: the + 'svec-of-minimize-cost-path-set' identity SHOULD + be used instead."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity path-computation-method { @@ -1053,8 +765,8 @@ module ietf-te-types { "Indicates a constrained-path LSP in which the path is computed by the local LER."; reference - "RFC 3272: Overview and Principles of Internet Traffic - Engineering, Section 5.4"; + "RFC 9522: Overview and Principles of Internet Traffic + Engineering, Section 4.4"; } identity path-externally-queried { @@ -1064,14 +776,15 @@ module ietf-te-types { querying an external source, such as a PCE server. In the case that an LSP is defined to be externally queried, it may also have associated explicit definitions (provided - to the external source to aid computation). The path that is - returned by the external source may require further local - computation on the device."; + to the external source to aid computation). + + The path that is returned by the external source may + require further local computation on the device."; reference - "RFC 3272: Overview and Principles of Internet Traffic - Engineering + "RFC 9522: Overview and Principles of Internet Traffic + Engineering RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; + Protocol Generic Requirements"; } identity path-explicitly-defined { @@ -1082,8 +795,8 @@ module ietf-te-types { hops."; reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 3272: Overview and Principles of Internet Traffic - Engineering"; + RFC 9522: Overview and Principles of Internet Traffic + Engineering"; } identity lsp-metric-type { @@ -1099,7 +812,7 @@ module ietf-te-types { cost to the LSP's tail end."; reference "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; + Protocol Generic Requirements"; } identity lsp-metric-absolute { @@ -1109,7 +822,7 @@ module ietf-te-types { refers is specified as an absolute value."; reference "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; + Protocol Generic Requirements"; } identity lsp-metric-inherited { @@ -1120,7 +833,7 @@ module ietf-te-types { from the IGP cost."; reference "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; + Protocol Generic Requirements"; } identity te-tunnel-type { @@ -1142,8 +855,9 @@ module ietf-te-types { "TE P2MP tunnel type."; reference "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE - Label Switched Paths (LSPs)"; + Traffic Engineering (RSVP-TE) for + Point-to-Multipoint TE Label Switched Paths + (LSPs)"; } identity tunnel-action-type { @@ -1214,6 +928,15 @@ module ietf-te-types { "Tunnel's administrative state is down."; } + identity tunnel-admin-state-auto { + base tunnel-admin-state-type; + description + "Tunnel administrative auto state. The administrative status + in state datastore transitions to 'tunnel-admin-up' when the + tunnel used by the client layer, and to 'tunnel-admin-down' + when it is not used by the client layer."; + } + identity tunnel-state-type { description "Base identity for TE tunnel states."; @@ -1302,7 +1025,7 @@ module ietf-te-types { valid, but any packet mapped over the tunnel is dropped."; reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 2.5"; + Section 2.5"; } identity path-invalidation-action-teardown { @@ -1311,7 +1034,7 @@ module ietf-te-types { "TE path invalidation action teardown."; reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 2.5"; + Section 2.5"; } identity lsp-restoration-type { @@ -1319,6 +1042,12 @@ module ietf-te-types { "Base identity from which LSP restoration types are derived."; } + identity lsp-restoration-restore-none { + base lsp-restoration-type; + description + "No LSP affected by a failure is restored."; + } + identity lsp-restoration-restore-any { base lsp-restoration-type; description @@ -1337,31 +1066,55 @@ module ietf-te-types { "Base identity for LSP restoration schemes."; } - identity restoration-scheme-preconfigured { + identity restoration-scheme-rerouting { base restoration-scheme-type; description - "Restoration LSP is preconfigured prior to the failure."; + "Restoration LSP is computed, signalled and configured after + the failure detection. + + This restoration scheme is also known as + 'Full LSP Re-routing', with the alternate route being + computed after the failure occurs."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 11"; + } + + identity restoration-scheme-preconfigured { + base restoration-scheme-type; + description + "Restoration LSP is precomputed, presignalled and + preconfigured prior to the failure."; } identity restoration-scheme-precomputed { base restoration-scheme-type; description - "Restoration LSP is precomputed prior to the failure."; + "Restoration LSP is precomputed, but not presignalled nor + preconfigured, prior to the failure. + + This restoration scheme is also known as + 'Full LSP Re-routing', with the alternate route being + precomputed and stored for use when the failure occurs."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 11"; } identity restoration-scheme-presignaled { base restoration-scheme-type; description - "Restoration LSP is presignaled prior to the failure."; + "Restoration LSP is presignaled, but not preconfigured, + prior to the failure. + + This restoration scheme is also known as + 'Pre-planned LSP Re-routing'."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 8"; } identity lsp-protection-type { @@ -1369,7 +1122,8 @@ module ietf-te-types { "Base identity from which LSP protection types are derived."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery"; } identity lsp-protection-unprotected { @@ -1378,25 +1132,39 @@ module ietf-te-types { "'Unprotected' LSP protection type."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery"; } identity lsp-protection-reroute-extra { base lsp-protection-type; + status obsolete; description - "'(Full) Rerouting' LSP protection type."; + "'(Full) Rerouting' LSP protection type. + + This identity has been obsoleted: the + 'restoration-scheme-rerouting' or + 'restoration-scheme-precomputed' identity SHOULD be used + instead."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 11"; } identity lsp-protection-reroute { base lsp-protection-type; + status obsolete; description - "'Rerouting without Extra-Traffic' LSP protection type."; + "'Rerouting without Extra-Traffic' LSP protection type. + + This identity has been obsoleted: the + 'restoration-scheme-presignaled' identity SHOULD be used + instead."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 8"; } identity lsp-protection-1-for-n { @@ -1405,7 +1173,8 @@ module ietf-te-types { "'1:N Protection with Extra-Traffic' LSP protection type."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 7.3"; } identity lsp-protection-1-for-1 { @@ -1414,7 +1183,8 @@ module ietf-te-types { "LSP protection '1:1 Protection Type'."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 7"; } identity lsp-protection-unidir-1-plus-1 { @@ -1423,7 +1193,8 @@ module ietf-te-types { "'1+1 Unidirectional Protection' LSP protection type."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 5"; } identity lsp-protection-bidir-1-plus-1 { @@ -1432,7 +1203,8 @@ module ietf-te-types { "'1+1 Bidirectional Protection' LSP protection type."; reference "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 6"; } identity lsp-protection-extra-traffic { @@ -1440,8 +1212,9 @@ module ietf-te-types { description "Extra-Traffic LSP protection type."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery, section 7"; } identity lsp-protection-state { @@ -1453,6 +1226,11 @@ module ietf-te-types { base lsp-protection-state; description "Normal state."; + reference + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity signal-fail-of-protection { @@ -1462,8 +1240,10 @@ module ietf-te-types { that is of higher priority than the forced switchover command."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity lockout-of-protection { @@ -1471,8 +1251,10 @@ module ietf-te-types { description "A Loss of Protection (LoP) command is active."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity forced-switch { @@ -1480,8 +1262,10 @@ module ietf-te-types { description "A forced switchover command is active."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity signal-fail { @@ -1490,8 +1274,10 @@ module ietf-te-types { "There is a signal fail condition on either the working path or the protection path."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity signal-degrade { @@ -1500,8 +1286,10 @@ module ietf-te-types { "There is a signal degrade condition on either the working path or the protection path."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity manual-switch { @@ -1509,17 +1297,21 @@ module ietf-te-types { description "A manual switchover command is active."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity wait-to-restore { base lsp-protection-state; description - "A WTR timer is running."; + "A Wait-to-Restore (WTR) timer is running."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity do-not-revert { @@ -1528,8 +1320,10 @@ module ietf-te-types { "A Do Not Revert (DNR) condition is active because of non-revertive behavior."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity failure-of-protocol { @@ -1538,8 +1332,13 @@ module ietf-te-types { "LSP protection is not working because of a protocol failure condition."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection + to Match the Operational Expectations of + Synchronous Digital Hierarchy, Optical Transport + Network, and Ethernet Transport Network Operators + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity protection-external-commands { @@ -1555,8 +1354,13 @@ module ietf-te-types { command that prevents any switchover action from being taken and, as such, freezes the current state."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection + to Match the Operational Expectations of + Synchronous Digital Hierarchy, Optical Transport + Network, and Ethernet Transport Network Operators + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity clear-freeze { @@ -1564,8 +1368,13 @@ module ietf-te-types { description "An action that clears the active freeze state."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection + to Match the Operational Expectations of + Synchronous Digital Hierarchy, Optical Transport + Network, and Ethernet Transport Network Operators + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity action-lockout-of-normal { @@ -1575,8 +1384,12 @@ module ietf-te-types { command to ensure that the normal traffic is not allowed to use the protection transport entity."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity clear-lockout-of-normal { @@ -1585,8 +1398,12 @@ module ietf-te-types { "An action that clears the active lockout of the normal state."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity action-lockout-of-protection { @@ -1597,55 +1414,78 @@ module ietf-te-types { temporarily not available to transport a traffic signal (either normal or Extra-Traffic)."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity action-forced-switch { base protection-external-commands; description - "A switchover action initiated by an operator command to switch - the Extra-Traffic signal, the normal traffic signal, or the - null signal to the protection transport entity, unless a - switchover command of equal or higher priority is in effect."; + "A switchover action initiated by an operator command to + switch the Extra-Traffic signal, the normal traffic signal, + or the null signal to the protection transport entity, + unless a switchover command of equal or higher priority is + in effect."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity action-manual-switch { base protection-external-commands; description - "A switchover action initiated by an operator command to switch - the Extra-Traffic signal, the normal traffic signal, or - the null signal to the protection transport entity, unless - a fault condition exists on other transport entities or a - switchover command of equal or higher priority is in effect."; + "A switchover action initiated by an operator command to + switch the Extra-Traffic signal, the normal traffic signal, + or the null signal to the protection transport entity, + unless a fault condition exists on other transport entities + or a switchover command of equal or higher priority is in + effect."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity action-exercise { base protection-external-commands; description - "An action that starts testing whether or not APS communication - is operating correctly. It is of lower priority than any - other state or command."; + "An action that starts testing whether or not Automatic + Protection Switching (APS) communication is operating + correctly. + + It is of lower priority than any other state or command."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection + to Match the Operational Expectations of + Synchronous Digital Hierarchy, Optical Transport + Network, and Ethernet Transport Network Operators + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity clear { base protection-external-commands; description "An action that clears the active near-end lockout of a - protection, forced switchover, manual switchover, WTR state, - or exercise command."; + protection, forced switchover, manual switchover, + Wait-to-Restore (WTR) state, or exercise command."; reference - "RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching (GMPLS)"; + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; } identity switching-capabilities { @@ -1653,7 +1493,7 @@ module ietf-te-types { "Base identity for interface switching capabilities."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity switching-psc1 { @@ -1662,7 +1502,7 @@ module ietf-te-types { "Packet-Switch Capable-1 (PSC-1)."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity switching-evpl { @@ -1670,8 +1510,9 @@ module ietf-te-types { description "Ethernet Virtual Private Line (EVPL)."; reference - "RFC 6004: Generalized MPLS (GMPLS) Support for Metro Ethernet - Forum and G.8011 Ethernet Service Switching"; + "RFC 6004: Generalized MPLS (GMPLS) Support for Metro + Ethernet Forum and G.8011 Ethernet Service + Switching"; } identity switching-l2sc { @@ -1680,7 +1521,7 @@ module ietf-te-types { "Layer-2 Switch Capable (L2SC)."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity switching-tdm { @@ -1689,7 +1530,7 @@ module ietf-te-types { "Time-Division-Multiplex Capable (TDM)."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity switching-otn { @@ -1698,7 +1539,8 @@ module ietf-te-types { "OTN-TDM capable."; reference "RFC 7138: Traffic Engineering Extensions to OSPF for GMPLS - Control of Evolving G.709 Optical Transport Networks"; + Control of Evolving G.709 Optical Transport + Networks"; } identity switching-dcsc { @@ -1707,7 +1549,8 @@ module ietf-te-types { "Data Channel Switching Capable (DCSC)."; reference "RFC 6002: Generalized MPLS (GMPLS) Data Channel - Switching Capable (DCSC) and Channel Set Label Extensions"; + Switching Capable (DCSC) and Channel Set Label + Extensions"; } identity switching-lsc { @@ -1716,7 +1559,7 @@ module ietf-te-types { "Lambda-Switch Capable (LSC)."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity switching-fsc { @@ -1725,7 +1568,7 @@ module ietf-te-types { "Fiber-Switch Capable (FSC)."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-types { @@ -1733,7 +1576,7 @@ module ietf-te-types { "Base identity for encoding types."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-packet { @@ -1742,7 +1585,7 @@ module ietf-te-types { "Packet LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-ethernet { @@ -1751,7 +1594,7 @@ module ietf-te-types { "Ethernet LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-pdh { @@ -1760,7 +1603,7 @@ module ietf-te-types { "ANSI/ETSI PDH LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-sdh { @@ -1769,7 +1612,7 @@ module ietf-te-types { "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-digital-wrapper { @@ -1778,7 +1621,7 @@ module ietf-te-types { "Digital Wrapper LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-lambda { @@ -1787,7 +1630,7 @@ module ietf-te-types { "Lambda (photonic) LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-fiber { @@ -1796,7 +1639,7 @@ module ietf-te-types { "Fiber LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-fiber-channel { @@ -1805,7 +1648,7 @@ module ietf-te-types { "FiberChannel LSP encoding."; reference "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; + Signaling Functional Description"; } identity lsp-encoding-oduk { @@ -1814,8 +1657,8 @@ module ietf-te-types { "G.709 ODUk (Digital Path) LSP encoding."; reference "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Extensions for G.709 Optical Transport Networks - Control"; + Signaling Extensions for G.709 Optical Transport + Networks Control"; } identity lsp-encoding-optical-channel { @@ -1824,8 +1667,8 @@ module ietf-te-types { "G.709 Optical Channel LSP encoding."; reference "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Extensions for G.709 Optical Transport Networks - Control"; + Signaling Extensions for G.709 Optical Transport + Networks Control"; } identity lsp-encoding-line { @@ -1834,7 +1677,8 @@ module ietf-te-types { "Line (e.g., 8B/10B) LSP encoding."; reference "RFC 6004: Generalized MPLS (GMPLS) Support for Metro - Ethernet Forum and G.8011 Ethernet Service Switching"; + Ethernet Forum and G.8011 Ethernet Service + Switching"; } identity path-signaling-type { @@ -1894,6 +1738,14 @@ module ietf-te-types { base route-usage-type; description "'Include route' object."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3.2 + RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP), Section 7.12 + RFC 7896: Update to the Include Route Object (IRO) + Specification in the Path Computation Element + Communication Protocol (PCEP)"; } identity route-exclude-object { @@ -1902,84 +1754,195 @@ module ietf-te-types { "'Exclude route' object."; reference "RFC 4874: Exclude Routes - Extension to Resource ReserVation - Protocol-Traffic Engineering (RSVP-TE)"; + Protocol-Traffic Engineering (RSVP-TE)"; } identity route-exclude-srlg { base route-usage-type; description - "Excludes SRLGs."; + "Excludes Shared Risk Link Groups (SRLGs)."; reference "RFC 4874: Exclude Routes - Extension to Resource ReserVation - Protocol-Traffic Engineering (RSVP-TE)"; + Protocol-Traffic Engineering (RSVP-TE)"; } - identity path-metric-type { + identity path-metric-optimization-type { description - "Base identity for the path metric type."; + "Base identity used to define the path metric optimization + types."; } - identity path-metric-te { - base path-metric-type; + identity link-path-metric-type { description - "TE path metric."; - reference - "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a - second MPLS Traffic Engineering (TE) Metric"; - } + "Base identity used to define the link and the path metric + types. - identity path-metric-igp { - base path-metric-type; - description - "IGP path metric."; - reference - "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a - second MPLS Traffic Engineering (TE) Metric"; + The unit of the path metric value is interpreted in the + context of the path metric type and the derived identities + SHOULD describe the unit of the path metric types they + define."; } - identity path-metric-hop { - base path-metric-type; + identity link-metric-type { + base link-path-metric-type; description - "Hop path metric."; + "Base identity for the link metric types."; } - identity path-metric-delay-average { - base path-metric-type; + identity link-metric-te { + base link-metric-type; description - "Average unidirectional link delay."; + "Traffic Engineering (TE) Link Metric."; reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2, Section 2.5.5 + RFC 5305: IS-IS Extensions for Traffic Engineering, + Section 3.7"; + } + + identity link-metric-igp { + base link-metric-type; + description + "Interior Gateway Protocol (IGP) Link Metric."; + reference + "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric + as a second MPLS Traffic Engineering (TE) + Metric"; + } + + identity link-metric-delay-average { + base link-metric-type; + description + "Unidirectional Link Delay, measured in units of + microseconds."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions, Section 4.1 + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.1"; + } + + identity link-metric-delay-minimum { + base link-metric-type; + description + "Minimum unidirectional Link Delay, measured in units of + microseconds."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions, Section 4.2 + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.2"; + } + + identity link-metric-delay-maximum { + base link-metric-type; + description + "Maximum unidirectional Link Delay, measured in units of + microseconds."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions, Section 4.2 + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.2"; + } + + identity link-metric-residual-bandwidth { + base link-metric-type; + description + "Unidirectional Residual Bandwidth, measured in units of + bytes per second. + + It is defined to be Maximum Bandwidth minus the bandwidth + currently allocated to LSPs."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions, Section 4.5 + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.5"; + } + + identity path-metric-type { + base link-path-metric-type; + base path-metric-optimization-type; + description + "Base identity for the path metric types."; + } + + identity path-metric-te { + base path-metric-type; + description + "Traffic Engineering (TE) Path Metric."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP), Section 7.8"; + } + + identity path-metric-igp { + base path-metric-type; + description + "Interior Gateway Protocol (IGP) Path Metric."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP), section 7.8"; + } + + identity path-metric-hop { + base path-metric-type; + description + "Hop Count Path Metric."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP), Section 7.8"; + } + + identity path-metric-delay-average { + base path-metric-type; + description + "The Path Delay Metric, measured in units of + microseconds."; + reference + "RFC 8233: Extensions to the Path Computation Element + Communication Protocol (PCEP) to Compute + Service-Aware Label Switched Paths (LSPs), + Section 3.1.1"; } identity path-metric-delay-minimum { base path-metric-type; description - "Minimum unidirectional link delay."; + "The Path Min Delay Metric, measured in units of + microseconds."; reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + "I-D.ietf-pce-sid-algo: Carrying SR-Algorithm information + in PCE-based Networks, + draft-ietf-pce-sid-algo-29, + Sections 4.5.1 and 4.5.2"; } identity path-metric-residual-bandwidth { base path-metric-type; description - "Unidirectional Residual Bandwidth, which is defined to be - Maximum Bandwidth (RFC 3630) minus the bandwidth currently - allocated to LSPs."; + "The Path Residual Bandwidth, defined as the minimum Link + Residual Bandwidth all the links along the path. + + The Path Residual Bandwidth can be seen as the path + metric associated with the Maximum residual Bandwidth Path + (MBP) objective function."; reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2 - RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; } identity path-metric-optimize-includes { - base path-metric-type; + base path-metric-optimization-type; description "A metric that optimizes the number of included resources specified in a set."; } identity path-metric-optimize-excludes { - base path-metric-type; + base path-metric-optimization-type; description "A metric that optimizes to a maximum the number of excluded resources specified in a set."; @@ -1993,13 +1956,15 @@ module ietf-te-types { identity path-tiebreaker-minfill { base path-tiebreaker-type; description - "Min-Fill LSP path placement."; + "Min-Fill LSP path placement: selects the path with the most + available bandwidth (load balance LSPs over more links)."; } identity path-tiebreaker-maxfill { base path-tiebreaker-type; description - "Max-Fill LSP path placement."; + "Max-Fill LSP path placement: selects the path with the least + available bandwidth (packing more LSPs over few links)."; } identity path-tiebreaker-random { @@ -2012,7 +1977,8 @@ module ietf-te-types { description "Base identity for resource class affinities."; reference - "RFC 2702: Requirements for Traffic Engineering Over MPLS"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 2702: Requirements for Traffic Engineering Over MPLS"; } identity resource-aff-include-all { @@ -2022,8 +1988,8 @@ module ietf-te-types { tunnel, all of which must be present for a link to be acceptable."; reference - "RFC 2702: Requirements for Traffic Engineering Over MPLS - RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 2702: Requirements for Traffic Engineering Over MPLS"; } identity resource-aff-include-any { @@ -2033,8 +1999,8 @@ module ietf-te-types { tunnel, any of which must be present for a link to be acceptable."; reference - "RFC 2702: Requirements for Traffic Engineering Over MPLS - RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 2702: Requirements for Traffic Engineering Over MPLS"; } identity resource-aff-exclude-any { @@ -2043,16 +2009,16 @@ module ietf-te-types { "The set of attribute filters associated with a tunnel, any of which renders a link unacceptable."; reference - "RFC 2702: Requirements for Traffic Engineering Over MPLS - RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 2702: Requirements for Traffic Engineering Over MPLS"; } identity te-optimization-criterion { description "Base identity for the TE optimization criteria."; reference - "RFC 3272: Overview and Principles of Internet Traffic - Engineering"; + "RFC 9522: Overview and Principles of Internet Traffic + Engineering"; } identity not-optimized { @@ -2067,7 +2033,8 @@ module ietf-te-types { "Optimized on cost."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity delay { @@ -2076,54 +2043,1009 @@ module ietf-te-types { "Optimized on delay."; reference "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; + Computation Element Communication Protocol + (PCEP)"; } identity path-computation-srlg-type { description - "Base identity for SRLG path computation."; + "Base identity for Shared Risk Link Group (SRLG) path + computation."; } identity srlg-ignore { base path-computation-srlg-type; description - "Ignores SRLGs in the path computation."; + "Ignores Shared Risk Link Groups (SRLGs) in the path + computation."; } identity srlg-strict { base path-computation-srlg-type; description - "Includes a strict SRLG check in the path computation."; - } + "Includes a strict Shared Risk Link Group (SRLG) check in + the path computation."; + } + + identity srlg-preferred { + base path-computation-srlg-type; + description + "Includes a preferred Shared Risk Link Group (SRLG) check in + the path computation."; + } + + identity srlg-weighted { + base path-computation-srlg-type; + description + "Includes a weighted Shared Risk Link Group (SRLG) check in + the path computation."; + } + + identity path-computation-error-reason { + description + "Base identity for path computation error reasons."; + } + + identity path-computation-error-path-not-found { + base path-computation-error-reason; + description + "Path computation has failed because of an unspecified + reason."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP), Section 7.5"; + } + + identity path-computation-error-no-topology { + base path-computation-error-reason; + description + "Path computation has failed because there is no topology + with the provided topology-identifier."; + } + + identity path-computation-error-no-dependent-server { + base path-computation-error-reason; + description + "Path computation has failed because one or more dependent + path computation servers are unavailable. + + The dependent path computation server could be + a Backward-Recursive Path Computation (BRPC) downstream + PCE or a child PCE."; + reference + "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC) + Procedure to Compute Shortest Constrained + Inter-Domain Traffic Engineering Label Switched + Paths + RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture"; + } + + identity path-computation-error-pce-unavailable { + base path-computation-error-reason; + description + "Path computation has failed because PCE is not available. + + It corresponds to bit 31 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP) + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-no-inclusion-hop { + base path-computation-error-reason; + description + "Path computation has failed because there is no + node or link provided by one or more inclusion hops."; + } + + identity path-computation-error-destination-unknown-in-domain { + base path-computation-error-reason; + description + "Path computation has failed because the destination node is + unknown in indicated destination domain. + + It corresponds to bit 19 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-no-resource { + base path-computation-error-reason; + description + "Path computation has failed because there is no + available resource in one or more domains. + + It corresponds to bit 20 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-child-pce-unresponsive { + base path-computation-error-no-dependent-server; + description + "Path computation has failed because child PCE is not + responsive. + + It corresponds to bit 21 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-destination-domain-unknown { + base path-computation-error-reason; + description + "Path computation has failed because the destination domain + was unknown. + + It corresponds to bit 22 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-p2mp { + base path-computation-error-reason; + description + "Path computation has failed because of P2MP reachability + problem. + + It corresponds to bit 24 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 8306: Extensions to the Path Computation Element + Communication Protocol (PCEP) for + Point-to-Multipoint Traffic Engineering Label + Switched Paths + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-no-gco-migration { + base path-computation-error-reason; + description + "Path computation has failed because of no Global Concurrent + Optimization (GCO) migration path found. + + It corresponds to bit 26 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5557: Path Computation Element Communication Protocol + (PCEP) Requirements and Protocol Extensions in + Support of Global Concurrent Optimization + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-no-gco-solution { + base path-computation-error-reason; + description + "Path computation has failed because of no GCO solution + found. + + It corresponds to bit 25 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5557: Path Computation Element Communication Protocol + (PCEP) Requirements and Protocol Extensions in + Support of Global Concurrent Optimization + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-pks-expansion { + base path-computation-error-reason; + description + "Path computation has failed because of Path-Key Subobject + (PKS) expansion failure. + + It corresponds to bit 27 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5520: Preserving Topology Confidentiality in + Inter-Domain Path Computation Using a + Path-Key-Based Mechanism + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-brpc-chain-unavailable { + base path-computation-error-no-dependent-server; + description + "Path computation has failed because PCE BRPC chain + unavailable. + + It corresponds to bit 28 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC) + Procedure to Compute Shortest Constrained + Inter-Domain Traffic Engineering Label Switched + Paths + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-source-unknown { + base path-computation-error-reason; + description + "Path computation has failed because source node is + unknown. + + It corresponds to bit 29 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP); + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity path-computation-error-destination-unknown { + base path-computation-error-reason; + description + "Path computation has failed because destination node is + unknown. + + It corresponds to bit 30 of the Flags field of the + NO-PATH-VECTOR TLV."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP); + + https://www.iana.org/assignments/pcep + /pcep.xhtml#no-path-vector-tlv"; + } + + identity protocol-origin-type { + description + "Base identity for protocol origin type."; + } + + identity protocol-origin-api { + base protocol-origin-type; + description + "Protocol origin is via Application Programming Interface + (API)."; + } + + identity protocol-origin-pcep { + base protocol-origin-type; + description + "Protocol origin is Path Computation Engine Protocol + (PCEP)."; + reference + "RFC 5440: Path Computation Element (PCE) Communication + Protocol (PCEP)"; + } + + identity protocol-origin-bgp { + base protocol-origin-type; + description + "Protocol origin is Border Gateway Protocol (BGP)."; + reference + "RFC 9012: The BGP Tunnel Encapsulation Attribute"; + } + + identity svec-objective-function-type { + description + "Base identity for SVEC objective function type."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity svec-of-minimize-agg-bandwidth-consumption { + base svec-objective-function-type; + description + "Objective function for minimizing aggregate bandwidth + consumption (MBC)."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-of-minimize-load-most-loaded-link { + base svec-objective-function-type; + description + "Objective function for minimizing the load on the link that + is carrying the highest load (MLL)."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-of-minimize-cost-path-set { + base svec-objective-function-type; + description + "Objective function for minimizing the cost on a path set + (MCC)."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-of-minimize-common-transit-domain { + base svec-objective-function-type; + description + "Objective function for minimizing the number of common + transit domains (MCTD)."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture."; + } + + identity svec-of-minimize-shared-link { + base svec-objective-function-type; + description + "Objective function for minimizing the number of shared + links (MSL)."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture."; + } + + identity svec-of-minimize-shared-srlg { + base svec-objective-function-type; + description + "Objective function for minimizing the number of shared + Shared Risk Link Groups (SRLG) (MSS)."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture."; + } + + identity svec-of-minimize-shared-nodes { + base svec-objective-function-type; + description + "Objective function for minimizing the number of shared + nodes (MSN)."; + reference + "RFC 8685: Path Computation Element Communication Protocol + (PCEP) Extensions for the Hierarchical Path + Computation Element (H-PCE) Architecture."; + } + + identity svec-metric-type { + description + "Base identity for SVEC metric type."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity svec-metric-cumulative-te { + base svec-metric-type; + description + "Cumulative TE cost."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-metric-cumulative-igp { + base svec-metric-type; + description + "Cumulative IGP cost."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-metric-cumulative-hop { + base svec-metric-type; + description + "Cumulative Hop path metric."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-metric-aggregate-bandwidth-consumption { + base svec-metric-type; + description + "Aggregate bandwidth consumption."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + identity svec-metric-load-of-the-most-loaded-link { + base svec-metric-type; + description + "Load of the most loaded link."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol + (PCEP)"; + } + + /* + * Typedefs + */ + + typedef admin-group { + type yang:hex-string { + /* 01:02:03:04 */ + length "1..11"; + } + description + "Administrative group / resource class / color representation + in 'hex-string' type. + + The most significant byte in the hex-string is the farthest + to the left in the byte sequence. + + Leading zero bytes in the configured value may be omitted + for brevity."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2 + RFC 5305: IS-IS Extensions for Traffic Engineering + RFC 7308: Extended Administrative Groups in MPLS Traffic + Engineering (MPLS-TE)"; + } + + typedef admin-groups { + type union { + type admin-group; + type extended-admin-group; + } + description + "Derived types for TE administrative groups."; + } + + typedef extended-admin-group { + type yang:hex-string; + description + "Extended administrative group / resource class / color + representation in 'hex-string' type. + + The most significant byte in the hex-string is the farthest + to the left in the byte sequence. + + Leading zero bytes in the configured value may be omitted + for brevity."; + reference + "RFC 7308: Extended Administrative Groups in MPLS Traffic + Engineering (MPLS-TE)"; + } + + typedef path-attribute-flags { + type union { + type identityref { + base session-attributes-flags; + } + type identityref { + base lsp-attributes-flags; + } + } + description + "Path attributes flags type."; + } + + typedef performance-metrics-normality { + type enumeration { + enum unknown { + value 0; + description + "Unknown."; + } + enum normal { + value 1; + description + "Normal. + + Indicates that the anomalous bit is not set."; + } + enum abnormal { + value 2; + description + "Abnormal. + + Indicates that the anomalous bit is set."; + } + } + description + "Indicates whether a performance metric is normal (anomalous + bit not set), abnormal (anomalous bit set), or unknown."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + } + + typedef srlg { + type uint32; + description + "Shared Risk Link Group (SRLG) type."; + reference + "RFC 4203: OSPF Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS) + RFC 5307: IS-IS Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS)"; + } + + typedef te-common-status { + type enumeration { + enum up { + description + "Enabled."; + } + enum down { + description + "Disabled."; + } + enum testing { + description + "In some test mode."; + } + enum preparing-maintenance { + description + "The resource is disabled in the control plane to prepare + for a graceful shutdown for maintenance purposes."; + reference + "RFC 5817: Graceful Shutdown in MPLS and Generalized MPLS + Traffic Engineering Networks"; + } + enum maintenance { + description + "The resource is disabled in the data plane for maintenance + purposes."; + } + enum unknown { + description + "Status is unknown."; + } + } + description + "Defines a type representing the common states of a TE + resource."; + } + + typedef te-bandwidth { + type string { + pattern '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' + + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' + + '[pP](\+)?(12[0-7]|' + + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+' + + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' + + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' + + '[pP](\+)?(12[0-7]|' + + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*'; + } + description + "This is the generic bandwidth type. + + It is a string containing a list of numbers separated by + commas, where each of these numbers can be non-negative + decimal, hex integer, or hex float, as defined in + ISO/IEC 9899: + + (dec | hex | float)[*(','(dec | hex | float))] + + For the packet-switching type, the string encoding MUST follow + the type 'bandwidth-ieee-float32' as defined in RFC 8294 + (e.g., 0x1p10), where the units are in bytes per second. + + Canonically, the string is represented as all lowercase and in + hex, where the prefix '0x' precedes the hex number."; + reference + "ISO/IEC 9899:2024: Information Technology - Programming + Languages - C, Section 6.4.4.2 + RFC 8294: Common YANG Data Types for the Routing Area"; + } + + typedef te-ds-class { + type uint8 { + range "0..7"; + } + description + "The Differentiated Services Class-Type of traffic."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering, Section 4.3.1"; + } + + typedef te-global-id { + type uint32; + description + "An identifier to uniquely identify an operator, which can be + either a provider or a client. + + The definition of this type is taken from RFCs 6370 and 5003. + + This attribute type is used solely to provide a globally + unique context for TE topologies."; + reference + "RFC 5003: Attachment Individual Identifier (AII) Types for + Aggregation + RFC 6370: MPLS Transport Profile (MPLS-TP) Identifiers"; + } + + typedef te-hop-type { + type enumeration { + enum loose { + description + "A loose hop in an explicit path."; + } + enum strict { + description + "A strict hop in an explicit path."; + } + } + description + "Enumerated type for specifying loose or strict paths."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3.3"; + } + + typedef te-link-access-type { + type enumeration { + enum point-to-point { + description + "The link is point-to-point."; + } + enum multi-access { + description + "The link is multi-access, including broadcast and NBMA."; + } + } + description + "The access types of a TE link."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2"; + } + + typedef te-label-direction { + type enumeration { + enum forward { + description + "Label allocated for the forward LSP direction."; + } + enum reverse { + description + "Label allocated for the reverse LSP direction."; + } + } + description + "Enumerated type for specifying the forward or reverse + label."; + } + + typedef te-link-direction { + type enumeration { + enum incoming { + description + "The explicit route represents an incoming link on + a node."; + } + enum outgoing { + description + "The explicit route represents an outgoing link on + a node."; + } + } + description + "Enumerated type for specifying the direction of a link on + a node."; + } + + typedef te-metric { + type uint32; + description + "Traffic Engineering (TE) metric."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2, Section 2.5.5 + RFC 5305: IS-IS Extensions for Traffic Engineering, + Section 3.7"; + } + + typedef te-node-id { + type union { + type yang:dotted-quad; + type inet:ipv6-address-no-zone; + } + description + "A type representing the identifier for a node in a TE + topology. + + The identifier is represented either as 4 octets in + dotted-quad notation, or as 16 octets in full, mixed, + shortened, or shortened-mixed IPv6 address notation. + + This attribute MAY be mapped to the Router Address TLV + described in Section 2.4.1 of RFC 3630, the TE Router ID + described in Section 3 of RFC 6827, the Traffic Engineering + Router ID TLV described in Section 4.3 of RFC 5305, the TE + Router ID TLV described in Section 3.2.1 of RFC 6119, or the + IPv6 TE Router ID TLV described in Section 4.1 of RFC 6119. + + The reachability of such a TE node MAY be achieved by a + mechanism such as that described in Section 6.2 of RFC 6827."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2, Section 2.4.1 + RFC 5305: IS-IS Extensions for Traffic Engineering, + Section 4.3 + RFC 6119: IPv6 Traffic Engineering in IS-IS, Section 3.2.1 + RFC 6827: Automatically Switched Optical Network (ASON) + Routing for OSPFv2 Protocols, Section 3"; + } + + typedef te-oper-status { + type te-common-status; + description + "Defines a type representing the operational status of + a TE resource."; + } + + typedef te-admin-status { + type te-common-status; + description + "Defines a type representing the administrative status of + a TE resource."; + } + + typedef te-path-disjointness { + type bits { + bit node { + position 0; + description + "Node disjoint."; + } + bit link { + position 1; + description + "Link disjoint."; + } + bit srlg { + position 2; + description + "Shared Risk Link Group (SRLG) disjoint."; + } + } + description + "Type of the resource disjointness for a TE tunnel path."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) + Recovery"; + } + + typedef te-recovery-status { + type enumeration { + enum normal { + description + "Both the recovery span and the working span are fully + allocated and active, data traffic is being + transported over (or selected from) the working + span, and no trigger events are reported."; + } + enum recovery-started { + description + "The recovery action has been started but not completed."; + } + enum recovery-succeeded { + description + "The recovery action has succeeded. + + The working span has reported a failure/degrade condition, + and the user traffic is being transported (or selected) + on the recovery span."; + } + enum recovery-failed { + description + "The recovery action has failed."; + } + enum reversion-started { + description + "The reversion has started."; + } + enum reversion-succeeded { + description + "The reversion action has succeeded."; + } + enum reversion-failed { + description + "The reversion has failed."; + } + enum recovery-unavailable { + description + "The recovery is unavailable, as a result of either an + operator's lockout command or a failure condition + detected on the recovery span."; + } + enum recovery-admin { + description + "The operator has issued a command to switch the user + traffic to the recovery span."; + } + enum wait-to-restore { + description + "The recovery domain is recovering from a failure/degrade + condition on the working span that is being controlled by + the Wait-to-Restore (WTR) timer."; + } + } + description + "Defines the status of a recovery action."; + reference + "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection + RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching + (GMPLS)"; + } + + typedef te-template-name { + type string { + pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + description + "A type for the name of a TE node template or TE link + template."; + } + + typedef te-topology-event-type { + type enumeration { + enum add { + value 0; + description + "A TE node or TE link has been added."; + } + enum remove { + value 1; + description + "A TE node or TE link has been removed."; + } + enum update { + value 2; + description + "A TE node or TE link has been updated."; + } + } + description + "TE event type for notifications."; + } + + typedef te-topology-id { + type union { + type string { + length "0"; + // empty string + } + type string { + pattern '([a-zA-Z0-9\-_.]+:)*' + + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + } + description + "An identifier for a topology. + + It is optional to have one or more prefixes at the beginning, + separated by colons. + + The prefixes can be 'network-types' as defined in the + 'ietf-network' module in RFC 8345, to help the user better + understand the topology before further inquiry is made."; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + typedef te-tp-id { + type union { + type uint32; + // Unnumbered + type inet:ip-address; + // IPv4 or IPv6 address + } + description + "An identifier for a TE link endpoint on a node. - identity srlg-preferred { - base path-computation-srlg-type; - description - "Includes a preferred SRLG check in the path computation."; + This attribute is mapped to a local or remote link identifier + as defined in RFCs 3630 and 5305."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2 + RFC 5305: IS-IS Extensions for Traffic Engineering"; } - identity srlg-weighted { - base path-computation-srlg-type; + typedef path-type { + type enumeration { + enum primary-path { + description + "Indicates that the TE path is a primary path."; + } + enum secondary-path { + description + "Indicates that the TE path is a secondary path."; + } + enum primary-reverse-path { + description + "Indicates that the TE path is a primary reverse path."; + } + enum secondary-reverse-path { + description + "Indicates that the TE path is a secondary reverse path."; + } + } description - "Includes a weighted SRLG check in the path computation."; + "The type of TE path, indicating whether a path is a primary, + or a reverse primary, or a secondary, or a reverse secondary + path."; } - /** + /* * TE bandwidth groupings - **/ + */ grouping te-bandwidth { description "This grouping defines the generic TE bandwidth. + For some known data-plane technologies, specific modeling - structures are specified. The string-encoded 'te-bandwidth' - type is used for unspecified technologies. + structures are specified. + + The string-encoded 'te-bandwidth' type is used for + unspecified technologies. + The modeling structure can be augmented later for other technologies."; container te-bandwidth { description - "Container that specifies TE bandwidth. The choices - can be augmented for specific data-plane technologies."; + "Container that specifies TE bandwidth. + + The choices can be augmented for specific data-plane + technologies."; choice technology { default "generic"; description @@ -2139,20 +3061,24 @@ module ietf-te-types { } } - /** + /* * TE label groupings - **/ + */ grouping te-label { description "This grouping defines the generic TE label. + The modeling structure can be augmented for each technology. + For unspecified technologies, 'rt-types:generalized-label' is used."; container te-label { description - "Container that specifies the TE label. The choices can - be augmented for specific data-plane technologies."; + "Container that specifies the TE label. + + The choices can be augmented for specific data-plane + technologies."; choice technology { default "generic"; description @@ -2201,34 +3127,38 @@ module ietf-te-types { default ""; description "When the datastore contains several topologies, - 'topology-id' distinguishes between them. If omitted, - the default (empty) string for this leaf is assumed."; + 'topology-id' distinguishes between them. + + If omitted, the default (empty) string for this leaf is + assumed."; } } } - /** + /* * TE performance metrics groupings - **/ + */ grouping performance-metrics-one-way-delay-loss { description "Performance Metrics (PM) information in real time that can - be applicable to links or connections. PM defined in this - grouping are applicable to generic TE PM as well as packet TE - PM."; + be applicable to links or connections. + + PM defined in this grouping are applicable to generic TE PM + as well as packet TE PM."; reference "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf one-way-delay { type uint32 { range "0..16777215"; } + units "microseconds"; description - "One-way delay or latency in microseconds."; + "One-way delay or latency."; } leaf one-way-delay-normality { type te-types:performance-metrics-normality; @@ -2239,21 +3169,24 @@ module ietf-te-types { grouping performance-metrics-two-way-delay-loss { description - "PM information in real time that can be applicable to links or - connections. PM defined in this grouping are applicable to - generic TE PM as well as packet TE PM."; + "Performance Metrics (PM) information in real time that can be + applicable to links or connections. + + PM defined in this grouping are applicable to generic TE PM + as well as packet TE PM."; reference "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf two-way-delay { type uint32 { range "0..16777215"; } + units "microseconds"; description - "Two-way delay or latency in microseconds."; + "Two-way delay or latency."; } leaf two-way-delay-normality { type te-types:performance-metrics-normality; @@ -2264,15 +3197,17 @@ module ietf-te-types { grouping performance-metrics-one-way-bandwidth { description - "PM information in real time that can be applicable to links. + "Performance Metrics (PM) information in real time that can be + applicable to links. + PM defined in this grouping are applicable to generic TE PM as well as packet TE PM."; reference "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf one-way-residual-bandwidth { type rt-types:bandwidth-ieee-float32; units "bytes per second"; @@ -2283,7 +3218,7 @@ module ietf-te-types { provides an aggregated remainder across QoS classes."; reference "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; + Version 2"; } leaf one-way-residual-bandwidth-normality { type te-types:performance-metrics-normality; @@ -2298,9 +3233,10 @@ module ietf-te-types { description "Available bandwidth that is defined to be residual bandwidth minus the measured bandwidth used for the - actual forwarding of non-RSVP-TE LSP packets. For a - bundled link, available bandwidth is defined to be the - sum of the component link available bandwidths."; + actual forwarding of non-RSVP-TE LSP packets. + + For a bundled link, available bandwidth is defined to be + the sum of the component link available bandwidths."; } leaf one-way-available-bandwidth-normality { type te-types:performance-metrics-normality; @@ -2328,14 +3264,21 @@ module ietf-te-types { grouping one-way-performance-metrics { description - "One-way PM throttle grouping."; + "One-way Performance Metrics (PM) throttle grouping."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf one-way-delay { type uint32 { range "0..16777215"; } + units "microseconds"; default "0"; description - "One-way delay or latency in microseconds."; + "One-way delay or latency."; } leaf one-way-residual-bandwidth { type rt-types:bandwidth-ieee-float32; @@ -2347,7 +3290,7 @@ module ietf-te-types { provides an aggregated remainder across QoS classes."; reference "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; + Version 2"; } leaf one-way-available-bandwidth { type rt-types:bandwidth-ieee-float32; @@ -2356,9 +3299,10 @@ module ietf-te-types { description "Available bandwidth that is defined to be residual bandwidth minus the measured bandwidth used for the - actual forwarding of non-RSVP-TE LSP packets. For a - bundled link, available bandwidth is defined to be the - sum of the component link available bandwidths."; + actual forwarding of non-RSVP-TE LSP packets. + + For a bundled link, available bandwidth is defined to be + the sum of the component link available bandwidths."; } leaf one-way-utilized-bandwidth { type rt-types:bandwidth-ieee-float32; @@ -2374,14 +3318,21 @@ module ietf-te-types { grouping two-way-performance-metrics { description - "Two-way PM throttle grouping."; + "Two-way Performance Metrics (PM) throttle grouping."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf two-way-delay { type uint32 { range "0..16777215"; } + units "microseconds"; default "0"; description - "Two-way delay or latency in microseconds."; + "Two-way delay or latency."; } } @@ -2395,16 +3346,16 @@ module ietf-te-types { grouping performance-metrics-attributes { description - "Contains PM attributes."; + "Contains Performance Metrics (PM) attributes."; container performance-metrics-one-way { description "One-way link performance information in real time."; reference "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; uses performance-metrics-one-way-delay-loss; uses performance-metrics-one-way-bandwidth; } @@ -2413,14 +3364,14 @@ module ietf-te-types { "Two-way link performance information in real time."; reference "RFC 6374: Packet Loss and Delay Measurement for MPLS - Networks"; + Networks"; uses performance-metrics-two-way-delay-loss; } } grouping performance-metrics-throttle-container { description - "Controls PM throttling."; + "Controls Performance Metrics (PM) throttling."; container throttle { must 'suppression-interval >= measure-interval' { error-message "'suppression-interval' cannot be less than " @@ -2433,61 +3384,63 @@ module ietf-te-types { "Link performance information in real time."; reference "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions"; leaf one-way-delay-offset { type uint32 { range "0..16777215"; } + units "microseconds"; default "0"; description "Offset value to be added to the measured delay value."; } leaf measure-interval { type uint32; + units "seconds"; default "30"; description - "Interval, in seconds, to measure the extended metric - values."; + "Interval to measure the extended metric values."; } leaf advertisement-interval { type uint32; + units "seconds"; default "0"; description - "Interval, in seconds, to advertise the extended metric - values."; + "Interval to advertise the extended metric values."; } leaf suppression-interval { type uint32 { range "1..max"; } + units "seconds"; default "120"; description - "Interval, in seconds, to suppress advertisement of the - extended metric values."; + "Interval to suppress advertisement of the extended metric + values."; reference "RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 6"; + Extensions, Section 6"; } container threshold-out { - uses performance-metrics-thresholds; description "If the measured parameter falls outside an upper bound for all but the minimum-delay metric (or a lower bound for the minimum-delay metric only) and the advertised value is not already outside that bound, an 'anomalous' announcement (anomalous bit set) will be triggered."; + uses performance-metrics-thresholds; } container threshold-in { - uses performance-metrics-thresholds; description "If the measured parameter falls inside an upper bound for all but the minimum-delay metric (or a lower bound for the minimum-delay metric only) and the advertised value is not already inside that bound, a 'normal' announcement (anomalous bit cleared) will be triggered."; + uses performance-metrics-thresholds; } container threshold-accelerated-advertisement { description @@ -2500,9 +3453,9 @@ module ietf-te-types { } } - /** + /* * TE tunnel generic groupings - **/ + */ grouping explicit-route-hop { description @@ -2512,9 +3465,25 @@ module ietf-te-types { "The explicit route entry type."; case numbered-node-hop { container numbered-node-hop { + must 'node-id-uri or node-id' { + description + "At least one node identifier needs to be present."; + } + description + "Numbered node route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering + (RSVP-TE)"; + leaf node-id-uri { + type nw:node-id; + description + "The identifier of a node in the topology."; + } leaf node-id { type te-node-id; - mandatory true; description "The identifier of a node in the TE topology."; } @@ -2524,17 +3493,18 @@ module ietf-te-types { description "Strict or loose hop."; } - description - "Numbered node route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; } } case numbered-link-hop { container numbered-link-hop { + description + "Numbered link explicit route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering + (RSVP-TE)"; leaf link-tp-id { type te-tp-id; mandatory true; @@ -2553,28 +3523,45 @@ module ietf-te-types { description "Link route object direction."; } - description - "Numbered link explicit route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; } } case unnumbered-link-hop { container unnumbered-link-hop { + must '(link-tp-id-uri or link-tp-id) and ' + + '(node-id-uri or node-id)' { + description + "At least one node identifier and at least one Link + Termination Point (LTP) identifier need to be + present."; + } + description + "Unnumbered link explicit route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering + (RSVP-TE)"; + leaf link-tp-id-uri { + type nt:tp-id; + description + "Link Termination Point (LTP) identifier."; + } leaf link-tp-id { type te-tp-id; - mandatory true; description - "TE LTP identifier. The combination of the TE link ID - and the TE node ID is used to identify an unnumbered - TE link."; + "TE LTP identifier. + + The combination of the TE link ID and the TE node ID + is used to identify an unnumbered TE link."; + } + leaf node-id-uri { + type nw:node-id; + description + "The identifier of a node in the topology."; } leaf node-id { type te-node-id; - mandatory true; description "The identifier of a node in the TE topology."; } @@ -2590,17 +3577,12 @@ module ietf-te-types { description "Link route object direction."; } - description - "Unnumbered link explicit route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; } } case as-number { container as-number-hop { + description + "Autonomous System (AS) explicit route hop."; leaf as-number { type inet:as-number; mandatory true; @@ -2613,18 +3595,43 @@ module ietf-te-types { description "Strict or loose hop."; } - description - "AS explicit route hop."; } } case label { + description + "The label explicit route hop type."; container label-hop { description "Label hop type."; uses te-label; } + } + } + } + + grouping explicit-route-hop-with-srlg { + description + "Augments the explicit route entry grouping with Shared Risk + Link Group (SRLG) hop type."; + uses explicit-route-hop { + augment "type" { description - "The label explicit route hop type."; + "Augmentation for a generic explicit route for Shared + Risk Link Group (SRLG) inclusion or exclusion."; + case srlg { + description + "An Shared Risk Link Group (SRLG) value to be + included or excluded."; + container srlg { + description + "Shared Risk Link Group (SRLG) container."; + leaf srlg { + type uint32; + description + "Shared Risk Link Group (SRLG) value."; + } + } + } } } } @@ -2635,20 +3642,33 @@ module ietf-te-types { leaf index { type uint32; description - "Record Route hop index. The index is used to - identify an entry in the list. The order of entries - is defined by the user without relying on key values."; + "Record Route hop index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without relying + on key values."; } choice type { description "The Record Route entry type."; case numbered-node-hop { + description + "Numbered node route hop."; container numbered-node-hop { + must 'node-id-uri or node-id' { + description + "At least one node identifier need to be present."; + } description "Numbered node route hop container."; + leaf node-id-uri { + type nw:node-id; + description + "The identifier of a node in the topology."; + } leaf node-id { type te-node-id; - mandatory true; description "The identifier of a node in the TE topology."; } @@ -2659,15 +3679,15 @@ module ietf-te-types { reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels + Tunnels RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; + Node-Id Sub-Object"; } } - description - "Numbered node route hop."; } case numbered-link-hop { + description + "Numbered link route hop."; container numbered-link-hop { description "Numbered link route hop container."; @@ -2684,23 +3704,46 @@ module ietf-te-types { reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels + Tunnels RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; + Node-Id Sub-Object"; } } - description - "Numbered link route hop."; } case unnumbered-link-hop { + description + "Unnumbered link route hop."; container unnumbered-link-hop { + must '(link-tp-id-uri or link-tp-id) and ' + + '(node-id-uri or node-id)' { + description + "At least one node identifier and at least one Link + Termination Point (LTP) identifier need to be + present."; + } + description + "Unnumbered link Record Route hop."; + reference + "RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering + (RSVP-TE)"; + leaf link-tp-id-uri { + type nt:tp-id; + description + "Link Termination Point (LTP) identifier."; + } leaf link-tp-id { type te-tp-id; - mandatory true; description - "TE LTP identifier. The combination of the TE link ID - and the TE node ID is used to identify an unnumbered - TE link."; + "TE LTP identifier. + + The combination of the TE link ID and the TE node ID + is used to identify an unnumbered TE link."; + } + leaf node-id-uri { + type nw:node-id; + description + "The identifier of a node in the topology."; } leaf node-id { type te-node-id; @@ -2714,20 +3757,15 @@ module ietf-te-types { reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels + Tunnels RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; + Node-Id Sub-Object"; } - description - "Unnumbered link Record Route hop."; - reference - "RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; } - description - "Unnumbered link route hop."; } case label { + description + "The label Record Route entry types."; container label-hop { description "Label route hop type."; @@ -2739,13 +3777,11 @@ module ietf-te-types { reference "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels + Tunnels RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; + Node-Id Sub-Object"; } } - description - "The label Record Route entry types."; } } } @@ -2797,7 +3833,8 @@ module ietf-te-types { must "(not(../label-start/te-label/direction) and" + " not(te-label/direction))" + " or " - + "(../label-start/te-label/direction = te-label/direction)" + + "(../label-start/te-label/direction = " + + "te-label/direction)" + " or " + "(not(te-label/direction) and" + " (../label-start/te-label/direction = 'forward'))" @@ -2815,10 +3852,13 @@ module ietf-te-types { container label-step { description "The step increment between labels in the label range. - The label start/end values will have to be consistent - with the sign of label step. For example, - 'label-start' < 'label-end' enforces 'label-step' > 0 - 'label-start' > 'label-end' enforces 'label-step' < 0."; + + The label start/end values MUST be consistent with the sign + of label step. + + For example: + 'label-start' < 'label-end' enforces 'label-step' > 0 + 'label-start' > 'label-end' enforces 'label-step' < 0."; choice technology { default "generic"; description @@ -2838,17 +3878,31 @@ module ietf-te-types { description "When there are gaps between 'label-start' and 'label-end', this attribute is used to specify the positions - of the used labels. This is represented in big endian as - 'hex-string'. + of the used labels. + + This is represented in big endian as 'hex-string'. + + In case the restriction is 'inclusive', the bit-position is + set if the corresponding mapped label is available. + In this case, if the range-bitmap is not present, all the + labels in the range are available. + + In case the restriction is 'exclusive', the bit-position is + set if the corresponding mapped label is not available. + In this case, if the range-bitmap is not present, all the + labels in the range are not available. + The most significant byte in the hex-string is the farthest - to the left in the byte sequence. Leading zero bytes in the - configured value may be omitted for brevity. + to the left in the byte sequence. + + Leading zero bytes in the configured value may be omitted + for brevity. + Each bit position in the 'range-bitmap' 'hex-string' maps to a label in the range derived from 'label-start'. For example, assuming that 'label-start' = 16000 and 'range-bitmap' = 0x01000001, then: - - bit position (0) is set, and the corresponding mapped label from the range is 16000 + (0 * 'label-step') or 16000 for default 'label-step' = 1. @@ -2873,7 +3927,7 @@ module ietf-te-types { labels are available."; reference "RFC 7579: General Network Element Constraint Encoding - for GMPLS-Controlled Networks"; + for GMPLS-Controlled Networks"; uses label-restriction-info; } } @@ -2884,7 +3938,7 @@ module ietf-te-types { "Optimization metrics configuration grouping."; leaf metric-type { type identityref { - base path-metric-type; + base path-metric-optimization-type; } description "Identifies the 'metric-type' that the path computation @@ -2930,7 +3984,8 @@ module ietf-te-types { in the computed path."; reference "RFC 4202: Routing Extensions in Support of - Generalized Multi-Protocol Label Switching (GMPLS)"; + Generalized Multi-Protocol Label Switching + (GMPLS)"; } leaf setup-priority { type uint8 { @@ -2966,6 +4021,11 @@ module ietf-te-types { description "Tunnel constraints grouping that can be set on a constraint set or directly on the tunnel."; + leaf network-id { + type nw:network-id; + description + "The network topology identifier."; + } uses te-topology-identifier; uses common-constraints; } @@ -2974,9 +4034,9 @@ module ietf-te-types { description "List of route entries to be included or excluded when performing the path computation."; - container explicit-route-objects-always { + container explicit-route-objects { description - "Container for the 'exclude route' object list."; + "Container for the explicit route object lists."; list route-object-exclude-always { key "index"; ordered-by user; @@ -2986,11 +4046,27 @@ module ietf-te-types { leaf index { type uint32; description - "Explicit Route Object index. The index is used to - identify an entry in the list. The order of entries - is defined by the user without relying on key values."; + "Explicit Route Object index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without + relying on key values."; + } + uses explicit-route-hop { + refine "type/numbered-node-hop/numbered-node-hop" + + "/hop-type" { + must '. = "strict"' { + description + "Loose hops can only be used for 'include' route + objects."; + reference + "RFC 4874: Exclude Routes - Extension to Resource + ReserVation Protocol-Traffic Engineering + (RSVP-TE), Section 3.1"; + } + } } - uses explicit-route-hop; } list route-object-include-exclude { key "index"; @@ -3005,33 +4081,34 @@ module ietf-te-types { default "te-types:route-include-object"; description "Indicates whether to include or exclude the - route object. The default is to include it."; + route object. + + The default is to include it."; } leaf index { type uint32; description - "Route object include-exclude index. The index is used - to identify an entry in the list. The order of entries - is defined by the user without relying on key values."; + "Route object include-exclude index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without + relying on key values."; } - uses explicit-route-hop { - augment "type" { - case srlg { - container srlg { - description - "SRLG container."; - leaf srlg { - type uint32; - description - "SRLG value."; - } - } + uses explicit-route-hop-with-srlg { + refine "type/numbered-node-hop/numbered-node-hop" + + "/hop-type" { + must '(. = "strict") or ' + + 'derived-from-or-self(../../explicit-route-usage,' + + '"te-types:route-include-object")' { description - "An SRLG value to be included or excluded."; + "Loose hops can only be used for 'include' route + objects."; + reference + "RFC 4874: Exclude Routes - Extension to Resource + ReserVation Protocol-Traffic Engineering + (RSVP-TE), Section 3.1"; } - description - "Augmentation for a generic explicit route for SRLG - exclusion."; } } } @@ -3051,9 +4128,12 @@ module ietf-te-types { leaf index { type uint32; description - "Route object entry index. The index is used to - identify an entry in the list. The order of entries - is defined by the user without relying on key values."; + "Route object entry index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without + relying on key values."; } uses explicit-route-hop; } @@ -3072,30 +4152,14 @@ module ietf-te-types { leaf index { type uint32; description - "Route object entry index. The index is used to - identify an entry in the list. The order of entries - is defined by the user without relying on key values."; - } - uses explicit-route-hop { - augment "type" { - case srlg { - container srlg { - description - "SRLG container."; - leaf srlg { - type uint32; - description - "SRLG value."; - } - } - description - "An SRLG value to be included or excluded."; - } - description - "Augmentation for a generic explicit route for SRLG - exclusion."; - } + "Route object entry index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without + relying on key values."; } + uses explicit-route-hop-with-srlg; } } @@ -3104,14 +4168,22 @@ module ietf-te-types { "TE path metric bounds grouping."; container path-metric-bounds { description - "TE path metric bounds container."; + "Top-level container for the list of path metric bounds."; list path-metric-bound { key "metric-type"; description - "List of TE path metric bounds."; + "List of path metric bounds, which can apply to link and + path metrics. + + TE paths which have at least one path metric which + exceeds the specified bounds MUST NOT be selected. + + TE paths that traverse TE links which have at least one + link metric which exceeds the specified bounds MUST NOT + be selected."; leaf metric-type { type identityref { - base path-metric-type; + base link-path-metric-type; } description "Identifies an entry in the list of 'metric-type' items @@ -3121,9 +4193,13 @@ module ietf-te-types { type uint64; default "0"; description - "Upper bound on the end-to-end TE path metric. A zero - indicates an unbounded upper limit for the specific - 'metric-type'."; + "Upper bound on the specified 'metric-type'. + + A zero indicates an unbounded upper limit for the + specified 'metric-type'. + + The unit of is interpreted in the context of the + 'metric-type' identity."; } } } @@ -3150,10 +4226,15 @@ module ietf-te-types { } /* Tiebreakers */ container tiebreakers { + status deprecated; description - "Container for the list of tiebreakers."; + "Container for the list of tiebreakers. + + This container has been deprecated by the tiebreaker + leaf."; list tiebreaker { key "tiebreaker-type"; + status deprecated; description "The list of tiebreaker criteria to apply on an equally favored set of paths, in order to pick @@ -3162,6 +4243,7 @@ module ietf-te-types { type identityref { base path-metric-type; } + status deprecated; description "Identifies an entry in the list of tiebreakers."; } @@ -3187,6 +4269,15 @@ module ietf-te-types { } } } + leaf tiebreaker { + type identityref { + base path-tiebreaker-type; + } + default "te-types:path-tiebreaker-random"; + description + "The tiebreaker criteria to apply on an equally favored set + of paths, in order to pick the best."; + } } grouping generic-path-affinities { @@ -3211,7 +4302,9 @@ module ietf-te-types { type admin-groups; default ""; description - "The affinity value. The default is empty."; + "The affinity value. + + The default is empty."; } } } @@ -3232,13 +4325,13 @@ module ietf-te-types { } list affinity-name { key "name"; + description + "List of named affinities."; leaf name { type string; description "Identifies a named affinity entry."; } - description - "List of named affinities."; } } } @@ -3246,48 +4339,51 @@ module ietf-te-types { grouping generic-path-srlgs { description - "Path SRLG grouping."; + "Path Shared Risk Link Group (SRLG) grouping."; container path-srlgs-lists { description - "Path SRLG properties container."; + "Path Shared Risk Link Group (SRLG) properties container."; list path-srlgs-list { key "usage"; description - "List of SRLG values to be included or excluded."; + "List of Shared Risk Link Group (SRLG) values to be + included or excluded."; leaf usage { type identityref { base route-usage-type; } description - "Identifies an entry in a list of SRLGs to either - include or exclude."; + "Identifies an entry in a list of Shared Risk Link Groups + (SRLGs) to either include or exclude."; } leaf-list values { type srlg; description - "List of SRLG values."; + "List of Shared Risk Link Group (SRLG) values."; } } } container path-srlgs-names { description - "Container for the list of named SRLGs."; + "Container for the list of named Shared Risk Link Groups + (SRLGs)."; list path-srlgs-name { key "usage"; description - "List of named SRLGs to be included or excluded."; + "List of named Shared Risk Link Groups (SRLGs) to be + included or excluded."; leaf usage { type identityref { base route-usage-type; } description - "Identifies an entry in a list of named SRLGs to either - include or exclude."; + "Identifies an entry in a list of named Shared Risk Link + Groups (SRLGs) to either include or exclude."; } leaf-list names { type string; description - "List of named SRLGs."; + "List of named Shared Risk Link Groups (SRLGs)."; } } } @@ -3301,9 +4397,10 @@ module ietf-te-types { description "The type of resource disjointness. When configured for a primary path, the disjointness level - applies to all secondary LSPs. When configured for a - secondary path, the disjointness level overrides the level - configured for the primary path."; + applies to all secondary LSPs. + + When configured for a secondary path, the disjointness + level overrides the level configured for the primary path."; } } @@ -3366,14 +4463,79 @@ module ietf-te-types { leaf index { type uint32; description - "Route object entry index. The index is used to - identify an entry in the list. The order of entries - is defined by the user without relying on key - values."; + "Route object entry index. + + The index is used to identify an entry in the list. + + The order of entries is defined by the user without + relying on key values."; } uses explicit-route-hop; } } } } + + grouping encoding-and-switching-type { + description + "Common grouping to define the LSP encoding and + switching types"; + leaf encoding { + type identityref { + base te-types:lsp-encoding-types; + } + description + "LSP encoding type."; + reference + "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS) + Architecture"; + } + leaf switching-type { + type identityref { + base te-types:switching-capabilities; + } + description + "LSP switching type."; + reference + "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS) + Architecture"; + } + } + + grouping te-generic-node-id { + description + "A reusable grouping for a TE generic node identifier."; + leaf id { + type union { + type te-node-id; + type inet:ip-address; + type nw:node-id; + } + description + "The identifier of the node. + + It can be represented as IP address or dotted quad address + or as a URI. + + The type data node disambiguates the union type."; + } + leaf type { + type enumeration { + enum ip { + description + "IP address representation of the node identifier."; + } + enum te-id { + description + "TE identifier of the node"; + } + enum node-id { + description + "URI representation of the node identifier."; + } + } + description + "Type of node identifier representation."; + } + } } diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang deleted file mode 100644 index f0157bcc8..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2023-10-23.yang +++ /dev/null @@ -1,325 +0,0 @@ - module ietf-trans-client-service { - /* TODO: FIXME */ - yang-version 1.1; - - namespace "urn:ietf:params:xml:ns:yang:ietf-trans-client-service"; - prefix "clntsvc"; - - import ietf-network { - prefix "nw"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-network-topology { - prefix "nt"; - reference "RFC8345 - A YANG Data Model for Network Topologies"; - } - - import ietf-te-types { - prefix "te-types"; - reference "RFC 8776 - Traffic Engineering Common YANG Types"; - } - - import ietf-layer1-types { - prefix "layer1-types"; - reference "RFC ZZZZ - A YANG Data Model for Layer 1 Types"; - } - - import ietf-yang-types { - prefix "yang"; - reference "RFC 6991 - Common YANG Data Types"; - } - - import ietf-trans-client-svc-types { - prefix "clntsvc-types"; - reference "RFC XXXX - A YANG Data Model for - Transport Network Client Signals"; - } - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Italo Busi (italo.busi@huawei.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (Xufeng_Liu@jabil.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com); - "; - - description - "This module defines a YANG data model for describing - transport network client services. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2021 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices."; - revision 2023-10-23 { - description - "version -04 as a WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - /* - * Groupings - */ - grouping client-svc-access-parameters { - description - "Transport network client signals access parameters"; - - leaf access-node-id { - type te-types:te-node-id; - description - "The identifier of the access node in the TE topology."; - } - - leaf access-node-uri { - type nw:node-id; - description - "The identifier of the access node in the network."; - } - - leaf access-ltp-id { - type te-types:te-tp-id; - description - "The TE link termination point identifier in TE topology, used - together with access-node-id to identify the access LTP."; - } - - leaf access-ltp-uri { - type nt:tp-id; - description - "The link termination point identifier in network topology, - used together with access-node-uri to identify the access LTP"; - } - - leaf client-signal { - type identityref { - base layer1-types:client-signal; - } - description - "Identify the client signal type associated with this port"; - } - - } - - grouping pm-state-grouping { - leaf latency { - description "latency value of the E2E client signal service"; - type uint32; - units microsecond; - } - } - - grouping error-info-grouping { - leaf error-code { - description "error code"; - type uint16; - } - - leaf error-description { - description "detail message of error"; - type string; - } - - leaf error-timestamp { - description "the date and time error is happened"; - type yang:date-and-time; - } - } - - grouping alarm-shreshold-grouping { - leaf latency-threshold { - description "a threshold for the E2E client signal service's - latency. Once the latency value exceed this threshold, an alarm - should be triggered."; - type uint32; - units microsecond; - } - } - - grouping client-svc-tunnel-parameters { - description - "Transport network client signals tunnel parameters"; - - leaf tunnel-name { - type string; - description - "TE tunnel instance name."; - } - } - - grouping client-svc-instance-config { - description - "Configuration parameters for client services."; - leaf client-svc-name { - type string; - description - "Identifier of the p2p transport network client signals."; - } - - leaf client-svc-title { - type string; - description - "Name of the p2p transport network client signals."; - } - - leaf user-label { - type string; - description - "Alias of the p2p transport network client signals."; - } - - leaf client-svc-descr { - type string; - description - "Description of the transport network client signals."; - } - - leaf client-svc-customer { - type string; - description - "Customer of the transport network client signals."; - } - - container resilience { - description "Place holder for resilience functionalities"; - } - - uses te-types:te-topology-identifier; - - leaf admin-status { - type identityref { - base te-types:tunnel-admin-state-type; - } - default te-types:tunnel-admin-state-up; - description "Client signals administrative state."; - } - - container src-access-ports { - description - "Source access port of a client signal."; - uses client-svc-access-parameters; - } - container dst-access-ports { - description - "Destination access port of a client signal."; - uses client-svc-access-parameters; - } - - container pm-state { - config false; - description "PM data of E2E client signal"; - uses pm-state-grouping; - } - - container error-info { - config false; - description "error messages of configuration"; - uses error-info-grouping; - } - - container alarm-shreshold { - description "threshold configuration for the E2E client signal"; - uses alarm-shreshold-grouping; - } - - leaf direction { - type identityref { - base clntsvc-types:direction; - } - description "Uni-dir or Bi-dir for the client signal."; - } - - list svc-tunnels { - key tunnel-name; - description - "List of the TE Tunnels supporting the client signal."; - uses client-svc-tunnel-parameters; - } - } - - grouping client-svc-instance-state { - description - "State parameters for client services."; - leaf operational-state { - type identityref { - base te-types:tunnel-state-type; - } - config false; - description "Client signal operational state."; - } - leaf provisioning-state { - type identityref { - base te-types:lsp-state-type; - } - config false; - description "Client signal provisioning state."; - } - leaf creation-time { - type yang:date-and-time; - config false; - description "The time of the client signal be created."; - } - leaf last-updated-time { - type yang:date-and-time; - config false; - description "The time of the client signal's latest update."; - } - leaf created-by { - type string; - config false; - description - "The client signal is created by whom, - can be a system or staff ID."; - } - leaf last-updated-by { - type string; - config false; - description - "The client signal is last updated by whom, - can be a system or staff ID."; - } - leaf owned-by { - type string; - config false; - description - "The client signal is owned by whom, - can be a system ID."; - } - } - - /* - * Data nodes - */ - - container client-svc { - description - "Transport client services."; - - list client-svc-instances { - key client-svc-name; - description - "The list of p2p transport client service instances"; - - uses client-svc-instance-config; - uses client-svc-instance-state; - } - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang new file mode 100644 index 000000000..60d9ea673 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-trans-client-service@2024-01-11.yang @@ -0,0 +1,338 @@ +module ietf-trans-client-service { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-trans-client-service"; + prefix clnt-svc; + + import ietf-yang-types { + prefix yang; + reference "RFC 6991: Common YANG Data Types"; + } + + import ietf-te-types { + prefix te-types; + reference "RFCYYYY: Traffic Engineering Common YANG Types"; + } + // RFC Editor: replace YYYY with the actual RFC number assigned + // to the RFC once draft-ietf-teas-rfc8776-update + // becomes an RFC, update date information and remove this note. + + import ietf-layer1-types { + prefix l1-types; + reference "RFCZZZZ: A YANG Data Model for Layer 1 Types"; + } + // RFC Editor: replace ZZZZ with the actual RFC number assigned + // to the RFC once draft-ietf-ccamp-layer1-types + // becomes an RFC, update date information and remove this note. + + import ietf-network { + prefix nw; + reference "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-network-topology { + prefix nt; + reference "RFC8345: A YANG Data Model for Network Topologies"; + } + + import ietf-trans-client-svc-types { + prefix clnt-types; + reference + "RFCXXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a YANG data model for describing + transport network client services. + + The model fully conforms to the Network Management + Datastore Architecture (NMDA). + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Groupings + */ + + grouping client-svc-access-parameters { + description + "Transport network client signals access parameters"; + + leaf access-node-id { + type te-types:te-node-id; + description + "The identifier of the access node in the TE topology."; + } + leaf access-node-uri { + type nw:node-id; + description + "The identifier of the access node in the network."; + } + leaf access-ltp-id { + type te-types:te-tp-id; + description + "The TE link termination point identifier in TE topology, + used together with access-node-id to identify the access + Link Termination Point (LTP)."; + } + leaf access-ltp-uri { + type nt:tp-id; + description + "The link termination point identifier in network topology, + used together with access-node-uri to identify the access + LTP"; + } + leaf client-signal { + type identityref { + base l1-types:client-signal; + } + description + "Identify the client signal type associated with this port"; + } + } + + grouping pm-state-grouping { + description + "Performance Monitoring (PM) state attributes"; + leaf latency { + type uint32; + units microsecond; + description + "latency value of the E2E client signal service"; + } + } + + grouping error-info-grouping { + description + "Error information parameters"; + leaf error-code { + type uint16; + description "error code"; + } + leaf error-description { + type string; + description "detail message of error"; + } + leaf error-timestamp { + type yang:date-and-time; + description "the date and time error is happened"; + } + } + + grouping alarm-threshold-grouping { + description + "Alarm threshold parameters."; + leaf latency-threshold { + type uint32; + units microsecond; + description + "a threshold for the E2E client signal service's + latency. Once the latency value exceed this threshold, + an alarm should be triggered."; + } + } + + grouping client-svc-tunnel-parameters { + description + "Transport network client signals tunnel parameters"; + + leaf tunnel-name { + type string; + description + "TE tunnel instance name."; + } + } + + grouping client-svc-instance-config { + description + "Configuration parameters for client services."; + + leaf client-svc-name { + type string; + description + "Identifier of the p2p transport network client signals."; + } + leaf client-svc-title { + type string; + description + "Name of the p2p transport network client signals."; + } + leaf user-label { + type string; + description + "Alias of the p2p transport network client signals."; + } + leaf client-svc-descr { + type string; + description + "Description of the transport network client signals."; + } + leaf client-svc-customer { + type string; + description + "Customer of the transport network client signals."; + } + container resilience { + description "Place holder for resilience functionalities"; + } + uses te-types:te-topology-identifier; + leaf admin-status { + type identityref { + base te-types:tunnel-admin-state-type; + } + default te-types:tunnel-admin-state-up; + description "Client signals administrative state."; + } + container src-access-ports { + description + "Source access port of a client signal."; + uses client-svc-access-parameters; + } + container dst-access-ports { + description + "Destination access port of a client signal."; + uses client-svc-access-parameters; + } + container pm-state { + config false; + description "PM data of E2E client signal"; + uses pm-state-grouping; + } + container error-info { + config false; + description "error messages of configuration"; + uses error-info-grouping; + } + container alarm-threshold { + description + "threshold configuration for the E2E client signal"; + uses alarm-threshold-grouping; + } + leaf direction { + type identityref { + base clnt-types:direction; + } + description "Uni-dir or Bi-dir for the client signal."; + } + list svc-tunnels { + key tunnel-name; + description + "List of the TE Tunnels supporting the client signal."; + uses client-svc-tunnel-parameters; + } + } + + grouping client-svc-instance-state { + description + "State parameters for client services."; + leaf operational-state { + type identityref { + base te-types:tunnel-state-type; + } + config false; + description "Client signal operational state."; + } + leaf provisioning-state { + type identityref { + base te-types:lsp-state-type; + } + config false; + description "Client signal provisioning state."; + } + leaf creation-time { + type yang:date-and-time; + config false; + description "The time of the client signal be created."; + } + leaf last-updated-time { + type yang:date-and-time; + config false; + description "The time of the client signal's latest update."; + } + leaf created-by { + type string; + config false; + description + "The client signal is created by whom, + can be a system or staff ID."; + } + leaf last-updated-by { + type string; + config false; + description + "The client signal is last updated by whom, + can be a system or staff ID."; + } + leaf owned-by { + type string; + config false; + description + "The client signal is owned by whom, + can be a system ID."; + } + } + + /* + * Data nodes + */ + + container client-svc { + description + "Transport client services."; + + list client-svc-instances { + key client-svc-name; + description + "The list of p2p transport client service instances"; + uses client-svc-instance-config; + uses client-svc-instance-state; + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang deleted file mode 100644 index 60db5633a..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2023-10-23.yang +++ /dev/null @@ -1,63 +0,0 @@ - module ietf-trans-client-svc-types { - namespace "urn:ietf:params:xml:ns:yang:ietf-trans-client-svc-types"; - prefix "clntsvc-types"; - - organization - "Internet Engineering Task Force (IETF) CCAMP WG"; - contact - " - ID-draft editor: - Haomian Zheng (zhenghaomian@huawei.com); - Aihua Guo (aihuaguo.ietf@gmail.com); - Italo Busi (italo.busi@huawei.com); - Anton Snitser (antons@sedonasys.com); - Francesco Lazzeri (francesco.lazzeri@ericsson.com); - Yunbin Xu (xuyunbin@caict.ac.cn); - Yang Zhao (zhaoyangyjy@chinamobile.com); - Xufeng Liu (Xufeng_Liu@jabil.com); - Giuseppe Fioccola (giuseppe.fioccola@huawei.com); - Chaode Yu (yuchaode@huawei.com); - "; - - description - "This module defines a YANG data model for describing - transport network client types. The model fully conforms - to the Network Management Datastore Architecture (NMDA). - - Copyright (c) 2019 IETF Trust and the persons - identified as authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices."; - - revision 2023-10-23 { - description - "version -01 as a WG document"; - reference - "draft-ietf-ccamp-client-signal-yang"; - } - - identity direction { - description - "Direction information of Client Signal."; - } - - identity bidirectional { - base direction; - description - "Client Signal is bi-directional."; - } - - identity unidirectional { - base direction; - description - "Client Signal is uni-directional."; - } - - } diff --git a/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang new file mode 100644 index 000000000..dd40c9a81 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-trans-client-svc-types@2024-01-11.yang @@ -0,0 +1,77 @@ +module ietf-trans-client-svc-types { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-trans-client-svc-types"; + prefix clnt-types; + + organization + "Internet Engineering Task Force (IETF) CCAMP WG"; + contact + "WG Web: + WG List: + + Editor: Haomian Zheng + + + Editor: Aihua Guo + + + Editor: Italo Busi + + + Editor: Anton Snitser + + + Editor: Chaode Yu + "; + + description + "This module defines a collection of common YANG identity + definitions for describing Costant Bit Rate (CBR) transport + network clients. + + Copyright (c) 2024 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + revision 2024-01-11 { + description + "Initial Version"; + reference + "RFC XXXX: A YANG Data Model for Transport Network Client + Signals"; + } + // RFC Editor: replace XXXX with the actual RFC number assigned + // to the RFC once this draft + // becomes an RFC, update date information and remove this note. + + /* + * Identities + */ + + identity direction { + description + "Direction information of Client Signal."; + } + + identity bidirectional { + base direction; + description + "Client Signal is bi-directional."; + } + + identity unidirectional { + base direction; + description + "Client Signal is uni-directional."; + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang b/src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang deleted file mode 100644 index 956562a7b..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-yang-types@2013-07-15.yang +++ /dev/null @@ -1,475 +0,0 @@ - module ietf-yang-types { - - namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; - prefix "yang"; - - organization - "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; - - contact - "WG Web: - WG List: - - WG Chair: David Kessens - - - WG Chair: Juergen Schoenwaelder - - - Editor: Juergen Schoenwaelder - "; - - description - "This module contains a collection of generally useful derived - YANG data types. - - Copyright (c) 2013 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject - to the license terms contained in, the Simplified BSD License - set forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (http://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC 6991; see - the RFC itself for full legal notices."; - - revision 2013-07-15 { - description - "This revision adds the following new data types: - - yang-identifier - - hex-string - - uuid - - dotted-quad"; - reference - "RFC 6991: Common YANG Data Types"; - } - - revision 2010-09-24 { - description - "Initial revision."; - reference - "RFC 6021: Common YANG Data Types"; - } - - /*** collection of counter and gauge types ***/ - - typedef counter32 { - type uint32; - description - "The counter32 type represents a non-negative integer - that monotonically increases until it reaches a - maximum value of 2^32-1 (4294967295 decimal), when it - wraps around and starts increasing again from zero. - - Counters have no defined 'initial' value, and thus, a - single value of a counter has (in general) no information - content. Discontinuities in the monotonically increasing - value normally occur at re-initialization of the - management system, and at other times as specified in the - description of a schema node using this type. If such - other times can occur, for example, the creation of - a schema node of type counter32 at times other than - re-initialization, then a corresponding schema node - should be defined, with an appropriate type, to indicate - the last discontinuity. - - The counter32 type should not be used for configuration - schema nodes. A default statement SHOULD NOT be used in - combination with the type counter32. - - In the value set and its semantics, this type is equivalent - to the Counter32 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef zero-based-counter32 { - type yang:counter32; - default "0"; - description - "The zero-based-counter32 type represents a counter32 - that has the defined 'initial' value zero. - - A schema node of this type will be set to zero (0) on creation - and will thereafter increase monotonically until it reaches - a maximum value of 2^32-1 (4294967295 decimal), when it - wraps around and starts increasing again from zero. - - Provided that an application discovers a new schema node - of this type within the minimum time to wrap, it can use the - 'initial' value as a delta. It is important for a management - station to be aware of this minimum time and the actual time - between polls, and to discard data if the actual time is too - long or there is no defined minimum time. - - In the value set and its semantics, this type is equivalent - to the ZeroBasedCounter32 textual convention of the SMIv2."; - reference - "RFC 4502: Remote Network Monitoring Management Information - Base Version 2"; - } - - typedef counter64 { - type uint64; - description - "The counter64 type represents a non-negative integer - that monotonically increases until it reaches a - maximum value of 2^64-1 (18446744073709551615 decimal), - when it wraps around and starts increasing again from zero. - - Counters have no defined 'initial' value, and thus, a - single value of a counter has (in general) no information - content. Discontinuities in the monotonically increasing - value normally occur at re-initialization of the - management system, and at other times as specified in the - description of a schema node using this type. If such - other times can occur, for example, the creation of - a schema node of type counter64 at times other than - re-initialization, then a corresponding schema node - should be defined, with an appropriate type, to indicate - the last discontinuity. - - The counter64 type should not be used for configuration - schema nodes. A default statement SHOULD NOT be used in - combination with the type counter64. - - In the value set and its semantics, this type is equivalent - to the Counter64 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef zero-based-counter64 { - type yang:counter64; - default "0"; - description - "The zero-based-counter64 type represents a counter64 that - has the defined 'initial' value zero. - - A schema node of this type will be set to zero (0) on creation - and will thereafter increase monotonically until it reaches - a maximum value of 2^64-1 (18446744073709551615 decimal), - when it wraps around and starts increasing again from zero. - - Provided that an application discovers a new schema node - of this type within the minimum time to wrap, it can use the - 'initial' value as a delta. It is important for a management - station to be aware of this minimum time and the actual time - between polls, and to discard data if the actual time is too - long or there is no defined minimum time. - - In the value set and its semantics, this type is equivalent - to the ZeroBasedCounter64 textual convention of the SMIv2."; - reference - "RFC 2856: Textual Conventions for Additional High Capacity - Data Types"; - } - - typedef gauge32 { - type uint32; - description - "The gauge32 type represents a non-negative integer, which - may increase or decrease, but shall never exceed a maximum - value, nor fall below a minimum value. The maximum value - cannot be greater than 2^32-1 (4294967295 decimal), and - the minimum value cannot be smaller than 0. The value of - a gauge32 has its maximum value whenever the information - being modeled is greater than or equal to its maximum - value, and has its minimum value whenever the information - being modeled is smaller than or equal to its minimum value. - If the information being modeled subsequently decreases - below (increases above) the maximum (minimum) value, the - gauge32 also decreases (increases). - - In the value set and its semantics, this type is equivalent - to the Gauge32 type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef gauge64 { - type uint64; - description - "The gauge64 type represents a non-negative integer, which - may increase or decrease, but shall never exceed a maximum - value, nor fall below a minimum value. The maximum value - cannot be greater than 2^64-1 (18446744073709551615), and - the minimum value cannot be smaller than 0. The value of - a gauge64 has its maximum value whenever the information - being modeled is greater than or equal to its maximum - value, and has its minimum value whenever the information - being modeled is smaller than or equal to its minimum value. - If the information being modeled subsequently decreases - below (increases above) the maximum (minimum) value, the - gauge64 also decreases (increases). - - In the value set and its semantics, this type is equivalent - to the CounterBasedGauge64 SMIv2 textual convention defined - in RFC 2856"; - reference - "RFC 2856: Textual Conventions for Additional High Capacity - Data Types"; - } - - /*** collection of identifier-related types ***/ - - typedef object-identifier { - type string { - pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' - + '(\.(0|([1-9]\d*)))*'; - } - description - "The object-identifier type represents administratively - assigned names in a registration-hierarchical-name tree. - - Values of this type are denoted as a sequence of numerical - non-negative sub-identifier values. Each sub-identifier - value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers - are separated by single dots and without any intermediate - whitespace. - - The ASN.1 standard restricts the value space of the first - sub-identifier to 0, 1, or 2. Furthermore, the value space - of the second sub-identifier is restricted to the range - 0 to 39 if the first sub-identifier is 0 or 1. Finally, - the ASN.1 standard requires that an object identifier - has always at least two sub-identifiers. The pattern - captures these restrictions. - - Although the number of sub-identifiers is not limited, - module designers should realize that there may be - implementations that stick with the SMIv2 limit of 128 - sub-identifiers. - - This type is a superset of the SMIv2 OBJECT IDENTIFIER type - since it is not restricted to 128 sub-identifiers. Hence, - this type SHOULD NOT be used to represent the SMIv2 OBJECT - IDENTIFIER type; the object-identifier-128 type SHOULD be - used instead."; - reference - "ISO9834-1: Information technology -- Open Systems - Interconnection -- Procedures for the operation of OSI - Registration Authorities: General procedures and top - arcs of the ASN.1 Object Identifier tree"; - } - - typedef object-identifier-128 { - type object-identifier { - pattern '\d*(\.\d*){1,127}'; - } - description - "This type represents object-identifiers restricted to 128 - sub-identifiers. - - In the value set and its semantics, this type is equivalent - to the OBJECT IDENTIFIER type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef yang-identifier { - type string { - length "1..max"; - pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; - pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; - } - description - "A YANG identifier string as defined by the 'identifier' - rule in Section 12 of RFC 6020. An identifier must - start with an alphabetic character or an underscore - followed by an arbitrary sequence of alphabetic or - numeric characters, underscores, hyphens, or dots. - - A YANG identifier MUST NOT start with any possible - combination of the lowercase or uppercase character - sequence 'xml'."; - reference - "RFC 6020: YANG - A Data Modeling Language for the Network - Configuration Protocol (NETCONF)"; - } - - /*** collection of types related to date and time***/ - - typedef date-and-time { - type string { - pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' - + '(Z|[\+\-]\d{2}:\d{2})'; - } - description - "The date-and-time type is a profile of the ISO 8601 - standard for representation of dates and times using the - Gregorian calendar. The profile is defined by the - date-time production in Section 5.6 of RFC 3339. - - The date-and-time type is compatible with the dateTime XML - schema type with the following notable exceptions: - - (a) The date-and-time type does not allow negative years. - - (b) The date-and-time time-offset -00:00 indicates an unknown - time zone (see RFC 3339) while -00:00 and +00:00 and Z - all represent the same time zone in dateTime. - - (c) The canonical format (see below) of data-and-time values - differs from the canonical format used by the dateTime XML - schema type, which requires all times to be in UTC using - the time-offset 'Z'. - - This type is not equivalent to the DateAndTime textual - convention of the SMIv2 since RFC 3339 uses a different - separator between full-date and full-time and provides - higher resolution of time-secfrac. - - The canonical format for date-and-time values with a known time - zone uses a numeric time zone offset that is calculated using - the device's configured known offset to UTC time. A change of - the device's offset to UTC time will cause date-and-time values - to change accordingly. Such changes might happen periodically - in case a server follows automatically daylight saving time - (DST) time zone offset changes. The canonical format for - date-and-time values with an unknown time zone (usually - referring to the notion of local time) uses the time-offset - -00:00."; - reference - "RFC 3339: Date and Time on the Internet: Timestamps - RFC 2579: Textual Conventions for SMIv2 - XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; - } - - typedef timeticks { - type uint32; - description - "The timeticks type represents a non-negative integer that - represents the time, modulo 2^32 (4294967296 decimal), in - hundredths of a second between two epochs. When a schema - node is defined that uses this type, the description of - the schema node identifies both of the reference epochs. - - In the value set and its semantics, this type is equivalent - to the TimeTicks type of the SMIv2."; - reference - "RFC 2578: Structure of Management Information Version 2 - (SMIv2)"; - } - - typedef timestamp { - type yang:timeticks; - description - "The timestamp type represents the value of an associated - timeticks schema node at which a specific occurrence - happened. The specific occurrence must be defined in the - description of any schema node defined using this type. When - the specific occurrence occurred prior to the last time the - associated timeticks attribute was zero, then the timestamp - value is zero. Note that this requires all timestamp values - to be reset to zero when the value of the associated timeticks - attribute reaches 497+ days and wraps around to zero. - - The associated timeticks schema node must be specified - in the description of any schema node using this type. - - In the value set and its semantics, this type is equivalent - to the TimeStamp textual convention of the SMIv2."; - reference - "RFC 2579: Textual Conventions for SMIv2"; - } - - /*** collection of generic address types ***/ - - typedef phys-address { - type string { - pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; - } - - description - "Represents media- or physical-level addresses represented - as a sequence octets, each octet represented by two hexadecimal - numbers. Octets are separated by colons. The canonical - representation uses lowercase characters. - - In the value set and its semantics, this type is equivalent - to the PhysAddress textual convention of the SMIv2."; - reference - "RFC 2579: Textual Conventions for SMIv2"; - } - - typedef mac-address { - type string { - pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; - } - description - "The mac-address type represents an IEEE 802 MAC address. - The canonical representation uses lowercase characters. - - In the value set and its semantics, this type is equivalent - to the MacAddress textual convention of the SMIv2."; - reference - "IEEE 802: IEEE Standard for Local and Metropolitan Area - Networks: Overview and Architecture - RFC 2579: Textual Conventions for SMIv2"; - } - - /*** collection of XML-specific types ***/ - - typedef xpath1.0 { - type string; - description - "This type represents an XPATH 1.0 expression. - - When a schema node is defined that uses this type, the - description of the schema node MUST specify the XPath - context in which the XPath expression is evaluated."; - reference - "XPATH: XML Path Language (XPath) Version 1.0"; - } - - /*** collection of string types ***/ - - typedef hex-string { - type string { - pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; - } - - description - "A hexadecimal string with octets represented as hex digits - separated by colons. The canonical representation uses - lowercase characters."; - } - - typedef uuid { - type string { - pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' - + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; - } - description - "A Universally Unique IDentifier in the string representation - defined in RFC 4122. The canonical representation uses - lowercase characters. - - The following is an example of a UUID in string representation: - f81d4fae-7dec-11d0-a765-00a0c91e6bf6 - "; - reference - "RFC 4122: A Universally Unique IDentifier (UUID) URN - Namespace"; - } - - typedef dotted-quad { - type string { - pattern - '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' - + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; - } - description - "An unsigned 32-bit number expressed in the dotted-quad - notation, i.e., four octets written as decimal numbers - and separated with the '.' (full stop) character."; - } - } diff --git a/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang b/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang new file mode 100644 index 000000000..09218bbd4 --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-yang-types@2025-12-22.yang @@ -0,0 +1,764 @@ +module ietf-yang-types { + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix yang; + + organization + "IETF Network Modeling (NETMOD) Working Group"; + contact + "WG Web: + WG List: + + Editor: Jürgen Schönwälder + "; + description + "This module contains a collection of generally useful derived + YANG data types. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2025 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 9911; + see the RFC itself for full legal notices."; + + revision 2025-12-22 { + description + "This revision adds the following new data types: + - yang:date + - yang:date-no-zone + - yang:time + - yang:time-no-zone + - yang:hours32 + - yang:minutes32 + - yang:seconds32 + - yang:centiseconds32 + - yang:milliseconds32 + - yang:microseconds32 + - yang:microseconds64 + - yang:nanoseconds32 + - yang:nanoseconds64 + - yang:language-tag + The yang-identifier definition has been aligned with YANG + 1.1, and types representing time support the representation + of leap seconds. The representation of time zone offsets + has been aligned with RFC 9557. Several description and + pattern statements have been improved."; + reference + "RFC 9911: Common YANG Data Types"; + } + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang:yang-identifier + - yang:hex-string + - yang:uuid + - yang:dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system and at other times as specified in the + description of a schema node using this type. If + discontinuities occur at times other than re-initialization + (for example, at the instantiation of a schema node of type + counter32), then a corresponding schema node should be + defined, with an appropriate type, to indicate the last + discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A data tree node using this type will be set to zero (0) + on creation and will thereafter increase monotonically until + it reaches a maximum value of 2^32-1 (4294967295 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new data tree node + using this type within the minimum time to wrap, it can use + the 'initial' value as a delta. It is important for a + management station to be aware of this minimum time and the + actual time between polls, and to discard data if the actual + time is too long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system and at other times as specified in the + description of a schema node using this type. If + discontinuities occur at times other than re-initialization + (for example, at the instantiation of a schema node of type + counter64), then a corresponding schema node should be + defined, with an appropriate type, to indicate the last + discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A data tree node using this type will be set to zero (0) + on creation and will thereafter increase monotonically until + it reaches a maximum value of 2^64-1 (18446744073709551615 + decimal), when it wraps around and starts increasing again + from zero. + + Provided that an application discovers a new data tree node + using this type within the minimum time to wrap, it can use + the 'initial' value as a delta. It is important for a + management station to be aware of this minimum time and the + actual time between polls, and to discard data if the actual + time is too long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases below + the maximum value, the gauge32 also decreases; likewise, if + the information increases above the minimum value, the + gauge32 also increases. + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9][0-9]*))))' + + '(\.(0|([1-9][0-9]*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO 9834-1: Information technology -- Procedures for the + operation of object identifier registration authorities -- + Part 1: General procedures and top arcs of the international + object identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '[0-9]*(\.[0-9]*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + /*** collection of types related to date and time ***/ + + typedef date-and-time { + type string { + pattern + '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])' + + 'T(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339 and the + update defined in Section 2 of RFC 9557. The value of + 60 for seconds is allowed only in the case of leap seconds. + + The date-and-time type is compatible with the dateTime XML + schema dateTime type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The time-offset Z indicates that the date-and-time + value is reported in UTC and that the local time zone + reference point is unknown. The time-offset +00:00 + indicates that the date-and-time value is reported in + UTC and that the local time zone reference point is UTC + (see Section 2 of RFC 9557). + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known + time zone uses a numeric time zone offset that is calculated + using the device's configured known offset to UTC time. A + change of the device's offset to UTC time will cause + date-and-time values to change accordingly. Such changes + might happen periodically if a server automatically follows + daylight saving time (DST) time zone offset changes. The + canonical format for date-and-time values reported in UTC + with an unknown local time zone offset SHOULD use the + time-offset Z and MAY use -00:00 for backwards + compatibility."; + reference + "ISO 8601: Data elements and interchange formats -- Information + interchange -- Representation of dates and times + RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef date { + type string { + pattern '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + description + "The date type represents a time-interval of the length + of a day, i.e., 24 hours. It includes an optional time + zone offset. + + The date type is compatible with the XML schema date + type with the following notable exceptions: + + (a) The date type does not allow negative years. + + (b) The time-offset Z indicates that the date value is + reported in UTC and that the local time zone reference + point is unknown. The time-offset +00:00 indicates that + the date value is reported in UTC and that the local + time zone reference point is UTC (see Section 2 of + RFC 9557). + + The canonical format for date values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date values + to change accordingly. Such changes might happen periodically + if a server automatically follows daylight saving time + (DST) time zone offset changes. The canonical format for + date values reported in UTC with an unknown local time zone + offset uses the time-offset Z."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef date-no-zone { + type date { + pattern '[0-9]{4}-(1[0-2]|0[1-9])-(0[1-9]|[1-2][0-9]|3[0-1])'; + } + description + "The date-no-zone type represents a date without the optional + time zone offset information."; + } + + typedef time { + type string { + pattern + '(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?' + + '(Z|[\+\-]((1[0-3]|0[0-9]):([0-5][0-9])|14:00))?'; + } + description + "The time type represents an instance of time of zero duration + that recurs every day. It includes an optional time zone + offset. The value of 60 for seconds is allowed only in the + case of leap seconds. + + The time type is compatible with the XML schema time + type with the following notable exception: + + (a) The time-offset Z indicates that the time value is + reported in UTC and that the local time zone reference + point is unknown. The time-offset +00:00 indicates that + the time value is reported in UTC and that the local + time zone reference point is UTC (see Section 2 of + RFC 9557). + + The canonical format for time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause time values + to change accordingly. Such changes might happen periodically + if a server automatically follows daylight saving time + (DST) time zone offset changes. The canonical format for + time values reported in UTC with an unknown local time zone + offset uses the time-offset Z."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 9557: Date and Time on the Internet: Timestamps + with Additional Information + XSD-TYPES: XML Schema Definition Language (XSD) 1.1 + Part 2: Datatypes"; + } + + typedef time-no-zone { + type time { + pattern + '(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)' + + '(\.[0-9]+)?'; + } + description + "The time-no-zone type represents a time without the optional + time zone offset information."; + } + + typedef hours32 { + type int32; + units "hours"; + description + "A period of time measured in units of hours. + + The maximum time period that can be expressed is in the + range [-89478485 days 08:00:00 to 89478485 days 07:00:00]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef minutes32 { + type int32; + units "minutes"; + description + "A period of time measured in units of minutes. + + The maximum time period that can be expressed is in the + range [-1491308 days 2:08:00 to 1491308 days 2:07:00]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef seconds32 { + type int32; + units "seconds"; + description + "A period of time measured in units of seconds. + + The maximum time period that can be expressed is in the + range [-24855 days 03:14:08 to 24855 days 03:14:07]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef centiseconds32 { + type int32; + units "centiseconds"; + description + "A period of time measured in units of 10^-2 seconds. + + The maximum time period that can be expressed is in the + range [-248 days 13:13:56 to 248 days 13:13:56]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef milliseconds32 { + type int32; + units "milliseconds"; + description + "A period of time measured in units of 10^-3 seconds. + + The maximum time period that can be expressed is in the + range [-24 days 20:31:23 to 24 days 20:31:23]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef microseconds32 { + type int32; + units "microseconds"; + description + "A period of time measured in units of 10^-6 seconds. + + The maximum time period that can be expressed is in the + range [-00:35:47 to 00:35:47]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef microseconds64 { + type int64; + units "microseconds"; + description + "A period of time measured in units of 10^-6 seconds. + + The maximum time period that can be expressed is in the + range [-106751991 days 04:00:54 to 106751991 days 04:00:54]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef nanoseconds32 { + type int32; + units "nanoseconds"; + description + "A period of time measured in units of 10^-9 seconds. + + The maximum time period that can be expressed is in the + range [-00:00:02 to 00:00:02]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef nanoseconds64 { + type int64; + units "nanoseconds"; + description + "A period of time measured in units of 10^-9 seconds. + + The maximum time period that can be expressed is in the + range [-106753 days 23:12:44 to 106752 days 0:47:16]. + + This type should be range-restricted in situations + where only non-negative time periods are desirable + (i.e., range '0..max')."; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node instance at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks schema node instance was zero, then the + timestamp value is zero. + + Note that this requires all timestamp values to be reset to + zero when the value of the associated timeticks schema node + instance reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "Represents media- or physical-level addresses represented + as a sequence of octets, each octet represented by two + hexadecimal numbers. Octets are separated by colons. The + canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents a 48-bit IEEE 802 Media + Access Control (MAC) address. The canonical representation + uses lowercase characters. Note that there are IEEE 802 MAC + addresses with a different length that this type cannot + represent. The phys-address type may be used to represent + physical addresses of varying length. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 9562. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string + representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6. + "; + reference + "RFC 9562: Universally Unique IDentifiers (UUIDs)"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } + + typedef language-tag { + type string; + description + "A language tag according to RFC 5646 (BCP 47). The + canonical representation uses lowercase characters. + + Values of this type must be well-formed language tags, + in conformance with the definition of well-formed tags + in BCP 47. Implementations MAY further limit the values + they accept to those permitted by a 'validating' + processor, as defined in BCP 47. + + The canonical representation of values of this type is + aligned with the SMIv2 LangTag textual convention for + language tags fitting the length constraints imposed + by the LangTag textual convention."; + reference + "RFC 5646: Tags for Identifying Languages + RFC 5131: A MIB Textual Convention for Language Tags"; + } + + /*** collection of YANG-specific types ***/ + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 14 of RFC 7950. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + This definition conforms to YANG 1.1 defined in RFC + 7950. In RFC 6991, this definition excluded + all identifiers starting with any possible combination + of the lowercase or uppercase character sequence 'xml', + as required by YANG 1 defined in RFC 6020. If this type + is used in a YANG 1 context, then this restriction still + applies."; + reference + "RFC 7950: The YANG 1.1 Data Modeling Language + RFC 6991: Common YANG Data Types + RFC 6020: YANG - A Data Modeling Language for the + Network Configuration Protocol (NETCONF)"; + } +} -- GitLab From edc5841bb478b13a4e842b2592c83ccb9fae59a2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 12 Mar 2026 21:05:43 +0000 Subject: [PATCH 346/371] Fixed Kafka K8s service name --- deploy/tfs.sh | 2 +- manifests/kafka/single-node.yaml | 6 +++--- .../tests/gnmi_oc/test_integration_GnmiOCcollector.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index cd27f903c..e11717394 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -133,7 +133,7 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= printf "\n" echo ">>> Create Secret with Apache Kafka..." -KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-public -o 'jsonpath={.spec.ports[0].port}') +KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ --from-literal=KFK_SERVER_PORT=${KFK_SERVER_PORT} diff --git a/manifests/kafka/single-node.yaml b/manifests/kafka/single-node.yaml index 85ab01f21..6eb9bd03c 100644 --- a/manifests/kafka/single-node.yaml +++ b/manifests/kafka/single-node.yaml @@ -15,7 +15,7 @@ apiVersion: v1 kind: Service metadata: - name: kafka-public + name: kafka-service labels: app.kubernetes.io/component: message-broker app.kubernetes.io/instance: kafka @@ -50,7 +50,7 @@ spec: app.kubernetes.io/component: message-broker app.kubernetes.io/instance: kafka app.kubernetes.io/name: kafka - serviceName: "kafka-public" + serviceName: "kafka-service" replicas: 1 minReadySeconds: 5 template: @@ -83,7 +83,7 @@ spec: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT" - name: KAFKA_CFG_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka-public.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" + value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES value: "CONTROLLER" - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS diff --git a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py index 3efb84621..6543c8743 100644 --- a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py +++ b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py @@ -164,7 +164,7 @@ def telemetry_backend_service(): # + Uncomment test_add_to_topology() in helper methods section to add a device. # - A KPI Descriptor must be added in KPI DB with correct device_id. # + Uncomment test_SetKpiDescriptor() in helper methods section to add a KPI Descriptor. - # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-public 9094:9094'. + # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-service 9094:9094'. def test_helper_get_collector_by_kpi_id(kpi_manager_client, context_client): LOGGER.info("Testing get_collector_by_kpi_id...") -- GitLab From cb9050b24278a256e6ec5bc668bef1bf77507b79 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 12 Mar 2026 21:06:04 +0000 Subject: [PATCH 347/371] Policy component: - Removed deprecated symbolic link --- src/policy/src/main/proto/policy_condition.proto | 1 - 1 file changed, 1 deletion(-) delete mode 120000 src/policy/src/main/proto/policy_condition.proto diff --git a/src/policy/src/main/proto/policy_condition.proto b/src/policy/src/main/proto/policy_condition.proto deleted file mode 120000 index 31f7d9d10..000000000 --- a/src/policy/src/main/proto/policy_condition.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../../proto/policy_condition.proto \ No newline at end of file -- GitLab From 0cda865036bd00eb082ce41a94a179321e23e8d1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 12 Mar 2026 21:51:32 +0000 Subject: [PATCH 348/371] Common - Tools - Object Factory: - Updated PolicyRule composers --- src/common/tools/object_factory/PolicyRule.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/common/tools/object_factory/PolicyRule.py b/src/common/tools/object_factory/PolicyRule.py index 7622cedb7..371fc816d 100644 --- a/src/common/tools/object_factory/PolicyRule.py +++ b/src/common/tools/object_factory/PolicyRule.py @@ -22,19 +22,23 @@ def json_policyrule_id(policyrule_uuid : str) -> Dict: return {'uuid': {'uuid': policyrule_uuid}} def json_policyrule( - policyrule_uuid : str, policy_priority : int = 1, policy_kpi_id : str = '', - policy_state : PolicyRuleStateEnum = PolicyRuleStateEnum.POLICY_UNDEFINED, policy_state_message : str = '', - action_list : List[Dict] = [], service_id : Optional[Dict] = None, device_id_list : List[Dict] = [] + policyrule_uuid : str, + state : PolicyRuleStateEnum = PolicyRuleStateEnum.POLICY_UNDEFINED, state_message : str = '', + priority : int = 1, action_list : List[Dict] = [], list_kpi_id : List[str] = list(), + service_id : Optional[Dict] = None, device_id_list : List[Dict] = [] ) -> Dict: basic = { 'policyRuleId': json_policyrule_id(policyrule_uuid), 'policyRuleState': { - 'policyRuleState': policy_state, - 'policyRuleStateMessage': policy_state_message, + 'policyRuleState': state, + 'policyRuleStateMessage': state_message, }, - 'priority': policy_priority, - 'kpiId': {'kpi_id': {'uuid': policy_kpi_id}}, + 'policyRulePriority': priority, 'actionList': action_list, + 'policyRuleKpiList': [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in list_kpi_id + ], } result = {} -- GitLab From 05f3775e25caf1e4038f908bdf2ab8ad5e3899c2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 12 Mar 2026 21:52:31 +0000 Subject: [PATCH 349/371] Context component: - Updated PolicyRule models - Fixed PolicyRule unit tests --- src/context/service/database/PolicyRule.py | 34 +++++++++++-------- .../database/models/PolicyRuleModel.py | 22 ++++++++---- src/context/tests/Objects.py | 2 +- src/context/tests/test_policy.py | 34 ++++++++++++------- 4 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/context/service/database/PolicyRule.py b/src/context/service/database/PolicyRule.py index 3a02e187e..e488ac614 100644 --- a/src/context/service/database/PolicyRule.py +++ b/src/context/service/database/PolicyRule.py @@ -82,18 +82,22 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : 'actionList': json_policyrule_basic.get('actionList', []), }, sort_keys=True) + policyrule_list_kpi_id = [ + kpi_id.policyRuleKpiUuid.uuid for kpi_id in policyrule_basic.policyRuleKpiList + ] + now = datetime.datetime.now(datetime.timezone.utc) policyrule_data = [{ - 'policyrule_uuid' : policyrule_uuid, - 'policyrule_kind' : policyrule_kind, - 'policyrule_state' : policyrule_state, - 'policyrule_state_msg': policyrule_state_msg, - 'policyrule_priority' : policyrule_basic.priority, - 'policyrule_kpi_id' : policyrule_basic.kpiId.kpi_id.uuid, - 'policyrule_eca_data' : policyrule_eca_data, - 'created_at' : now, - 'updated_at' : now, + 'policyrule_uuid' : policyrule_uuid, + 'policyrule_kind' : policyrule_kind, + 'policyrule_state' : policyrule_state, + 'policyrule_state_msg' : policyrule_state_msg, + 'policyrule_priority' : policyrule_basic.policyRulePriority, + 'policyrule_list_kpi_id' : policyrule_list_kpi_id, + 'policyrule_eca_data' : policyrule_eca_data, + 'created_at' : now, + 'updated_at' : now, }] policyrule_service_uuid = None @@ -117,12 +121,12 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : stmt = stmt.on_conflict_do_update( index_elements=[PolicyRuleModel.policyrule_uuid], set_=dict( - policyrule_state = stmt.excluded.policyrule_state, - policyrule_state_msg = stmt.excluded.policyrule_state_msg, - policyrule_priority = stmt.excluded.policyrule_priority, - policyrule_kpi_id = stmt.excluded.policyrule_kpi_id, - policyrule_eca_data = stmt.excluded.policyrule_eca_data, - updated_at = stmt.excluded.updated_at, + policyrule_state = stmt.excluded.policyrule_state, + policyrule_state_msg = stmt.excluded.policyrule_state_msg, + policyrule_priority = stmt.excluded.policyrule_priority, + policyrule_list_kpi_id = stmt.excluded.policyrule_list_kpi_id, + policyrule_eca_data = stmt.excluded.policyrule_eca_data, + updated_at = stmt.excluded.updated_at, ) ) stmt = stmt.returning(PolicyRuleModel.created_at, PolicyRuleModel.updated_at) diff --git a/src/context/service/database/models/PolicyRuleModel.py b/src/context/service/database/models/PolicyRuleModel.py index 4f6ead280..f8ead47dc 100644 --- a/src/context/service/database/models/PolicyRuleModel.py +++ b/src/context/service/database/models/PolicyRuleModel.py @@ -14,7 +14,7 @@ import enum, json from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String -from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.dialects.postgresql import ARRAY, UUID from sqlalchemy.orm import relationship from typing import Dict from .enums.PolicyRuleState import ORM_PolicyRuleStateEnum @@ -33,7 +33,7 @@ class PolicyRuleModel(_Base): policyrule_state = Column(Enum(ORM_PolicyRuleStateEnum), nullable=False) policyrule_state_msg = Column(String, nullable=False) policyrule_priority = Column(Integer, nullable=False) - policyrule_kpi_id = Column(String, nullable=False) + policyrule_list_kpi_id = Column(ARRAY(String, dimensions=1), nullable=False) policyrule_service_uuid = Column(ForeignKey('service.service_uuid', ondelete='RESTRICT'), nullable=True, index=True) policyrule_eca_data = Column(String, nullable=False) created_at = Column(DateTime, nullable=False) @@ -50,20 +50,30 @@ class PolicyRuleModel(_Base): return {'uuid': {'uuid': self.policyrule_uuid}} def dump(self) -> Dict: - # Load JSON-encoded Event-Condition-Action (ECA) model data and populate with policy basic details + # Load JSON-encoded Event-Condition-Action (ECA) model data policyrule_basic = json.loads(self.policyrule_eca_data) + + # Populate policy rule basic details policyrule_basic.update({ 'policyRuleId': self.dump_id(), 'policyRuleState': { 'policyRuleState': self.policyrule_state.value, 'policyRuleStateMessage': self.policyrule_state_msg, }, - 'priority': self.policyrule_priority, - 'kpiId': {'kpi_id': {'uuid': self.policyrule_kpi_id}}, + 'policyRulePriority': self.policyrule_priority, + 'policyRuleKpiList': [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in self.policyrule_list_kpi_id + ] }) + + # Compose final Policy Rule result = { 'policyRuleBasic': policyrule_basic, - 'deviceList': [{'device_uuid': {'uuid': pr_d.device_uuid}} for pr_d in self.policyrule_devices], + 'deviceList': [ + {'device_uuid': {'uuid': pr_d.device_uuid}} + for pr_d in self.policyrule_devices + ], } if self.policyrule_kind == PolicyRuleKindEnum.SERVICE: result['serviceId'] = self.policyrule_service.dump_id() diff --git a/src/context/tests/Objects.py b/src/context/tests/Objects.py index 2e7852548..63155ca7d 100644 --- a/src/context/tests/Objects.py +++ b/src/context/tests/Objects.py @@ -186,4 +186,4 @@ CONNECTION_R1_R3_NAME, CONNECTION_R1_R3_ID, CONNECTION_R1_R3 = compose_connectio # ----- PolicyRule ------------------------------------------------------------------------------------------------------- POLICYRULE_NAME = 'my-device-policy' POLICYRULE_ID = json_policyrule_id(POLICYRULE_NAME) -POLICYRULE = json_policyrule(POLICYRULE_NAME, policy_priority=1, policy_kpi_id='my-kpi-id') +POLICYRULE = json_policyrule(POLICYRULE_NAME, priority=1, list_kpi_id=['my-kpi-id-1']) diff --git a/src/context/tests/test_policy.py b/src/context/tests/test_policy.py index 45592308c..65b097bb0 100644 --- a/src/context/tests/test_policy.py +++ b/src/context/tests/test_policy.py @@ -45,9 +45,11 @@ def test_policy(context_client : ContextClient): # ----- Get when the object exists --------------------------------------------------------------------------------- response = context_client.GetPolicyRule(PolicyRuleId(**POLICYRULE_ID)) - assert response.device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.device.policyRuleBasic.priority == 1 - assert response.device.policyRuleBasic.kpiId.kpi_id.uuid == 'my-kpi-id' + policy_basic = response.device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == 1 + assert len(policy_basic.policyRuleKpiList) == 1 + assert policy_basic.policyRuleKpiList[0].policyRuleKpiUuid.uuid == 'my-kpi-id-1' # ----- List when the object exists -------------------------------------------------------------------------------- response = context_client.ListPolicyRuleIds(Empty()) @@ -56,16 +58,21 @@ def test_policy(context_client : ContextClient): response = context_client.ListPolicyRules(Empty()) assert len(response.policyRules) == 1 - assert response.policyRules[0].device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.policyRules[0].device.policyRuleBasic.priority == 1 - assert response.policyRules[0].device.policyRuleBasic.kpiId.kpi_id.uuid == 'my-kpi-id' + policy_basic = response.policyRules[0].device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == 1 + assert len(policy_basic.policyRuleKpiList) == 1 + assert policy_basic.policyRuleKpiList[0].policyRuleKpiUuid.uuid == 'my-kpi-id-1' # ----- Update the object ------------------------------------------------------------------------------------------ new_policy_priority = 100 - new_policy_kpi_id = 'new-kpi-id' + new_policy_list_kpi_id = ['my-kpi-id-1', 'my-kpi-id-2'] POLICYRULE_UPDATED = copy.deepcopy(POLICYRULE) - POLICYRULE_UPDATED['device']['policyRuleBasic']['priority'] = new_policy_priority - POLICYRULE_UPDATED['device']['policyRuleBasic']['kpiId']['kpi_id']['uuid'] = new_policy_kpi_id + POLICYRULE_UPDATED['device']['policyRuleBasic']['policyRulePriority'] = new_policy_priority + POLICYRULE_UPDATED['device']['policyRuleBasic']['policyRuleKpiList'] = [ + {'policyRuleKpiUuid': {'uuid': kpi_id}} + for kpi_id in new_policy_list_kpi_id + ] response = context_client.SetPolicyRule(PolicyRule(**POLICYRULE_UPDATED)) assert response.uuid.uuid == policyrule_uuid @@ -80,9 +87,12 @@ def test_policy(context_client : ContextClient): response = context_client.ListPolicyRules(Empty()) assert len(response.policyRules) == 1 - assert response.policyRules[0].device.policyRuleBasic.policyRuleId.uuid.uuid == policyrule_uuid - assert response.policyRules[0].device.policyRuleBasic.priority == new_policy_priority - assert response.policyRules[0].device.policyRuleBasic.kpiId.kpi_id.uuid == new_policy_kpi_id + policy_basic = response.policyRules[0].device.policyRuleBasic + assert policy_basic.policyRuleId.uuid.uuid == policyrule_uuid + assert policy_basic.policyRulePriority == new_policy_priority + assert len(policy_basic.policyRuleKpiList) == 2 + for i,kpi_id in enumerate(new_policy_list_kpi_id): + assert policy_basic.policyRuleKpiList[i].policyRuleKpiUuid.uuid == kpi_id # ----- Remove the object ------------------------------------------------------------------------------------------ context_client.RemovePolicyRule(PolicyRuleId(**POLICYRULE_ID)) -- GitLab From a4f5eca6d90b46acb7528126c8cd3b6ff0b94bff Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Mar 2026 14:16:04 +0000 Subject: [PATCH 350/371] Tests: - Removed generic src/tests/Fixtures.py - Propagated as needed the fixtures to per-test Fixtures.py files --- src/service/tests/qkd/Fixtures.py | 31 ++++++++++++ src/service/tests/qkd/__init__.py | 13 +++++ .../tests/qkd/test_functional_bootstrap.py | 18 +++++-- src/tests/acl_end2end/tests/test_cleanup.py | 10 +++- .../acl_end2end/tests/test_onboarding.py | 14 ++++-- src/tests/{ => automation}/Fixtures.py | 19 ++++---- .../automation/test_functional_automation.py | 38 +++++++++------ src/tests/benchmark/policy/tests/Fixtures.py | 29 ++++++++++- .../policy/tests/test_functional_bootstrap.py | 10 +++- .../policy/tests/test_functional_cleanup.py | 10 +++- .../tests/test_functional_create_service.py | 7 ++- .../tests/test_functional_delete_service.py | 5 +- src/tests/benchmark/ztp/tests/Fixtures.py | 29 ++++++++++- .../ztp/tests/test_functional_bootstrap.py | 18 ++++--- .../ztp/tests/test_functional_cleanup.py | 14 ++++-- src/tests/ecoc22/tests/Fixtures.py | 21 +++++++- .../ecoc22/tests/test_functional_bootstrap.py | 14 ++++-- .../ecoc22/tests/test_functional_cleanup.py | 10 +++- .../tests/test_functional_create_service.py | 5 +- .../tests/test_functional_delete_service.py | 5 +- src/tests/eucnc24/tests/test_cleanup.py | 10 +++- src/tests/eucnc24/tests/test_onboarding.py | 14 ++++-- .../eucnc24/tests/test_service_ietf_create.py | 9 ++-- .../eucnc24/tests/test_service_ietf_remove.py | 9 ++-- .../eucnc24/tests/test_service_tfs_create.py | 13 +++-- .../eucnc24/tests/test_service_tfs_remove.py | 9 +++- .../l2_vpn_gnmi_oc/tests/test_cleanup.py | 10 +++- .../l2_vpn_gnmi_oc/tests/test_onboarding.py | 14 ++++-- .../tests/test_service_ietf_create.py | 9 ++-- .../tests/test_service_ietf_remove.py | 9 ++-- .../tests/test_service_tfs_create.py | 13 +++-- .../tests/test_service_tfs_remove.py | 9 +++- src/tests/ofc22/tests/Fixtures.py | 29 ++++++++++- .../ofc22/tests/test_functional_bootstrap.py | 14 ++++-- .../ofc22/tests/test_functional_cleanup.py | 10 +++- .../tests/test_functional_create_service.py | 7 ++- .../tests/test_functional_delete_service.py | 5 +- src/tests/ofc24/tests/Fixtures.py | 39 +++++++++++++++ .../ofc24/tests/test_functional_bootstrap.py | 18 +++++-- .../ofc24/tests/test_functional_cleanup.py | 10 +++- .../test_functional_create_service_bidir.py | 14 ++++-- .../test_functional_create_service_unidir.py | 14 ++++-- .../test_functional_delete_service_bidir.py | 10 +++- .../test_functional_delete_service_unidir.py | 10 +++- .../tests/test_onboarding.py | 14 ++++-- .../tests/test_onboarding.py | 14 ++++-- src/tests/ofc25/tests/Fixtures.py | 39 +++++++++++++++ .../tests/test_functional_bootstrap_e2e.py | 18 +++++-- .../tests/test_functional_bootstrap_ip.py | 14 ++++-- .../tests/test_functional_bootstrap_opt.py | 14 ++++-- .../tests/test_functional_cleanup_e2e.py | 10 +++- .../ofc25/tests/test_functional_cleanup_ip.py | 10 +++- .../tests/test_functional_cleanup_opt.py | 10 +++- .../tests/test_functional_create_service.py | 14 ++++-- .../tests/test_functional_delete_service.py | 10 +++- .../p4-sd-fabric-sbi-connectivity/Fixtures.py | 39 +++++++++++++++ .../test_functional_bootstrap.py | 12 +++-- .../test_functional_cleanup.py | 11 ++++- .../test_functional_purge.py | 10 +++- .../test_functional_sbi_rules_deprovision.py | 11 ++++- .../test_functional_sbi_rules_provision.py | 11 ++++- .../tests-service/Fixtures.py | 39 +++++++++++++++ .../tests-service/__init__.py | 13 +++++ ...test_functional_service_deprovision_acl.py | 10 +++- ...test_functional_service_deprovision_int.py | 10 +++- .../test_functional_service_deprovision_l2.py | 10 +++- .../test_functional_service_deprovision_l3.py | 10 +++- .../test_functional_service_provision_acl.py | 10 +++- .../test_functional_service_provision_int.py | 12 +++-- .../test_functional_service_provision_l2.py | 10 +++- .../test_functional_service_provision_l3.py | 10 +++- .../tests-setup/Fixtures.py | 39 +++++++++++++++ .../tests-setup/__init__.py | 13 +++++ .../tests-setup/test_functional_bootstrap.py | 11 +++-- .../tests-setup/test_functional_cleanup.py | 10 +++- .../tests-setup/test_functional_purge.py | 10 +++- .../tests-service/Fixtures.py | 39 +++++++++++++++ .../tests-service/__init__.py | 13 +++++ ...test_functional_service_deprovision_upf.py | 10 +++- .../test_functional_service_provision_upf.py | 10 +++- .../tests-setup/Fixtures.py | 39 +++++++++++++++ .../tests-setup/__init__.py | 13 +++++ .../tests-setup/test_functional_bootstrap.py | 11 +++-- .../tests-setup/test_functional_cleanup.py | 12 +++-- .../tests-setup/test_functional_purge.py | 10 +++- .../qkd_end2end/tests/test_01_onboarding.py | 14 ++++-- .../qkd_end2end/tests/test_02_create_links.py | 15 ++++-- .../tests/test_03_create_external_app.py | 7 ++- .../tests/test_04_delete_external_app.py | 5 +- .../qkd_end2end/tests/test_05_delete_links.py | 8 ++-- .../qkd_end2end/tests/test_06_cleanup.py | 10 +++- src/tests/ryu-openflow/tests/test_cleanup.py | 6 ++- .../ryu-openflow/tests/test_onboarding.py | 12 +++-- .../tests/test_service_ietf_create_h1_h3.py | 9 ++-- .../tests/test_service_ietf_create_h2_h4.py | 9 ++-- .../tests/test_service_ietf_remove_h1_h3.py | 9 ++-- .../tests/test_service_ietf_remove_h2_h4.py | 9 ++-- .../scenario2/old_tests/tests/Fixtures.py | 48 ++++++++++++++----- .../tests/test_functional_bootstrap.py | 18 ++++--- .../tests/test_functional_cleanup.py | 14 ++++-- .../tests/test_functional_create_service.py | 23 +++++---- .../tests/test_functional_delete_service.py | 17 +++---- 102 files changed, 1229 insertions(+), 267 deletions(-) create mode 100644 src/service/tests/qkd/Fixtures.py create mode 100644 src/service/tests/qkd/__init__.py rename src/tests/{ => automation}/Fixtures.py (84%) create mode 100644 src/tests/ofc24/tests/Fixtures.py create mode 100644 src/tests/ofc25/tests/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py create mode 100644 src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py diff --git a/src/service/tests/qkd/Fixtures.py b/src/service/tests/qkd/Fixtures.py new file mode 100644 index 000000000..507c13b48 --- /dev/null +++ b/src/service/tests/qkd/Fixtures.py @@ -0,0 +1,31 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() diff --git a/src/service/tests/qkd/__init__.py b/src/service/tests/qkd/__init__.py new file mode 100644 index 000000000..b53987a4e --- /dev/null +++ b/src/service/tests/qkd/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/service/tests/qkd/test_functional_bootstrap.py b/src/service/tests/qkd/test_functional_bootstrap.py index 80db786d7..e82e0d79a 100644 --- a/src/service/tests/qkd/test_functional_bootstrap.py +++ b/src/service/tests/qkd/test_functional_bootstrap.py @@ -12,14 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, os, time, json, socket, re +import json, logging, os, re, socket, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -149,4 +157,4 @@ def test_qkd_devices_enabled( # Final check to ensure all devices are enabled print(f"Final device status: {num_devices_enabled}/{num_devices} devices enabled.") assert num_devices_enabled == num_devices - print("QKD devices enabled test completed.") \ No newline at end of file + print("QKD devices enabled test completed.") diff --git a/src/tests/acl_end2end/tests/test_cleanup.py b/src/tests/acl_end2end/tests/test_cleanup.py index 20afb5fe0..91d90e7b4 100644 --- a/src/tests/acl_end2end/tests/test_cleanup.py +++ b/src/tests/acl_end2end/tests/test_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/acl_end2end/tests/test_onboarding.py b/src/tests/acl_end2end/tests/test_onboarding.py index 763d7da17..5d652e6f5 100644 --- a/src/tests/acl_end2end/tests/test_onboarding.py +++ b/src/tests/acl_end2end/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/Fixtures.py b/src/tests/automation/Fixtures.py similarity index 84% rename from src/tests/Fixtures.py rename to src/tests/automation/Fixtures.py index 9aa9a1c6a..40eb419f5 100644 --- a/src/tests/Fixtures.py +++ b/src/tests/automation/Fixtures.py @@ -1,4 +1,4 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,44 +13,41 @@ # limitations under the License. import pytest +from automation.client.AutomationClient import AutomationClient from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from e2e_orchestrator.client.E2EOrchestratorClient import E2EOrchestratorClient from kpi_manager.client.KpiManagerClient import KpiManagerClient from service.client.ServiceClient import ServiceClient -from automation.client.AutomationClient import AutomationClient -@pytest.fixture(scope='session') -def service_client(): - _client = ServiceClient() - yield _client - _client.close() - @pytest.fixture(scope='session') def context_client(): _client = ContextClient() yield _client _client.close() + @pytest.fixture(scope='session') def device_client(): _client = DeviceClient() yield _client _client.close() + @pytest.fixture(scope='session') -def e2eorchestrator_client(): - _client = E2EOrchestratorClient() +def service_client(): + _client = ServiceClient() yield _client _client.close() + @pytest.fixture(scope='session') def automation_client(): _client = AutomationClient() yield _client _client.close() + @pytest.fixture(scope='session') def kpi_manager_client(): _client = KpiManagerClient() diff --git a/src/tests/automation/test_functional_automation.py b/src/tests/automation/test_functional_automation.py index b4505931c..9f692bf01 100644 --- a/src/tests/automation/test_functional_automation.py +++ b/src/tests/automation/test_functional_automation.py @@ -12,27 +12,37 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json -import logging -import os -import uuid -from common.proto.analytics_frontend_pb2 import AnalyzerId, AnalyzerOperationMode -from common.proto.automation_pb2 import ZSMCreateRequest -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceList -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptorList, KpiDescriptorFilter -from common.proto.policy_pb2 import PolicyRuleKpiId -from common.proto.policy_action_pb2 import PolicyRuleAction, PolicyRuleActionEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +import json, logging, os, uuid + from automation.client.AutomationClient import AutomationClient +from common.proto.analytics_frontend_pb2 import ( + AnalyzerId, AnalyzerOperationMode, +) +from common.proto.automation_pb2 import ZSMCreateRequest +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceList, ServiceStatusEnum, +) +from common.proto.kpi_manager_pb2 import ( + KpiDescriptorFilter, KpiDescriptorList, KpiId, +) +from common.proto.policy_action_pb2 import ( + PolicyRuleAction, PolicyRuleActionEnum, +) +from common.proto.policy_pb2 import PolicyRuleKpiId, PolicyRuleStateEnum +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from kpi_manager.client.KpiManagerClient import KpiManagerClient -from common.proto.policy_pb2 import PolicyRuleStateEnum from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, \ - service_client, automation_client, kpi_manager_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( + automation_client, context_client, device_client, kpi_manager_client, + service_client, +) # pylint: disable=unused-import + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/policy/tests/Fixtures.py b/src/tests/benchmark/policy/tests/Fixtures.py index b6e5d0d59..b1d338bd4 100644 --- a/src/tests/benchmark/policy/tests/Fixtures.py +++ b/src/tests/benchmark/policy/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/benchmark/policy/tests/test_functional_bootstrap.py b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py index c9711ddbd..a6ba495f4 100644 --- a/src/tests/benchmark/policy/tests/test_functional_bootstrap.py +++ b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py @@ -13,15 +13,21 @@ # limitations under the License. import logging, time + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty from common.proto.monitoring_pb2 import KpiDescriptorList -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/policy/tests/test_functional_cleanup.py b/src/tests/benchmark/policy/tests/test_functional_cleanup.py index 25632738e..b03b5a879 100644 --- a/src/tests/benchmark/policy/tests/test_functional_cleanup.py +++ b/src/tests/benchmark/policy/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/policy/tests/test_functional_create_service.py b/src/tests/benchmark/policy/tests/test_functional_create_service.py index c1915938c..3b4c9ef12 100644 --- a/src/tests/benchmark/policy/tests/test_functional_create_service.py +++ b/src/tests/benchmark/policy/tests/test_functional_create_service.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, random + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import ( + context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) diff --git a/src/tests/benchmark/policy/tests/test_functional_delete_service.py b/src/tests/benchmark/policy/tests/test_functional_delete_service.py index 995fb808c..3d16daa74 100644 --- a/src/tests/benchmark/policy/tests/test_functional_delete_service.py +++ b/src/tests/benchmark/policy/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/benchmark/ztp/tests/Fixtures.py b/src/tests/benchmark/ztp/tests/Fixtures.py index b6e5d0d59..b1d338bd4 100644 --- a/src/tests/benchmark/ztp/tests/Fixtures.py +++ b/src/tests/benchmark/ztp/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py b/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py index 1067e9661..bc8f7bbe0 100644 --- a/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py +++ b/src/tests/benchmark/ztp/tests/test_functional_bootstrap.py @@ -12,21 +12,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -import copy, logging, pytest -from common.Settings import get_setting +import copy, logging + +import pytest + +from common.proto.context_pb2 import Context, ContextId, Device, Empty, Topology from common.proto.monitoring_pb2 import KpiDescriptorList +from common.Settings import get_setting from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import Context, ContextId, Device, Empty, Topology from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES -from tests.Fixtures import context_client, device_client, monitoring_client LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -107,4 +113,4 @@ def test_links_created(context_client : ContextClient): # pylint: disable=redef assert len(response.topologies) == len(TOPOLOGIES) response = context_client.ListDevices(Empty()) - assert len(response.devices) == len(DEVICES) \ No newline at end of file + assert len(response.devices) == len(DEVICES) diff --git a/src/tests/benchmark/ztp/tests/test_functional_cleanup.py b/src/tests/benchmark/ztp/tests/test_functional_cleanup.py index 5938e37b8..d14ad4208 100644 --- a/src/tests/benchmark/ztp/tests/test_functional_cleanup.py +++ b/src/tests/benchmark/ztp/tests/test_functional_cleanup.py @@ -12,7 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, pytest +import logging + +import pytest + +from common.proto.context_pb2 import ( + ContextId, DeviceId, Empty, LinkId, TopologyId, +) from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, check_events from common.tools.object_factory.Context import json_context_id @@ -21,9 +27,11 @@ from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES LOGGER = logging.getLogger(__name__) diff --git a/src/tests/ecoc22/tests/Fixtures.py b/src/tests/ecoc22/tests/Fixtures.py index b6e5d0d59..25cfc3854 100644 --- a/src/tests/ecoc22/tests/Fixtures.py +++ b/src/tests/ecoc22/tests/Fixtures.py @@ -12,14 +12,33 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/ecoc22/tests/test_functional_bootstrap.py b/src/tests/ecoc22/tests/test_functional_bootstrap.py index a72512a17..70fc6b489 100644 --- a/src/tests/ecoc22/tests/test_functional_bootstrap.py +++ b/src/tests/ecoc22/tests/test_functional_bootstrap.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ecoc22/tests/test_functional_cleanup.py b/src/tests/ecoc22/tests/test_functional_cleanup.py index 94217423d..a6d1edded 100644 --- a/src/tests/ecoc22/tests/test_functional_cleanup.py +++ b/src/tests/ecoc22/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ecoc22/tests/test_functional_create_service.py b/src/tests/ecoc22/tests/test_functional_create_service.py index da411d433..e04d573cd 100644 --- a/src/tests/ecoc22/tests/test_functional_create_service.py +++ b/src/tests/ecoc22/tests/test_functional_create_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) diff --git a/src/tests/ecoc22/tests/test_functional_delete_service.py b/src/tests/ecoc22/tests/test_functional_delete_service.py index 24463012e..550a42656 100644 --- a/src/tests/ecoc22/tests/test_functional_delete_service.py +++ b/src/tests/ecoc22/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_cleanup.py b/src/tests/eucnc24/tests/test_cleanup.py index 20afb5fe0..91d90e7b4 100644 --- a/src/tests/eucnc24/tests/test_cleanup.py +++ b/src/tests/eucnc24/tests/test_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_onboarding.py b/src/tests/eucnc24/tests/test_onboarding.py index 763d7da17..5d652e6f5 100644 --- a/src/tests/eucnc24/tests/test_onboarding.py +++ b/src/tests/eucnc24/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_ietf_create.py b/src/tests/eucnc24/tests/test_service_ietf_create.py index c1d761f40..02ef43e28 100644 --- a/src/tests/eucnc24/tests/test_service_ietf_create.py +++ b/src/tests/eucnc24/tests/test_service_ietf_create.py @@ -13,14 +13,17 @@ # limitations under the License. import json, logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_ietf_remove.py b/src/tests/eucnc24/tests/test_service_ietf_remove.py index d0dad7a2d..3dc7051fa 100644 --- a/src/tests/eucnc24/tests/test_service_ietf_remove.py +++ b/src/tests/eucnc24/tests/test_service_ietf_remove.py @@ -14,14 +14,17 @@ import logging, os from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_tfs_create.py b/src/tests/eucnc24/tests/test_service_tfs_create.py index 301602792..8884adcac 100644 --- a/src/tests/eucnc24/tests/test_service_tfs_create.py +++ b/src/tests/eucnc24/tests/test_service_tfs_create.py @@ -13,16 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/eucnc24/tests/test_service_tfs_remove.py b/src/tests/eucnc24/tests/test_service_tfs_remove.py index 50d4acb7a..eaf668078 100644 --- a/src/tests/eucnc24/tests/test_service_tfs_remove.py +++ b/src/tests/eucnc24/tests/test_service_tfs_remove.py @@ -14,15 +14,20 @@ import logging, os from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py b/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py index 20afb5fe0..91d90e7b4 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py b/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py index 763d7da17..5d652e6f5 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py index 480aee615..655d395c2 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_create.py @@ -13,14 +13,17 @@ # limitations under the License. import json, logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py index 58aa2321d..0235c32a2 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_ietf_remove.py @@ -14,14 +14,17 @@ import logging, os from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py index 3e7abd640..5d802e92e 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_create.py @@ -13,16 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, device_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py index 137848f53..264f0de0a 100644 --- a/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py +++ b/src/tests/l2_vpn_gnmi_oc/tests/test_service_tfs_remove.py @@ -14,15 +14,20 @@ import logging, os from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from .Fixtures import context_client, service_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc22/tests/Fixtures.py b/src/tests/ofc22/tests/Fixtures.py index b6e5d0d59..b1d338bd4 100644 --- a/src/tests/ofc22/tests/Fixtures.py +++ b/src/tests/ofc22/tests/Fixtures.py @@ -12,14 +12,41 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest, logging +import logging + +import pytest from common.Settings import get_setting +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME from tests.tools.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( diff --git a/src/tests/ofc22/tests/test_functional_bootstrap.py b/src/tests/ofc22/tests/test_functional_bootstrap.py index 523e533bf..44e12c131 100644 --- a/src/tests/ofc22/tests/test_functional_bootstrap.py +++ b/src/tests/ofc22/tests/test_functional_bootstrap.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) from common.proto.monitoring_pb2 import KpiDescriptorList -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc22/tests/test_functional_cleanup.py b/src/tests/ofc22/tests/test_functional_cleanup.py index 94217423d..a6d1edded 100644 --- a/src/tests/ofc22/tests/test_functional_cleanup.py +++ b/src/tests/ofc22/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc22/tests/test_functional_create_service.py b/src/tests/ofc22/tests/test_functional_create_service.py index 09a1afcde..eb8e07f70 100644 --- a/src/tests/ofc22/tests/test_functional_create_service.py +++ b/src/tests/ofc22/tests/test_functional_create_service.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, os, random + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import ( + context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE LOGGER = logging.getLogger(__name__) diff --git a/src/tests/ofc22/tests/test_functional_delete_service.py b/src/tests/ofc22/tests/test_functional_delete_service.py index cdc3894b3..ef491b8f5 100644 --- a/src/tests/ofc22/tests/test_functional_delete_service.py +++ b/src/tests/ofc22/tests/test_functional_delete_service.py @@ -13,15 +13,16 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import + +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/Fixtures.py b/src/tests/ofc24/tests/Fixtures.py new file mode 100644 index 000000000..69e4cbaa9 --- /dev/null +++ b/src/tests/ofc24/tests/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client() -> ContextClient: + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client() -> DeviceClient: + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client() -> ServiceClient: + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/ofc24/tests/test_functional_bootstrap.py b/src/tests/ofc24/tests/test_functional_bootstrap.py index 5bcf4dbb9..ed914852d 100644 --- a/src/tests/ofc24/tests/test_functional_bootstrap.py +++ b/src/tests/ofc24/tests/test_functional_bootstrap.py @@ -13,14 +13,24 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario -from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.grpc.Tools import ( + grpc_message_to_json, grpc_message_to_json_string, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_cleanup.py b/src/tests/ofc24/tests/test_functional_cleanup.py index 88c37dea3..d8dd7660d 100644 --- a/src/tests/ofc24/tests/test_functional_cleanup.py +++ b/src/tests/ofc24/tests/test_functional_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_create_service_bidir.py b/src/tests/ofc24/tests/test_functional_create_service_bidir.py index 022c32c83..7ba1ba5b4 100644 --- a/src/tests/ofc24/tests/test_functional_create_service_bidir.py +++ b/src/tests/ofc24/tests/test_functional_create_service_bidir.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_create_service_unidir.py b/src/tests/ofc24/tests/test_functional_create_service_unidir.py index 33fd0c379..a13073a92 100644 --- a/src/tests/ofc24/tests/test_functional_create_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_create_service_unidir.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py index 905531399..3ff489472 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py index 7e83b3812..5e6ae6b6c 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py index 657e7c07a..58dee0644 100644 --- a/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py +++ b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py index a0435712f..e7c8981bf 100644 --- a/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py +++ b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/Fixtures.py b/src/tests/ofc25/tests/Fixtures.py new file mode 100644 index 000000000..69e4cbaa9 --- /dev/null +++ b/src/tests/ofc25/tests/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client() -> ContextClient: + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client() -> DeviceClient: + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client() -> ServiceClient: + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py b/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py index 5a4a25232..23586b553 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_e2e.py @@ -13,14 +13,24 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario -from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) +from common.tools.grpc.Tools import ( + grpc_message_to_json, grpc_message_to_json_string, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_ip.py b/src/tests/ofc25/tests/test_functional_bootstrap_ip.py index 580a774fa..501904d1f 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_ip.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_ip.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_bootstrap_opt.py b/src/tests/ofc25/tests/test_functional_bootstrap_opt.py index a6e74af3a..8a6b8ddb4 100644 --- a/src/tests/ofc25/tests/test_functional_bootstrap_opt.py +++ b/src/tests/ofc25/tests/test_functional_bootstrap_opt.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_e2e.py b/src/tests/ofc25/tests/test_functional_cleanup_e2e.py index 0c4bb088d..8f81d3cd9 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_e2e.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_e2e.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_ip.py b/src/tests/ofc25/tests/test_functional_cleanup_ip.py index bf93adbc5..fb33a4d45 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_ip.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_ip.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_cleanup_opt.py b/src/tests/ofc25/tests/test_functional_cleanup_opt.py index 060297822..4e7a76d1c 100644 --- a/src/tests/ofc25/tests/test_functional_cleanup_opt.py +++ b/src/tests/ofc25/tests/test_functional_cleanup_opt.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_create_service.py b/src/tests/ofc25/tests/test_functional_create_service.py index 72eb15856..b987bf8de 100644 --- a/src/tests/ofc25/tests/test_functional_create_service.py +++ b/src/tests/ofc25/tests/test_functional_create_service.py @@ -13,15 +13,23 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ofc25/tests/test_functional_delete_service.py b/src/tests/ofc25/tests/test_functional_delete_service.py index f989485dc..9c689d259 100644 --- a/src/tests/ofc25/tests/test_functional_delete_service.py +++ b/src/tests/ofc25/tests/test_functional_delete_service.py @@ -14,14 +14,20 @@ import logging from typing import Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py b/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py new file mode 100644 index 000000000..cf77538f9 --- /dev/null +++ b/src/tests/p4-sd-fabric-sbi-connectivity/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py index eedcb9951..9d512e6d3 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_bootstrap.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, time + from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, \ - check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py index 41897fb0a..d2aecc6bf 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_cleanup.py @@ -13,11 +13,18 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + from test_functional_common import DESC_TOPOLOGY LOGGER = logging.getLogger(__name__) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py index a4bf927cb..d357b05a2 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_purge.py @@ -13,7 +13,10 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id @@ -21,9 +24,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( + context_client, device_client, service_client, +) # pylint: disable=unused-import + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py index 8bf3b8c90..80b42d908 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_deprovision.py @@ -13,12 +13,19 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results + +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + from test_functional_common import * LOGGER = logging.getLogger(__name__) diff --git a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py index ba45ad8bc..c09cff55e 100644 --- a/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py +++ b/src/tests/p4-sd-fabric-sbi-connectivity/test_functional_sbi_rules_provision.py @@ -13,12 +13,19 @@ # limitations under the License. import logging -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results + +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import + from test_functional_common import * LOGGER = logging.getLogger(__name__) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py new file mode 100644 index 000000000..cf77538f9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py new file mode 100644 index 000000000..b53987a4e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py index e90ff1687..d18d4e583 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_acl.py @@ -13,15 +13,21 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py index 3709d808b..541f4253a 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_int.py @@ -13,15 +13,21 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py index e97b84b36..001bd1b68 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l2.py @@ -13,15 +13,21 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py index 0fc2a7363..c5bbe1d14 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_deprovision_l3.py @@ -13,15 +13,21 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py index e200253ed..14d8c04a8 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_acl.py @@ -14,15 +14,21 @@ import logging import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py index a112e85d2..795b12725 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_int.py @@ -12,17 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os import logging +import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py index d80f24630..46a314ed5 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l2.py @@ -14,15 +14,21 @@ import logging import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py index 80e1547d9..9a8eba1ca 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-service/test_functional_service_provision_l3.py @@ -14,15 +14,21 @@ import logging import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + DEV_NB = 4 P4_DEV_NB = 1 diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py new file mode 100644 index 000000000..cf77538f9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py new file mode 100644 index 000000000..b53987a4e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py index 8807764e4..0f60221ff 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_bootstrap.py @@ -13,14 +13,19 @@ # limitations under the License. import logging, os, time + from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, \ - check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py index 12d5afac2..ca303173f 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_cleanup.py @@ -13,12 +13,18 @@ # limitations under the License. import logging, os -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py index 1d7f1523c..07c772666 100644 --- a/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py +++ b/src/tests/p4-sd-fabric-svc-connectivity/tests-setup/test_functional_purge.py @@ -13,7 +13,10 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id @@ -21,9 +24,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py new file mode 100644 index 000000000..cf77538f9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py new file mode 100644 index 000000000..b53987a4e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py index 1a6825e17..7b1496b9b 100644 --- a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_deprovision_upf.py @@ -13,14 +13,20 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, ServiceStatusEnum, ServiceTypeEnum + +from common.proto.context_pb2 import ( + ServiceId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, service_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py index dfbd7567d..fcc50d523 100644 --- a/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py +++ b/src/tests/p4-sd-fabric-svc-upf/tests-service/test_functional_service_provision_upf.py @@ -14,15 +14,21 @@ import logging import os + from common.proto.context_pb2 import ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import * +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py new file mode 100644 index 000000000..cf77538f9 --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/Fixtures.py @@ -0,0 +1,39 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient() + yield _client + _client.close() diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py new file mode 100644 index 000000000..b53987a4e --- /dev/null +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2026 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py index b4438d605..e40b360c4 100644 --- a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_bootstrap.py @@ -13,14 +13,19 @@ # limitations under the License. import logging, os, time + from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, \ - check_descriptor_load_results, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py index fe4b48493..f1ec69c65 100644 --- a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_cleanup.py @@ -12,14 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os import logging -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +import os + +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from tests.Fixtures import context_client, device_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py index 94e2e2388..39d45d43f 100644 --- a/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py +++ b/src/tests/p4-sd-fabric-svc-upf/tests-setup/test_functional_purge.py @@ -13,7 +13,10 @@ # limitations under the License. import logging -from common.proto.context_pb2 import ServiceId, DeviceId, LinkId, ServiceStatusEnum + +from common.proto.context_pb2 import ( + DeviceId, LinkId, ServiceId, ServiceStatusEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id @@ -21,9 +24,12 @@ from common.tools.object_factory.Service import json_service_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import from tests.tools.test_tools_p4 import ADMIN_CONTEXT_ID +from .Fixtures import ( # pylint: disable=unused-import + context_client, device_client, service_client, +) + LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_01_onboarding.py b/src/tests/qkd_end2end/tests/test_01_onboarding.py index e609856e7..55c6f79b2 100644 --- a/src/tests/qkd_end2end/tests/test_01_onboarding.py +++ b/src/tests/qkd_end2end/tests/test_01_onboarding.py @@ -13,13 +13,21 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_02_create_links.py b/src/tests/qkd_end2end/tests/test_02_create_links.py index 4d7587cf3..757326389 100644 --- a/src/tests/qkd_end2end/tests/test_02_create_links.py +++ b/src/tests/qkd_end2end/tests/test_02_create_links.py @@ -13,20 +13,25 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, Empty, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, Empty, ServiceStatusEnum, ServiceTypeEnum, +) from common.proto.qkd_app_pb2 import QKDAppStatusEnum, QKDAppTypesEnum -from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results +from common.tools.descriptor.Loader import ( + DescriptorLoader, check_descriptor_load_results, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient from qkd_app.client.QKDAppClient import QKDAppClient from service.client.ServiceClient import ServiceClient -from .Fixtures import ( # pylint: disable=unused-import - context_client, device_client, service_client, qkd_app_client -) +from .Fixtures import ( + context_client, device_client, qkd_app_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_03_create_external_app.py b/src/tests/qkd_end2end/tests/test_03_create_external_app.py index f9efd8aba..e51009f7e 100644 --- a/src/tests/qkd_end2end/tests/test_03_create_external_app.py +++ b/src/tests/qkd_end2end/tests/test_03_create_external_app.py @@ -14,6 +14,7 @@ import json, logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId from common.proto.qkd_app_pb2 import QKDAppStatusEnum, QKDAppTypesEnum @@ -21,9 +22,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient -from .Fixtures import context_client, qkd_app_client # pylint: disable=unused-import -from .Tools import do_rest_post_request +from .Fixtures import ( + context_client, qkd_app_client, +) # pylint: disable=unused-import +from .Tools import do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_04_delete_external_app.py b/src/tests/qkd_end2end/tests/test_04_delete_external_app.py index f352498a8..c38740a24 100644 --- a/src/tests/qkd_end2end/tests/test_04_delete_external_app.py +++ b/src/tests/qkd_end2end/tests/test_04_delete_external_app.py @@ -14,6 +14,7 @@ import logging from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId from common.proto.qkd_app_pb2 import AppId, QKDAppStatusEnum, QKDAppTypesEnum @@ -21,8 +22,10 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient -from .Fixtures import context_client, qkd_app_client # pylint: disable=unused-import +from .Fixtures import ( + context_client, qkd_app_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_05_delete_links.py b/src/tests/qkd_end2end/tests/test_05_delete_links.py index 07a85963d..5613a942b 100644 --- a/src/tests/qkd_end2end/tests/test_05_delete_links.py +++ b/src/tests/qkd_end2end/tests/test_05_delete_links.py @@ -14,6 +14,7 @@ import logging from typing import Set + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceId from common.proto.qkd_app_pb2 import AppId, QKDAppStatusEnum, QKDAppTypesEnum @@ -22,11 +23,10 @@ from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from qkd_app.client.QKDAppClient import QKDAppClient from service.client.ServiceClient import ServiceClient -from .Fixtures import ( - # pylint: disable=unused-import - context_client, qkd_app_client, service_client -) +from .Fixtures import ( + context_client, qkd_app_client, service_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/qkd_end2end/tests/test_06_cleanup.py b/src/tests/qkd_end2end/tests/test_06_cleanup.py index e3c770e7a..f99486388 100644 --- a/src/tests/qkd_end2end/tests/test_06_cleanup.py +++ b/src/tests/qkd_end2end/tests/test_06_cleanup.py @@ -13,13 +13,19 @@ # limitations under the License. import logging, os + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId -from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario +from common.tools.descriptor.Loader import ( + DescriptorLoader, validate_empty_scenario, +) from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_cleanup.py b/src/tests/ryu-openflow/tests/test_cleanup.py index 4d8ea7f6e..2cb728e05 100644 --- a/src/tests/ryu-openflow/tests/test_cleanup.py +++ b/src/tests/ryu-openflow/tests/test_cleanup.py @@ -14,6 +14,7 @@ import graphlib, logging, os from typing import Dict, List, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, DeviceId, Empty from common.tools.descriptor.Loader import validate_empty_scenario @@ -21,7 +22,10 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_onboarding.py b/src/tests/ryu-openflow/tests/test_onboarding.py index 18af3e128..3aab877da 100644 --- a/src/tests/ryu-openflow/tests/test_onboarding.py +++ b/src/tests/ryu-openflow/tests/test_onboarding.py @@ -13,16 +13,22 @@ # limitations under the License. import logging, os, time + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty +from common.proto.context_pb2 import ( + ContextId, DeviceOperationalStatusEnum, Empty, +) from common.tools.descriptor.Loader import ( - DescriptorLoader, check_descriptor_load_results, validate_empty_scenario + DescriptorLoader, check_descriptor_load_results, validate_empty_scenario, ) #from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient -from .Fixtures import context_client, device_client # pylint: disable=unused-import + +from .Fixtures import ( + context_client, device_client, +) # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py b/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py index 5cf59ac3f..84fdd34eb 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py +++ b/src/tests/ryu-openflow/tests/test_service_ietf_create_h1_h3.py @@ -14,14 +14,17 @@ import json, logging, os from typing import Dict, Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py b/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py index c81f06db2..7f9882573 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py +++ b/src/tests/ryu-openflow/tests/test_service_ietf_create_h2_h4.py @@ -14,14 +14,17 @@ import json, logging, os from typing import Dict, Set + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_get_request, do_rest_post_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_get_request, do_rest_post_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py index 5e1385c47..168057c42 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py +++ b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h1_h3.py @@ -14,14 +14,17 @@ import logging, os from typing import Dict, Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py index d249722e9..8c977ae66 100644 --- a/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py +++ b/src/tests/ryu-openflow/tests/test_service_ietf_remove_h2_h4.py @@ -14,14 +14,17 @@ import logging, os from typing import Dict, Set, Tuple + from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum +from common.proto.context_pb2 import ( + ContextId, ServiceStatusEnum, ServiceTypeEnum, +) from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from .Fixtures import context_client # pylint: disable=unused-import -from .Tools import do_rest_delete_request +from .Fixtures import context_client # pylint: disable=unused-import +from .Tools import do_rest_delete_request LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/scenario2/old_tests/tests/Fixtures.py b/src/tests/scenario2/old_tests/tests/Fixtures.py index d2220db5c..f5d671bf5 100644 --- a/src/tests/scenario2/old_tests/tests/Fixtures.py +++ b/src/tests/scenario2/old_tests/tests/Fixtures.py @@ -15,37 +15,61 @@ import pytest from common.Settings import get_setting from common.proto.monitoring_pb2 import AlarmDescriptor, AlarmSubscription +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient from nbi.tests.mock_osm.MockOSM import MockOSM from .Objects import WIM_MAPPING, WIM_PASSWORD, WIM_USERNAME +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient() + yield _client + _client.close() + + +@pytest.fixture(scope='session') +def monitoring_client(): + _client = MonitoringClient() + yield _client + _client.close() + + @pytest.fixture(scope='session') def osm_wim(): wim_url = 'http://{:s}:{:s}'.format( get_setting('NBISERVICE_SERVICE_HOST'), str(get_setting('NBISERVICE_SERVICE_PORT_HTTP'))) return MockOSM(wim_url, WIM_MAPPING, WIM_USERNAME, WIM_PASSWORD) + @pytest.fixture(scope='session') def alarm_descriptor(): - alarm_descriptor = AlarmDescriptor() - alarm_descriptor.alarm_description = "Default Alarm Description" - alarm_descriptor.name = "Default Alarm Name" - alarm_descriptor.kpi_value_range.kpiMinValue.floatVal = 0.0 - alarm_descriptor.kpi_value_range.kpiMaxValue.floatVal = 250.0 - alarm_descriptor.kpi_value_range.inRange = True - alarm_descriptor.kpi_value_range.includeMinValue = False - alarm_descriptor.kpi_value_range.includeMaxValue = True + alarm_descriptor.alarm_description = 'Default Alarm Description' + alarm_descriptor.name = 'Default Alarm Name' + alarm_descriptor.kpi_value_range.kpiMinValue.floatVal = 0.0 + alarm_descriptor.kpi_value_range.kpiMaxValue.floatVal = 250.0 + alarm_descriptor.kpi_value_range.inRange = True + alarm_descriptor.kpi_value_range.includeMinValue = False + alarm_descriptor.kpi_value_range.includeMaxValue = True return alarm_descriptor + @pytest.fixture(scope='session') def alarm_subscription(): - alarm_subscription = AlarmSubscription() - alarm_subscription.subscription_timeout_s = 10 - alarm_subscription.subscription_frequency_ms = 2000 + alarm_subscription.subscription_timeout_s = 10 + alarm_subscription.subscription_frequency_ms = 2000 - return alarm_subscription \ No newline at end of file + return alarm_subscription diff --git a/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py b/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py index 6d9f5f53a..e2f5946f7 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_bootstrap.py @@ -13,22 +13,28 @@ # limitations under the License. import copy, logging, pytest + +from common.proto.context_pb2 import ( + Context, ContextId, Device, Empty, Link, Topology, +) +from common.proto.monitoring_pb2 import ( + AlarmDescriptor, AlarmList, KpiDescriptorList, +) from common.Settings import get_setting -from common.proto.monitoring_pb2 import KpiDescriptorList from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology -from common.proto.monitoring_pb2 import AlarmDescriptor, AlarmList from device.client.DeviceClient import DeviceClient +from monitoring.client.MonitoringClient import MonitoringClient + +from .Fixtures import ( + alarm_descriptor, context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES -from tests.Fixtures import context_client, device_client, monitoring_client -from .Fixtures import alarm_descriptor LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py b/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py index 6b157cefa..dc1ec2562 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_cleanup.py @@ -13,6 +13,13 @@ # limitations under the License. import logging, pytest + +from common.proto.context_pb2 import ( + ContextId, DeviceId, Empty, LinkId, TopologyId, +) +from common.proto.monitoring_pb2 import ( + AlarmID, AlarmList, KpiDescriptorList, KpiId, +) from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, check_events from common.tools.object_factory.Context import json_context_id @@ -21,11 +28,12 @@ from common.tools.object_factory.Link import json_link_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId -from common.proto.monitoring_pb2 import KpiId, KpiDescriptorList, AlarmList, AlarmID from device.client.DeviceClient import DeviceClient from monitoring.client.MonitoringClient import MonitoringClient -from tests.Fixtures import context_client, device_client, monitoring_client + +from .Fixtures import ( + context_client, device_client, monitoring_client, +) # pylint: disable=unused-import from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES LOGGER = logging.getLogger(__name__) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_create_service.py b/src/tests/scenario2/old_tests/tests/test_functional_create_service.py index 4485ce3ed..db490bd51 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_create_service.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_create_service.py @@ -13,25 +13,30 @@ # limitations under the License. import logging, pytest, random, time + from grpc._channel import _MultiThreadedRendezvous + from common.DeviceTypes import DeviceTypeEnum +from common.proto.context_pb2 import ContextId, Empty +from common.proto.monitoring_pb2 import AlarmList, AlarmSubscription from common.Settings import get_setting from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Connection import json_connection_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Service import json_service_id -from common.tools.grpc.Tools import grpc_message_to_json_string -from nbi.tests.mock_osm.MockOSM import MockOSM from context.client.ContextClient import ContextClient -from monitoring.client.MonitoringClient import MonitoringClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, Empty -from common.proto.monitoring_pb2 import AlarmList, AlarmSubscription -from tests.Fixtures import context_client, monitoring_client -from .Fixtures import osm_wim, alarm_subscription +from monitoring.client.MonitoringClient import MonitoringClient +from nbi.tests.mock_osm.MockOSM import MockOSM + +from .Fixtures import ( + alarm_subscription, context_client, monitoring_client, osm_wim, +) # pylint: disable=unused-import from .Objects import ( - CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, DEVICES, LINKS, TOPOLOGIES, - WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE) + CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, + DEVICES, LINKS, TOPOLOGIES, WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE, +) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py b/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py index 42a9456e0..da6cce21c 100644 --- a/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py +++ b/src/tests/scenario2/old_tests/tests/test_functional_delete_service.py @@ -13,23 +13,24 @@ # limitations under the License. import logging, pytest + from common.DeviceTypes import DeviceTypeEnum +from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum from common.Settings import get_setting from common.tests.EventTools import EVENT_REMOVE, EVENT_UPDATE, check_events +from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Connection import json_connection_id from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Service import json_service_id -from common.tools.grpc.Tools import grpc_message_to_json_string -from nbi.tests.mock_osm.MockOSM import MockOSM from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum -from tests.Fixtures import context_client -from .Fixtures import osm_wim -from .Objects import ( - CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, DEVICES, LINKS, TOPOLOGIES, WIM_MAPPING, - WIM_PASSWORD, WIM_USERNAME) +from nbi.tests.mock_osm.MockOSM import MockOSM +from .Fixtures import context_client, osm_wim # pylint: disable=unused-import +from .Objects import ( + CONTEXT_ID, CONTEXTS, DEVICE_O1_UUID, DEVICE_R1_UUID, DEVICE_R3_UUID, + DEVICES, LINKS, TOPOLOGIES, WIM_MAPPING, WIM_PASSWORD, WIM_USERNAME, +) LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -- GitLab From 62bf7051a091ad14b33143b0e5fa68a353e00103 Mon Sep 17 00:00:00 2001 From: BabisChat Date: Tue, 17 Mar 2026 22:38:52 +0100 Subject: [PATCH 351/371] changed duplicate gnmi_nokia_srlinux driver to openroadm --- src/webui/service/device/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py index 33465eeca..6c2cbe361 100644 --- a/src/webui/service/device/forms.py +++ b/src/webui/service/device/forms.py @@ -42,7 +42,7 @@ class AddDeviceForm(FlaskForm): device_drivers_morpheus = BooleanField('MORPHEUS') device_drivers_ryu = BooleanField('RYU') device_drivers_gnmi_nokia_srlinux = BooleanField('GNMI NOKIA SR LINUX') - device_drivers_gnmi_nokia_srlinux = BooleanField('OPENROADM') + device_drivers_openroadm = BooleanField('OPENROADM') device_drivers_restconf_openconfig = BooleanField('RESTCONF OPENCONFIG') device_config_address = StringField('connect/address',default='127.0.0.1',validators=[DataRequired(), Length(min=5)]) -- GitLab From fe55cd10033754afbe465850a44ca6c7da2607c9 Mon Sep 17 00:00:00 2001 From: armingol Date: Fri, 27 Mar 2026 11:23:36 +0000 Subject: [PATCH 352/371] Update Yang models --- .../yang/ietf-te-packet-types@2026-01-15.yang | 844 --- .../yang/ietf-te-types@2026-01-23.yang | 4541 ----------------- 2 files changed, 5385 deletions(-) delete mode 100644 src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang delete mode 100644 src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang diff --git a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang deleted file mode 100644 index 54393a9c3..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2026-01-15.yang +++ /dev/null @@ -1,844 +0,0 @@ -module ietf-te-packet-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-te-packet-types"; - prefix te-packet-types; - - import ietf-yang-types { - prefix yang; - reference - "RFC 9911: Common YANG Data Types"; - } - import ietf-te-types { - prefix te-types; - reference - "RFC XXXX: Common YANG Data Types for Traffic Engineering"; - } - - organization - "IETF Traffic Engineering Architecture and Signaling (TEAS) - Working Group"; - contact - "WG Web: - WG List: - - Editor: Tarek Saad - - - Editor: Rakesh Gandhi - - - Editor: Vishnu Pavan Beeram - - - Editor: Xufeng Liu - - - Editor: Igor Bryskin - "; - description - "This YANG module contains a collection of generally useful YANG - data type definitions specific to Packet Traffic Engineering - (TE). - - The model conforms to the Network Management Datastore - Architecture (NMDA). - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - they appear in all capitals, as shown here. - - Copyright (c) 2026 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject to - the license terms contained in, the Revised BSD License set - forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - This version of this YANG module is part of RFC XXXX - (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself - for full legal notices."; - - // RFC Ed.: update the date below with the date of RFC publication - // and remove this note. - - revision 2026-01-15 { - description - "This revision adds the following new identities: - - bandwidth-profile-type; - - link-metric-delay-variation; - - link-metric-loss; - - path-metric-delay-variation; - - path-metric-loss. - - This revision adds the following new groupings: - - bandwidth-profile-parameters; - - te-packet-path-bandwidth; - - te-packet-link-bandwidth. - - This revision provides also few editorial changes."; - reference - "RFC XXXX: Common YANG Data Types for Traffic Engineering"; - } - revision 2020-06-10 { - description - "Latest revision of TE MPLS types."; - reference - "RFC 8776: Common YANG Data Types for Traffic Engineering"; - } - - /* - * Identities - */ - - identity bandwidth-profile-type { - description - "Bandwidth Profile Types"; - } - - identity mef-10 { - base bandwidth-profile-type; - description - "MEF 10 Bandwidth Profile"; - reference - "MEF 10.3: Ethernet Services Attributes Phase 3"; - } - - identity rfc-2697 { - base bandwidth-profile-type; - description - "RFC 2697 Bandwidth Profile"; - reference - "RFC 2697: A Single Rate Three Color Marker"; - } - - identity rfc-2698 { - base bandwidth-profile-type; - description - "RFC 2698 Bandwidth Profile"; - reference - "RFC 2698: A Two Rate Three Color Marker"; - } - - // Derived identities from te-types:link-metric-type - - identity link-metric-delay-variation { - base te-types:link-metric-type; - description - "The Unidirectional Delay Variation Metric, - measured in units of microseconds."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions, - Section 4.3 - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions, - Section 4.3"; - } - - identity link-metric-loss { - base te-types:link-metric-type; - description - "The Unidirectional Link Loss Metric, - measured in units of 0.000003%."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions, - Section 4.4 - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions, - Section 4.4"; - } - - // Derived identities from te-types:path-metric-type - - identity path-metric-delay-variation { - base te-types:path-metric-type; - description - "The Path Delay Variation Metric, - measured in units of microseconds."; - reference - "RFC 8233: Extensions to the Path Computation Element - Communication Protocol (PCEP) to Compute - Service-Aware Label Switched Paths (LSPs), - Section 3.1.2"; - } - - identity path-metric-loss { - base te-types:path-metric-type; - description - "The Path Loss Metric, measured in units of 0.000003%."; - reference - "RFC 8233: Extensions to the Path Computation Element - Communication Protocol (PCEP) to Compute - Service-Aware Label Switched Paths (LSPs), - Section 3.1.3"; - } - - identity backup-protection-type { - description - "Base identity for the backup protection type."; - } - - identity backup-protection-link { - base backup-protection-type; - description - "Backup provides link protection only."; - } - - identity backup-protection-node-link { - base backup-protection-type; - description - "Backup offers node (preferred) or link protection."; - } - - identity bc-model-type { - description - "Base identity for the Diffserv-TE Bandwidth Constraints - Model type."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - identity bc-model-rdm { - base bc-model-type; - description - "Russian Dolls Bandwidth Constraints Model type."; - reference - "RFC 4127: Russian Dolls Bandwidth Constraints Model for - Diffserv-aware MPLS Traffic Engineering"; - } - - identity bc-model-mam { - base bc-model-type; - description - "Maximum Allocation Bandwidth Constraints Model type."; - reference - "RFC 4125: Maximum Allocation Bandwidth Constraints Model for - Diffserv-aware MPLS Traffic Engineering"; - } - - identity bc-model-mar { - base bc-model-type; - description - "Maximum Allocation with Reservation Bandwidth Constraints - Model type."; - reference - "RFC 4126: Max Allocation with Reservation Bandwidth - Constraints Model for Diffserv-aware MPLS Traffic - Engineering & Performance Comparisons"; - } - - /* - * Typedefs - */ - - typedef te-bandwidth-requested-type { - type enumeration { - enum specified-value { - description - "Bandwidth value is explicitly specified."; - } - enum specified-profile { - description - "Bandwidth profile is explicitly specified."; - } - enum auto { - description - "Bandwidth is automatically computed."; - } - } - description - "Enumerated type for specifying whether bandwidth is - explicitly specified or automatically computed."; - } - - typedef te-class-type { - type uint8; - description - "Diffserv-TE Class-Type. - Defines a set of Traffic Trunks crossing a link that is - governed by a specific set of bandwidth constraints. - - Class-Type is used for the purposes of link bandwidth - allocation, constraint-based routing, and admission control."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - typedef bc-type { - type uint8 { - range "0..7"; - } - description - "Diffserv-TE bandwidth constraints as defined in RFC 4124."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering"; - } - - typedef bandwidth-kbps { - type uint64; - units "kilobits per second"; - description - "Bandwidth values, expressed in kilobits per second."; - } - - typedef bandwidth-mbps { - type uint64; - units "megabits per second"; - description - "Bandwidth values, expressed in megabits per second."; - } - - typedef bandwidth-gbps { - type uint64; - units "gigabits per second"; - description - "Bandwidth values, expressed in gigabits per second."; - } - - /* - * Groupings - */ - - grouping performance-metrics-attributes-packet { - description - "Contains Performance Metrics (PM) information."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - uses te-types:performance-metrics-attributes { - augment "performance-metrics-one-way" { - description - "Performance Metrics (PM) one-way packet-specific - augmentation for a generic PM grouping."; - leaf one-way-min-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - description - "One-way minimum delay or latency."; - } - leaf one-way-min-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way minimum delay or latency normality."; - } - leaf one-way-max-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - description - "One-way maximum delay or latency."; - } - leaf one-way-max-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way maximum delay or latency normality."; - } - leaf one-way-delay-variation { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - description - "One-way delay variation."; - reference - "RFC 5481: Packet Delay Variation Applicability - Statement, Section 4.2"; - } - leaf one-way-delay-variation-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "One-way delay variation normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) - Using TE Metric Extensions"; - } - leaf one-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - units "percent"; - description - "One-way packet loss as a percentage of the total traffic - sent over a configurable interval. - - The finest precision is 0.000003%."; - reference - "RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.4"; - } - leaf one-way-packet-loss-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Packet loss normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) - Using TE Metric Extensions"; - } - } - augment "performance-metrics-two-way" { - description - "Performance Metrics (PM) two-way packet-specific - augmentation for a generic PM grouping."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE - Metric Extensions"; - leaf two-way-min-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way minimum delay or latency."; - } - leaf two-way-min-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way minimum delay or latency normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) - Using TE Metric Extensions"; - } - leaf two-way-max-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way maximum delay or latency."; - } - leaf two-way-max-delay-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way maximum delay or latency normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) - Using TE Metric Extensions"; - } - leaf two-way-delay-variation { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way delay variation."; - reference - "RFC 5481: Packet Delay Variation Applicability - Statement, Section 4.2"; - } - leaf two-way-delay-variation-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way delay variation normality."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions - RFC 7823: Performance-Based Path Selection for - Explicitly Routed Label Switched Paths (LSPs) - Using TE Metric Extensions"; - } - leaf two-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - units "percent"; - default "0"; - description - "Two-way packet loss as a percentage of the total traffic - sent over a configurable interval. - - The finest precision is 0.000003%."; - } - leaf two-way-packet-loss-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Two-way packet loss normality."; - } - } - } - } - - grouping one-way-performance-metrics-packet { - description - "One-way packet Performance Metrics (PM) throttle grouping."; - leaf one-way-min-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "One-way minimum delay or latency."; - } - leaf one-way-max-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "One-way maximum delay or latency."; - } - leaf one-way-delay-variation { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "One-way delay variation."; - } - leaf one-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - units "percent"; - default "0"; - description - "One-way packet loss as a percentage of the total traffic - sent over a configurable interval. - - The finest precision is 0.000003%."; - } - } - - grouping one-way-performance-metrics-gauge-packet { - description - "One-way packet Performance Metrics (PM) throttle grouping. - - This grouping is used to report the same metrics defined in - the one-way-performance-metrics-packet grouping, using gauges - instead of uint32 data types and referencing IPPM RFCs - instead of IGP-TE RFCs."; - leaf one-way-min-delay { - type yang:gauge64; - units "microseconds"; - description - "One-way minimum delay or latency."; - } - leaf one-way-max-delay { - type yang:gauge64; - units "microseconds"; - description - "One-way maximum delay or latency."; - reference - "RFC 7679: A One-Way Delay Metric for IP Performance - Metrics (IPPM)"; - } - leaf one-way-delay-variation { - type yang:gauge64; - units "microseconds"; - description - "One-way delay variation."; - reference - "RFC 3393: IP Packet Delay Variation Metric for IP - Performance Metrics (IPPM)"; - } - leaf one-way-packet-loss { - type decimal64 { - fraction-digits 5; - range "0..100"; - } - description - "The ratio of packets dropped to packets transmitted between - two endpoints."; - reference - "RFC 7680: A One-Way Loss Metric for IP Performance - Metrics (IPPM)"; - } - } - - grouping two-way-performance-metrics-packet { - description - "Two-way packet Performance Metrics (PM) throttle grouping."; - leaf two-way-min-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way minimum delay or latency."; - } - leaf two-way-max-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way maximum delay or latency."; - } - leaf two-way-delay-variation { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way delay variation."; - } - leaf two-way-packet-loss { - type decimal64 { - fraction-digits 6; - range "0..50.331642"; - } - units "percent"; - default "0"; - description - "Two-way packet loss as a percentage of the total traffic - sent over a configurable interval. - - The finest precision is 0.000003%."; - } - } - - grouping two-way-performance-metrics-gauge-packet { - description - "Two-way packet Performance Metrics (PM) throttle grouping. - - This grouping is used to report the same metrics defined in - the two-way-performance-metrics-packet grouping, using gauges - instead of uint32 data types and referencing IPPM RFCs - instead of IGP-TE RFCs."; - leaf two-way-min-delay { - type yang:gauge64; - units "microseconds"; - description - "Two-way minimum delay or latency."; - reference - "RFC 2681: A Round-trip Delay Metric for IPPM"; - } - leaf two-way-max-delay { - type yang:gauge64; - units "microseconds"; - description - "Two-way maximum delay or latency."; - reference - "RFC 2681: A Round-trip Delay Metric for IPPM"; - } - leaf two-way-delay-variation { - type yang:gauge64; - units "microseconds"; - description - "Two-way delay variation."; - reference - "RFC 5481: Packet Delay Variation Applicability Statement"; - } - leaf two-way-packet-loss { - type decimal64 { - fraction-digits 5; - range "0..100"; - } - description - "The ratio of packets dropped to packets transmitted between - two endpoints."; - } - } - - grouping performance-metrics-throttle-container-packet { - description - "Packet Performance Metrics (PM) threshold grouping."; - uses te-types:performance-metrics-throttle-container { - augment "throttle/threshold-out" { - description - "Performance Metrics (PM) threshold-out packet - augmentation for a generic grouping."; - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - } - augment "throttle/threshold-in" { - description - "Performance Metrics (PM) threshold-in packet augmentation - for a generic grouping."; - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - } - augment "throttle/threshold-accelerated-advertisement" { - description - "Performance Metrics (PM) accelerated advertisement packet - augmentation for a generic grouping."; - uses one-way-performance-metrics-packet; - uses two-way-performance-metrics-packet; - } - } - } - - grouping bandwidth-profile-parameters { - description - "Common parameters to define bandwidth profiles, also known as - traffic profiles in RFC 2475, that may be used to specify the - temporal properties of a packet stream (e.g., MPLS-TE LSPs), - e.g., as specified in MEF 10, RFC 2697 or RFC 2698."; - reference - "RFC 2475: An Architecture for Differentiated Services - MEF 10.3: Ethernet Services Attributes Phase 3 - RFC 2697: A Single Rate Three Color Marker - RFC 2698: A Two Rate Three Color Marker"; - leaf cir { - type uint64; - units "bits per second"; - description - "Committed Information Rate (CIR)."; - } - leaf cbs { - type uint64; - units "bytes"; - description - "Committed Burst Size (CBS)."; - } - leaf eir { - type uint64; - units "bits per second"; - description - "Excess Information Rate (EIR)."; - } - leaf ebs { - type uint64; - units "bytes"; - description - "Excess Burst Size (EBS)."; - } - leaf pir { - type uint64; - units "bits per second"; - description - "Peak Information Rate (PIR)."; - } - leaf pbs { - type uint64; - units "bytes"; - description - "Peak Burst Size (PBS)."; - } - } - - grouping te-packet-path-bandwidth { - description - "Bandwidth attributes for TE Packet paths."; - container packet-bandwidth { - description - "Bandwidth attributes for TE Packet paths."; - leaf specification-type { - type te-bandwidth-requested-type; - description - "The bandwidth specification type, either explicitly - specified or automatically computed."; - } - leaf set-bandwidth { - when "../specification-type = 'specified-value'" { - description - "When the bandwidth value is explicitly specified."; - } - type bandwidth-kbps; - description - "Set the bandwidth value explicitly, e.g., using offline - calculation."; - } - container bandwidth-profile { - when "../specification-type = 'specified-profile'" { - description - "When the bandwidth profile is explicitly specified."; - } - description - "Set the bandwidth profile attributes explicitly."; - leaf bandwidth-profile-name { - type string; - description - "Name of Bandwidth Profile."; - } - leaf bandwidth-profile-type { - type identityref { - base bandwidth-profile-type; - } - description - "Type of Bandwidth Profile."; - } - uses bandwidth-profile-parameters; - } - leaf class-type { - type te-types:te-ds-class; - description - "The Class-Type of traffic transported by the LSP."; - reference - "RFC 4124: Protocol Extensions for Support of - Diffserv-aware MPLS Traffic Engineering, - Section 4.3.1"; - } - leaf signaled-bandwidth { - type te-packet-types:bandwidth-kbps; - config false; - description - "The currently signaled bandwidth of the LSP. - - In the case where the bandwidth is specified - explicitly, then this will match the value of the - set-bandwidth leaf. - - In the cases where the bandwidth is dynamically - computed by the system, the current value of the - bandwidth should be reflected."; - } - } - } - - grouping te-packet-link-bandwidth { - description - "Bandwidth attributes for Packet TE links."; - leaf packet-bandwidth { - type uint64; - units "bits per second"; - description - "Bandwidth value for Packet TE links."; - } - } -} diff --git a/src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang b/src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang deleted file mode 100644 index beb464034..000000000 --- a/src/nbi/service/ietf_network/yang/ietf-te-types@2026-01-23.yang +++ /dev/null @@ -1,4541 +0,0 @@ -module ietf-te-types { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-te-types"; - prefix te-types; - - import ietf-inet-types { - prefix inet; - reference - "RFC 9911: Common YANG Data Types, Section 4"; - } - import ietf-yang-types { - prefix yang; - reference - "RFC 9911: Common YANG Data Types, Section 3"; - } - import ietf-routing-types { - prefix rt-types; - reference - "RFC 8294: Common YANG Data Types for the Routing Area"; - } - import ietf-network { - prefix nw; - reference - "RFC 8345: A YANG Data Model for Network Topologies"; - } - import ietf-network-topology { - prefix nt; - reference - "RFC 8345: A YANG Data Model for Network Topologies"; - } - - organization - "IETF Traffic Engineering Architecture and Signaling (TEAS) - Working Group"; - contact - "WG Web: - WG List: - - Editor: Tarek Saad - - - Editor: Rakesh Gandhi - - - Editor: Vishnu Pavan Beeram - - - Editor: Xufeng Liu - - - Editor: Igor Bryskin - "; - description - "This YANG module contains a collection of generally useful - YANG data type definitions specific to TE. - - The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL - NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', - 'MAY', and 'OPTIONAL' in this document are to be interpreted as - described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, - they appear in all capitals, as shown here. - - Copyright (c) 2026 IETF Trust and the persons identified as - authors of the code. All rights reserved. - - Redistribution and use in source and binary forms, with or - without modification, is permitted pursuant to, and subject to - the license terms contained in, the Revised BSD License set - forth in Section 4.c of the IETF Trust's Legal Provisions - Relating to IETF Documents - (https://trustee.ietf.org/license-info). - - All revisions of IETF and IANA published modules can be found - at the YANG Parameters registry group - (https://www.iana.org/assignments/yang-parameters). - - This version of this YANG module is part of RFC XXXX; see - the RFC itself for full legal notices."; - - revision 2026-01-23 { - description - "This revision adds the following new identities: - - lsp-provisioning-error-reason; - - association-type-diversity; - - tunnel-admin-state-auto; - - lsp-restoration-restore-none; - - restoration-scheme-rerouting; - - path-metric-optimization-type; - - link-path-metric-type; - - link-metric-type and its derived identities; - - path-computation-error-reason and its derived identities; - - protocol-origin-type and its derived identities; - - svec-objective-function-type and its derived identities; - - svec-metric-type and its derived identities. - - This revision adds the following new data types: - - path-type. - - This revision adds the following new groupings: - - explicit-route-hop-with-srlg; - - encoding-and-switching-type; - - te-generic-node-id. - - This revision updates the following identities: - - objective-function-type; - - action-exercise; - - path-metric-type; - - path-metric-te; - - path-metric-igp; - - path-metric-hop; - - path-metric-delay-average; - - path-metric-delay-minimum; - - path-metric-residual-bandwidth; - - path-metric-optimize-includes; - - path-metric-optimize-excludes; - - te-optimization-criterion. - - This revision updates the following data types: - - te-node-id. - - This revision updates the following groupings: - - explicit-route-hop: - - adds the following leaves: - - node-id-uri; - - link-tp-id-uri; - - updates the following leaves: - - node-id; - - link-tp-id; - - record-route-state: - - adds the following leaves: - - node-id-uri; - - link-tp-id-uri; - - updates the following leaves: - - node-id; - - link-tp-id; - - optimization-metric-entry: - - updates the following leaves: - - metric-type; - - tunnel-constraints; - - adds the following leaves: - - network-id; - - path-constraints-route-objects: - - updates the following containers: - - explicit-route-objects-always; - - generic-path-metric-bounds: - - updates the following leaves: - - metric-type; - - generic-path-optimization - - adds the following leaves: - - tiebreaker; - - deprecate the following containers: - - tiebreakers. - - This revision obsoletes the following identities: - - of-minimize-agg-bandwidth-consumption; - - of-minimize-load-most-loaded-link; - - of-minimize-cost-path-set; - - lsp-protection-reroute-extra; - - lsp-protection-reroute. - - This revision provides also few editorial changes."; - reference - "RFC XXXX: Common YANG Data Types for Traffic Engineering"; - } - revision 2020-06-10 { - description - "Initial Version of TE types."; - reference - "RFC 8776: Common YANG Data Types for Traffic Engineering"; - } - - /* - * Features - */ - - feature p2mp-te { - description - "Indicates support for Point-to-Multipoint TE (P2MP-TE)."; - reference - "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for - Point-to-Multipoint TE Label Switched Paths (LSPs)"; - } - - feature frr-te { - description - "Indicates support for TE Fast Reroute (FRR)."; - reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; - } - - feature extended-admin-groups { - description - "Indicates support for TE link extended administrative - groups."; - reference - "RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; - } - - feature named-path-affinities { - description - "Indicates support for named path affinities."; - } - - feature named-extended-admin-groups { - description - "Indicates support for named extended administrative groups."; - } - - feature named-srlg-groups { - description - "Indicates support for named Shared Risk Link Group (SRLG)."; - } - - feature named-path-constraints { - description - "Indicates support for named path constraints."; - } - - feature path-optimization-metric { - description - "Indicates support for path optimization metrics."; - } - - feature path-optimization-objective-function { - description - "Indicates support for path optimization objective functions."; - } - - /* - * Identities - */ - - identity lsp-provisioning-error-reason { - description - "Base identity for LSP provisioning errors."; - } - - identity session-attributes-flags { - description - "Base identity for the RSVP-TE session attributes flags."; - } - - identity local-protection-desired { - base session-attributes-flags; - description - "Local protection is desired."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.7.1"; - } - - identity se-style-desired { - base session-attributes-flags; - description - "Shared explicit style, to allow the LSP to be established - and share resources with the old LSP."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - - identity local-recording-desired { - base session-attributes-flags; - description - "Label recording is desired."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.7.1"; - } - - identity bandwidth-protection-desired { - base session-attributes-flags; - description - "Requests FRR bandwidth protection on LSRs, if present."; - reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels"; - } - - identity node-protection-desired { - base session-attributes-flags; - description - "Requests FRR node protection on LSRs, if present."; - reference - "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels"; - } - - identity path-reevaluation-request { - base session-attributes-flags; - description - "Indicates that a path re-evaluation (of the - current path in use) is requested. - - Note that this does not trigger any LSP reroutes but - instead just signals a request to evaluate whether a - preferable path exists."; - reference - "RFC 4736: Reoptimization of Multiprotocol Label Switching - (MPLS) Traffic Engineering (TE) Loosely Routed - Label Switched Path (LSP)"; - } - - identity soft-preemption-desired { - base session-attributes-flags; - description - "Soft preemption of LSP resources is desired."; - reference - "RFC 5712: MPLS Traffic Engineering Soft Preemption"; - } - - identity lsp-attributes-flags { - description - "Base identity for LSP attributes flags."; - } - - identity end-to-end-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates end-to-end rerouting behavior for an LSP - undergoing establishment. - - This MAY also be used to specify the behavior of end-to-end - LSP recovery for established LSPs."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol Traffic - Engineering (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity boundary-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates boundary rerouting behavior for an LSP undergoing - establishment. - - This MAY also be used to specify segment-based LSP recovery - through nested crankback for established LSPs. - - The boundary Area Border Router (ABR) / Autonomous System - Border Router (ASBR) can decide to forward the PathErr - message upstream to either an upstream boundary ABR/ASBR or - the ingress LSR. - - Alternatively, it can try to select another egress boundary - LSR."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol Traffic - Engineering (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity segment-based-rerouting-desired { - base lsp-attributes-flags; - description - "Indicates segment-based rerouting behavior for an LSP - undergoing establishment. - - This MAY also be used to specify segment-based LSP recovery - for established LSPs."; - reference - "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS - RSVP-TE - RFC 5420: Encoding of Attributes for MPLS LSP Establishment - Using Resource Reservation Protocol - Traffic Engineering (RSVP-TE) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity lsp-integrity-required { - base lsp-attributes-flags; - description - "Indicates that LSP integrity is required."; - reference - "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for - Point-to-Multipoint TE Label Switched Paths (LSPs) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity contiguous-lsp-desired { - base lsp-attributes-flags; - description - "Indicates that a contiguous LSP is desired."; - reference - "RFC 5151: Inter-Domain MPLS and GMPLS Traffic Engineering -- - Resource Reservation Protocol-Traffic Engineering - (RSVP-TE) Extensions - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity lsp-stitching-desired { - base lsp-attributes-flags; - description - "Indicates that LSP stitching is desired."; - reference - "RFC 5150: Label Switched Path Stitching with Generalized - Multiprotocol Label Switching Traffic Engineering - (GMPLS TE) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity pre-planned-lsp-flag { - base lsp-attributes-flags; - description - "Indicates that the LSP MUST be provisioned in the - control plane only."; - reference - "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions for - Multi-Layer and Multi-Region Networks (MLN/MRN) - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity non-php-behavior-flag { - base lsp-attributes-flags; - description - "Indicates that non-PHP (non-Penultimate Hop Popping) - behavior for the LSP is desired."; - reference - "RFC 6511: Non-Penultimate Hop Popping Behavior and - Out-of-Band Mapping for RSVP-TE Label Switched - Paths - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity oob-mapping-flag { - base lsp-attributes-flags; - description - "Indicates that signaling of the egress binding information - is out of band (e.g., via the Border Gateway Protocol - (BGP))."; - reference - "RFC 6511: Non-Penultimate Hop Popping Behavior and - Out-of-Band Mapping for RSVP-TE Label Switched - Paths - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity entropy-label-capability { - base lsp-attributes-flags; - description - "Indicates entropy label capability."; - reference - "RFC 6790: The Use of Entropy Labels in MPLS Forwarding - RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO)"; - } - - identity oam-mep-entity-desired { - base lsp-attributes-flags; - description - "OAM Maintenance Entity Group End Point (MEP) entities - desired."; - reference - "RFC 7260: GMPLS RSVP-TE Extensions for Operations, - Administration, and Maintenance (OAM) - Configuration"; - } - - identity oam-mip-entity-desired { - base lsp-attributes-flags; - description - "OAM Maintenance Entity Group Intermediate Points (MIP) - entities desired."; - reference - "RFC 7260: GMPLS RSVP-TE Extensions for Operations, - Administration, and Maintenance (OAM) - Configuration"; - } - - identity srlg-collection-desired { - base lsp-attributes-flags; - description - "Shared Risk Link Group (SRLG) collection desired."; - reference - "RFC 7570: Label Switched Path (LSP) Attribute in the - Explicit Route Object (ERO) - RFC 8001: RSVP-TE Extensions for Collecting Shared Risk - Link Group (SRLG) Information"; - } - - identity loopback-desired { - base lsp-attributes-flags; - description - "Indicates that a particular node on the LSP is - required to enter loopback mode. - - This can also be used to specify the loopback state of the - node."; - reference - "RFC 7571: GMPLS RSVP-TE Extensions for Lock Instruct and - Loopback"; - } - - identity p2mp-te-tree-eval-request { - base lsp-attributes-flags; - description - "P2MP-TE tree re-evaluation request."; - reference - "RFC 8149: RSVP Extensions for Reoptimization of Loosely - Routed Point-to-Multipoint Traffic Engineering - Label Switched Paths (LSPs)"; - } - - identity rtm-set-desired { - base lsp-attributes-flags; - description - "Residence Time Measurement (RTM) attribute flag requested."; - reference - "RFC 8169: Residence Time Measurement in MPLS Networks"; - } - - identity link-protection-type { - description - "Base identity for the link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-unprotected { - base link-protection-type; - description - "'Unprotected' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-extra-traffic { - base link-protection-type; - description - "'Extra-Traffic' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-shared { - base link-protection-type; - description - "'Shared' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-1-for-1 { - base link-protection-type; - description - "'Dedicated 1:1' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-1-plus-1 { - base link-protection-type; - description - "'Dedicated 1+1' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity link-protection-enhanced { - base link-protection-type; - description - "'Enhanced' link protection type."; - reference - "RFC 4202: Routing Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS), - section 2.2 - RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description, section 7"; - } - - identity association-type { - description - "Base identity for the tunnel association."; - } - - identity association-type-recovery { - base association-type; - description - "Association type for recovery, used to associate LSPs of the - same tunnel for recovery."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 6780: RSVP ASSOCIATION Object Extensions"; - } - - identity association-type-resource-sharing { - base association-type; - description - "Association type for resource sharing, used to enable - resource sharing during make-before-break."; - reference - "RFC 4873: GMPLS Segment Recovery - RFC 6780: RSVP ASSOCIATION Object Extensions"; - } - - identity association-type-double-sided-bidir { - base association-type; - description - "Association type for double-sided bidirectional LSPs, - used to associate two LSPs of two tunnels that are - independently configured on either endpoint."; - reference - "RFC 7551: RSVP-TE Extensions for Associated Bidirectional - Label Switched Paths (LSPs)"; - } - - identity association-type-single-sided-bidir { - base association-type; - description - "Association type for single-sided bidirectional LSPs, - used to associate two LSPs of two tunnels, where one - tunnel is configured on one side/endpoint and the other - tunnel is dynamically created on the other endpoint."; - reference - "RFC 6780: RSVP ASSOCIATION Object Extensions - RFC 7551: RSVP-TE Extensions for Associated Bidirectional - Label Switched Paths (LSPs)"; - } - - identity association-type-diversity { - base association-type; - description - "Association Type diversity used to associate LSPs whose - paths are to be diverse from each other."; - reference - "RFC 8800: Path Computation Element Communication Protocol - (PCEP) Extension for Label Switched Path (LSP) - Diversity Constraint Signaling"; - } - - identity objective-function-type { - description - "Base identity for path objective function types."; - } - - identity of-minimize-cost-path { - base objective-function-type; - description - "Objective function for minimizing path cost."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity of-minimize-load-path { - base objective-function-type; - description - "Objective function for minimizing the load on one or more - paths."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity of-maximize-residual-bandwidth { - base objective-function-type; - description - "Objective function for maximizing residual bandwidth."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity of-minimize-agg-bandwidth-consumption { - base objective-function-type; - status obsolete; - description - "Objective function for minimizing aggregate bandwidth - consumption. - - This identity has been obsoleted: the - 'svec-of-minimize-agg-bandwidth-consumption' identity SHOULD - be used instead."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity of-minimize-load-most-loaded-link { - base objective-function-type; - status obsolete; - description - "Objective function for minimizing the load on the link that - is carrying the highest load. - - This identity has been obsoleted: the - 'svec-of-minimize-load-most-loaded-link' identity SHOULD - be used instead."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity of-minimize-cost-path-set { - base objective-function-type; - status obsolete; - description - "Objective function for minimizing the cost on a path set. - - This identity has been obsoleted: the - 'svec-of-minimize-cost-path-set' identity SHOULD - be used instead."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity path-computation-method { - description - "Base identity for supported path computation mechanisms."; - } - - identity path-locally-computed { - base path-computation-method; - description - "Indicates a constrained-path LSP in which the - path is computed by the local LER."; - reference - "RFC 9522: Overview and Principles of Internet Traffic - Engineering, Section 4.4"; - } - - identity path-externally-queried { - base path-computation-method; - description - "Constrained-path LSP in which the path is obtained by - querying an external source, such as a PCE server. - In the case that an LSP is defined to be externally queried, - it may also have associated explicit definitions (provided - to the external source to aid computation). - - The path that is returned by the external source may - require further local computation on the device."; - reference - "RFC 9522: Overview and Principles of Internet Traffic - Engineering - RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; - } - - identity path-explicitly-defined { - base path-computation-method; - description - "Constrained-path LSP in which the path is - explicitly specified as a collection of strict and/or loose - hops."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 9522: Overview and Principles of Internet Traffic - Engineering"; - } - - identity lsp-metric-type { - description - "Base identity for the LSP metric specification types."; - } - - identity lsp-metric-relative { - base lsp-metric-type; - description - "The metric specified for the LSPs to which this identity - refers is specified as a value relative to the IGP metric - cost to the LSP's tail end."; - reference - "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; - } - - identity lsp-metric-absolute { - base lsp-metric-type; - description - "The metric specified for the LSPs to which this identity - refers is specified as an absolute value."; - reference - "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; - } - - identity lsp-metric-inherited { - base lsp-metric-type; - description - "The metric for the LSPs to which this identity refers is - not specified explicitly; rather, it is directly inherited - from the IGP cost."; - reference - "RFC 4657: Path Computation Element (PCE) Communication - Protocol Generic Requirements"; - } - - identity te-tunnel-type { - description - "Base identity from which specific tunnel types are derived."; - } - - identity te-tunnel-p2p { - base te-tunnel-type; - description - "TE Point-to-Point (P2P) tunnel type."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - - identity te-tunnel-p2mp { - base te-tunnel-type; - description - "TE P2MP tunnel type."; - reference - "RFC 4875: Extensions to Resource Reservation Protocol - - Traffic Engineering (RSVP-TE) for - Point-to-Multipoint TE Label Switched Paths - (LSPs)"; - } - - identity tunnel-action-type { - description - "Base identity from which specific tunnel action types - are derived."; - } - - identity tunnel-action-resetup { - base tunnel-action-type; - description - "TE tunnel action that tears down the tunnel's current LSP - (if any) and attempts to re-establish a new LSP."; - } - - identity tunnel-action-reoptimize { - base tunnel-action-type; - description - "TE tunnel action that reoptimizes the placement of the - tunnel LSP(s)."; - } - - identity tunnel-action-switchpath { - base tunnel-action-type; - description - "TE tunnel action that switches the tunnel's LSP to use the - specified path."; - } - - identity te-action-result { - description - "Base identity from which specific TE action results - are derived."; - } - - identity te-action-success { - base te-action-result; - description - "TE action was successful."; - } - - identity te-action-fail { - base te-action-result; - description - "TE action failed."; - } - - identity tunnel-action-inprogress { - base te-action-result; - description - "TE action is in progress."; - } - - identity tunnel-admin-state-type { - description - "Base identity for TE tunnel administrative states."; - } - - identity tunnel-admin-state-up { - base tunnel-admin-state-type; - description - "Tunnel's administrative state is up."; - } - - identity tunnel-admin-state-down { - base tunnel-admin-state-type; - description - "Tunnel's administrative state is down."; - } - - identity tunnel-admin-state-auto { - base tunnel-admin-state-type; - description - "Tunnel administrative auto state. The administrative status - in state datastore transitions to 'tunnel-admin-up' when the - tunnel used by the client layer, and to 'tunnel-admin-down' - when it is not used by the client layer."; - } - - identity tunnel-state-type { - description - "Base identity for TE tunnel states."; - } - - identity tunnel-state-up { - base tunnel-state-type; - description - "Tunnel's state is up."; - } - - identity tunnel-state-down { - base tunnel-state-type; - description - "Tunnel's state is down."; - } - - identity lsp-state-type { - description - "Base identity for TE LSP states."; - } - - identity lsp-path-computing { - base lsp-state-type; - description - "State path computation is in progress."; - } - - identity lsp-path-computation-ok { - base lsp-state-type; - description - "State path computation was successful."; - } - - identity lsp-path-computation-failed { - base lsp-state-type; - description - "State path computation failed."; - } - - identity lsp-state-setting-up { - base lsp-state-type; - description - "State is being set up."; - } - - identity lsp-state-setup-ok { - base lsp-state-type; - description - "State setup was successful."; - } - - identity lsp-state-setup-failed { - base lsp-state-type; - description - "State setup failed."; - } - - identity lsp-state-up { - base lsp-state-type; - description - "State is up."; - } - - identity lsp-state-tearing-down { - base lsp-state-type; - description - "State is being torn down."; - } - - identity lsp-state-down { - base lsp-state-type; - description - "State is down."; - } - - identity path-invalidation-action-type { - description - "Base identity for TE path invalidation action types."; - } - - identity path-invalidation-action-drop { - base path-invalidation-action-type; - description - "Upon invalidation of the TE tunnel path, the tunnel remains - valid, but any packet mapped over the tunnel is dropped."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 2.5"; - } - - identity path-invalidation-action-teardown { - base path-invalidation-action-type; - description - "TE path invalidation action teardown."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 2.5"; - } - - identity lsp-restoration-type { - description - "Base identity from which LSP restoration types are derived."; - } - - identity lsp-restoration-restore-none { - base lsp-restoration-type; - description - "No LSP affected by a failure is restored."; - } - - identity lsp-restoration-restore-any { - base lsp-restoration-type; - description - "Any LSP affected by a failure is restored."; - } - - identity lsp-restoration-restore-all { - base lsp-restoration-type; - description - "Affected LSPs are restored after all LSPs of the tunnel are - broken."; - } - - identity restoration-scheme-type { - description - "Base identity for LSP restoration schemes."; - } - - identity restoration-scheme-rerouting { - base restoration-scheme-type; - description - "Restoration LSP is computed, signalled and configured after - the failure detection. - - This restoration scheme is also known as - 'Full LSP Re-routing', with the alternate route being - computed after the failure occurs."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 11"; - } - - identity restoration-scheme-preconfigured { - base restoration-scheme-type; - description - "Restoration LSP is precomputed, presignalled and - preconfigured prior to the failure."; - } - - identity restoration-scheme-precomputed { - base restoration-scheme-type; - description - "Restoration LSP is precomputed, but not presignalled nor - preconfigured, prior to the failure. - - This restoration scheme is also known as - 'Full LSP Re-routing', with the alternate route being - precomputed and stored for use when the failure occurs."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 11"; - } - - identity restoration-scheme-presignaled { - base restoration-scheme-type; - description - "Restoration LSP is presignaled, but not preconfigured, - prior to the failure. - - This restoration scheme is also known as - 'Pre-planned LSP Re-routing'."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 8"; - } - - identity lsp-protection-type { - description - "Base identity from which LSP protection types are derived."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery"; - } - - identity lsp-protection-unprotected { - base lsp-protection-type; - description - "'Unprotected' LSP protection type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery"; - } - - identity lsp-protection-reroute-extra { - base lsp-protection-type; - status obsolete; - description - "'(Full) Rerouting' LSP protection type. - - This identity has been obsoleted: the - 'restoration-scheme-rerouting' or - 'restoration-scheme-precomputed' identity SHOULD be used - instead."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 11"; - } - - identity lsp-protection-reroute { - base lsp-protection-type; - status obsolete; - description - "'Rerouting without Extra-Traffic' LSP protection type. - - This identity has been obsoleted: the - 'restoration-scheme-presignaled' identity SHOULD be used - instead."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 8"; - } - - identity lsp-protection-1-for-n { - base lsp-protection-type; - description - "'1:N Protection with Extra-Traffic' LSP protection type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 7.3"; - } - - identity lsp-protection-1-for-1 { - base lsp-protection-type; - description - "LSP protection '1:1 Protection Type'."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 7"; - } - - identity lsp-protection-unidir-1-plus-1 { - base lsp-protection-type; - description - "'1+1 Unidirectional Protection' LSP protection type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 5"; - } - - identity lsp-protection-bidir-1-plus-1 { - base lsp-protection-type; - description - "'1+1 Bidirectional Protection' LSP protection type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 6"; - } - - identity lsp-protection-extra-traffic { - base lsp-protection-type; - description - "Extra-Traffic LSP protection type."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery, section 7"; - } - - identity lsp-protection-state { - description - "Base identity of protection states for reporting purposes."; - } - - identity normal { - base lsp-protection-state; - description - "Normal state."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity signal-fail-of-protection { - base lsp-protection-state; - description - "The protection transport entity has a signal fail condition - that is of higher priority than the forced switchover - command."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity lockout-of-protection { - base lsp-protection-state; - description - "A Loss of Protection (LoP) command is active."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity forced-switch { - base lsp-protection-state; - description - "A forced switchover command is active."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity signal-fail { - base lsp-protection-state; - description - "There is a signal fail condition on either the working path - or the protection path."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity signal-degrade { - base lsp-protection-state; - description - "There is a signal degrade condition on either the working - path or the protection path."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity manual-switch { - base lsp-protection-state; - description - "A manual switchover command is active."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity wait-to-restore { - base lsp-protection-state; - description - "A Wait-to-Restore (WTR) timer is running."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity do-not-revert { - base lsp-protection-state; - description - "A Do Not Revert (DNR) condition is active because of - non-revertive behavior."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity failure-of-protocol { - base lsp-protection-state; - description - "LSP protection is not working because of a protocol failure - condition."; - reference - "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection - to Match the Operational Expectations of - Synchronous Digital Hierarchy, Optical Transport - Network, and Ethernet Transport Network Operators - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity protection-external-commands { - description - "Base identity from which protection-related external commands - used for troubleshooting purposes are derived."; - } - - identity action-freeze { - base protection-external-commands; - description - "A temporary configuration action initiated by an operator - command that prevents any switchover action from being taken - and, as such, freezes the current state."; - reference - "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection - to Match the Operational Expectations of - Synchronous Digital Hierarchy, Optical Transport - Network, and Ethernet Transport Network Operators - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity clear-freeze { - base protection-external-commands; - description - "An action that clears the active freeze state."; - reference - "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection - to Match the Operational Expectations of - Synchronous Digital Hierarchy, Optical Transport - Network, and Ethernet Transport Network Operators - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity action-lockout-of-normal { - base protection-external-commands; - description - "A temporary configuration action initiated by an operator - command to ensure that the normal traffic is not allowed - to use the protection transport entity."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity clear-lockout-of-normal { - base protection-external-commands; - description - "An action that clears the active lockout of the - normal state."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity action-lockout-of-protection { - base protection-external-commands; - description - "A temporary configuration action initiated by an operator - command to ensure that the protection transport entity is - temporarily not available to transport a traffic signal - (either normal or Extra-Traffic)."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity action-forced-switch { - base protection-external-commands; - description - "A switchover action initiated by an operator command to - switch the Extra-Traffic signal, the normal traffic signal, - or the null signal to the protection transport entity, - unless a switchover command of equal or higher priority is - in effect."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity action-manual-switch { - base protection-external-commands; - description - "A switchover action initiated by an operator command to - switch the Extra-Traffic signal, the normal traffic signal, - or the null signal to the protection transport entity, - unless a fault condition exists on other transport entities - or a switchover command of equal or higher priority is in - effect."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity action-exercise { - base protection-external-commands; - description - "An action that starts testing whether or not Automatic - Protection Switching (APS) communication is operating - correctly. - - It is of lower priority than any other state or command."; - reference - "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection - to Match the Operational Expectations of - Synchronous Digital Hierarchy, Optical Transport - Network, and Ethernet Transport Network Operators - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity clear { - base protection-external-commands; - description - "An action that clears the active near-end lockout of a - protection, forced switchover, manual switchover, - Wait-to-Restore (WTR) state, or exercise command."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - identity switching-capabilities { - description - "Base identity for interface switching capabilities."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity switching-psc1 { - base switching-capabilities; - description - "Packet-Switch Capable-1 (PSC-1)."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity switching-evpl { - base switching-capabilities; - description - "Ethernet Virtual Private Line (EVPL)."; - reference - "RFC 6004: Generalized MPLS (GMPLS) Support for Metro - Ethernet Forum and G.8011 Ethernet Service - Switching"; - } - - identity switching-l2sc { - base switching-capabilities; - description - "Layer-2 Switch Capable (L2SC)."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity switching-tdm { - base switching-capabilities; - description - "Time-Division-Multiplex Capable (TDM)."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity switching-otn { - base switching-capabilities; - description - "OTN-TDM capable."; - reference - "RFC 7138: Traffic Engineering Extensions to OSPF for GMPLS - Control of Evolving G.709 Optical Transport - Networks"; - } - - identity switching-dcsc { - base switching-capabilities; - description - "Data Channel Switching Capable (DCSC)."; - reference - "RFC 6002: Generalized MPLS (GMPLS) Data Channel - Switching Capable (DCSC) and Channel Set Label - Extensions"; - } - - identity switching-lsc { - base switching-capabilities; - description - "Lambda-Switch Capable (LSC)."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity switching-fsc { - base switching-capabilities; - description - "Fiber-Switch Capable (FSC)."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-types { - description - "Base identity for encoding types."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-packet { - base lsp-encoding-types; - description - "Packet LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-ethernet { - base lsp-encoding-types; - description - "Ethernet LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-pdh { - base lsp-encoding-types; - description - "ANSI/ETSI PDH LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-sdh { - base lsp-encoding-types; - description - "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-digital-wrapper { - base lsp-encoding-types; - description - "Digital Wrapper LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-lambda { - base lsp-encoding-types; - description - "Lambda (photonic) LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-fiber { - base lsp-encoding-types; - description - "Fiber LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-fiber-channel { - base lsp-encoding-types; - description - "FiberChannel LSP encoding."; - reference - "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Functional Description"; - } - - identity lsp-encoding-oduk { - base lsp-encoding-types; - description - "G.709 ODUk (Digital Path) LSP encoding."; - reference - "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Extensions for G.709 Optical Transport - Networks Control"; - } - - identity lsp-encoding-optical-channel { - base lsp-encoding-types; - description - "G.709 Optical Channel LSP encoding."; - reference - "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) - Signaling Extensions for G.709 Optical Transport - Networks Control"; - } - - identity lsp-encoding-line { - base lsp-encoding-types; - description - "Line (e.g., 8B/10B) LSP encoding."; - reference - "RFC 6004: Generalized MPLS (GMPLS) Support for Metro - Ethernet Forum and G.8011 Ethernet Service - Switching"; - } - - identity path-signaling-type { - description - "Base identity from which specific LSP path setup types - are derived."; - } - - identity path-setup-static { - base path-signaling-type; - description - "Static LSP provisioning path setup."; - } - - identity path-setup-rsvp { - base path-signaling-type; - description - "RSVP-TE signaling path setup."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - - identity path-setup-sr { - base path-signaling-type; - description - "Segment-routing path setup."; - } - - identity path-scope-type { - description - "Base identity from which specific path scope types are - derived."; - } - - identity path-scope-segment { - base path-scope-type; - description - "Path scope segment."; - reference - "RFC 4873: GMPLS Segment Recovery"; - } - - identity path-scope-end-to-end { - base path-scope-type; - description - "Path scope end to end."; - reference - "RFC 4873: GMPLS Segment Recovery"; - } - - identity route-usage-type { - description - "Base identity for route usage."; - } - - identity route-include-object { - base route-usage-type; - description - "'Include route' object."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3.2 - RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP), Section 7.12 - RFC 7896: Update to the Include Route Object (IRO) - Specification in the Path Computation Element - Communication Protocol (PCEP)"; - } - - identity route-exclude-object { - base route-usage-type; - description - "'Exclude route' object."; - reference - "RFC 4874: Exclude Routes - Extension to Resource ReserVation - Protocol-Traffic Engineering (RSVP-TE)"; - } - - identity route-exclude-srlg { - base route-usage-type; - description - "Excludes Shared Risk Link Groups (SRLGs)."; - reference - "RFC 4874: Exclude Routes - Extension to Resource ReserVation - Protocol-Traffic Engineering (RSVP-TE)"; - } - - identity path-metric-optimization-type { - description - "Base identity used to define the path metric optimization - types."; - } - - identity link-path-metric-type { - description - "Base identity used to define the link and the path metric - types. - - The unit of the path metric value is interpreted in the - context of the path metric type and the derived identities - SHOULD describe the unit of the path metric types they - define."; - } - - identity link-metric-type { - base link-path-metric-type; - description - "Base identity for the link metric types."; - } - - identity link-metric-te { - base link-metric-type; - description - "Traffic Engineering (TE) Link Metric."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2, Section 2.5.5 - RFC 5305: IS-IS Extensions for Traffic Engineering, - Section 3.7"; - } - - identity link-metric-igp { - base link-metric-type; - description - "Interior Gateway Protocol (IGP) Link Metric."; - reference - "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric - as a second MPLS Traffic Engineering (TE) - Metric"; - } - - identity link-metric-delay-average { - base link-metric-type; - description - "Unidirectional Link Delay, measured in units of - microseconds."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions, Section 4.1 - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.1"; - } - - identity link-metric-delay-minimum { - base link-metric-type; - description - "Minimum unidirectional Link Delay, measured in units of - microseconds."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions, Section 4.2 - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.2"; - } - - identity link-metric-delay-maximum { - base link-metric-type; - description - "Maximum unidirectional Link Delay, measured in units of - microseconds."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions, Section 4.2 - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.2"; - } - - identity link-metric-residual-bandwidth { - base link-metric-type; - description - "Unidirectional Residual Bandwidth, measured in units of - bytes per second. - - It is defined to be Maximum Bandwidth minus the bandwidth - currently allocated to LSPs."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric - Extensions, Section 4.5 - RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 4.5"; - } - - identity path-metric-type { - base link-path-metric-type; - base path-metric-optimization-type; - description - "Base identity for the path metric types."; - } - - identity path-metric-te { - base path-metric-type; - description - "Traffic Engineering (TE) Path Metric."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP), Section 7.8"; - } - - identity path-metric-igp { - base path-metric-type; - description - "Interior Gateway Protocol (IGP) Path Metric."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP), section 7.8"; - } - - identity path-metric-hop { - base path-metric-type; - description - "Hop Count Path Metric."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP), Section 7.8"; - } - - identity path-metric-delay-average { - base path-metric-type; - description - "The Path Delay Metric, measured in units of - microseconds."; - reference - "RFC 8233: Extensions to the Path Computation Element - Communication Protocol (PCEP) to Compute - Service-Aware Label Switched Paths (LSPs), - Section 3.1.1"; - } - - identity path-metric-delay-minimum { - base path-metric-type; - description - "The Path Min Delay Metric, measured in units of - microseconds."; - reference - "I-D.ietf-pce-sid-algo: Carrying SR-Algorithm information - in PCE-based Networks, - draft-ietf-pce-sid-algo-29, - Sections 4.5.1 and 4.5.2"; - } - - identity path-metric-residual-bandwidth { - base path-metric-type; - description - "The Path Residual Bandwidth, defined as the minimum Link - Residual Bandwidth all the links along the path. - - The Path Residual Bandwidth can be seen as the path - metric associated with the Maximum residual Bandwidth Path - (MBP) objective function."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity path-metric-optimize-includes { - base path-metric-optimization-type; - description - "A metric that optimizes the number of included resources - specified in a set."; - } - - identity path-metric-optimize-excludes { - base path-metric-optimization-type; - description - "A metric that optimizes to a maximum the number of excluded - resources specified in a set."; - } - - identity path-tiebreaker-type { - description - "Base identity for the path tiebreaker type."; - } - - identity path-tiebreaker-minfill { - base path-tiebreaker-type; - description - "Min-Fill LSP path placement: selects the path with the most - available bandwidth (load balance LSPs over more links)."; - } - - identity path-tiebreaker-maxfill { - base path-tiebreaker-type; - description - "Max-Fill LSP path placement: selects the path with the least - available bandwidth (packing more LSPs over few links)."; - } - - identity path-tiebreaker-random { - base path-tiebreaker-type; - description - "Random LSP path placement."; - } - - identity resource-affinities-type { - description - "Base identity for resource class affinities."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 2702: Requirements for Traffic Engineering Over MPLS"; - } - - identity resource-aff-include-all { - base resource-affinities-type; - description - "The set of attribute filters associated with a - tunnel, all of which must be present for a link - to be acceptable."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 2702: Requirements for Traffic Engineering Over MPLS"; - } - - identity resource-aff-include-any { - base resource-affinities-type; - description - "The set of attribute filters associated with a - tunnel, any of which must be present for a link - to be acceptable."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 2702: Requirements for Traffic Engineering Over MPLS"; - } - - identity resource-aff-exclude-any { - base resource-affinities-type; - description - "The set of attribute filters associated with a - tunnel, any of which renders a link unacceptable."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 2702: Requirements for Traffic Engineering Over MPLS"; - } - - identity te-optimization-criterion { - description - "Base identity for the TE optimization criteria."; - reference - "RFC 9522: Overview and Principles of Internet Traffic - Engineering"; - } - - identity not-optimized { - base te-optimization-criterion; - description - "Optimization is not applied."; - } - - identity cost { - base te-optimization-criterion; - description - "Optimized on cost."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity delay { - base te-optimization-criterion; - description - "Optimized on delay."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity path-computation-srlg-type { - description - "Base identity for Shared Risk Link Group (SRLG) path - computation."; - } - - identity srlg-ignore { - base path-computation-srlg-type; - description - "Ignores Shared Risk Link Groups (SRLGs) in the path - computation."; - } - - identity srlg-strict { - base path-computation-srlg-type; - description - "Includes a strict Shared Risk Link Group (SRLG) check in - the path computation."; - } - - identity srlg-preferred { - base path-computation-srlg-type; - description - "Includes a preferred Shared Risk Link Group (SRLG) check in - the path computation."; - } - - identity srlg-weighted { - base path-computation-srlg-type; - description - "Includes a weighted Shared Risk Link Group (SRLG) check in - the path computation."; - } - - identity path-computation-error-reason { - description - "Base identity for path computation error reasons."; - } - - identity path-computation-error-path-not-found { - base path-computation-error-reason; - description - "Path computation has failed because of an unspecified - reason."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP), Section 7.5"; - } - - identity path-computation-error-no-topology { - base path-computation-error-reason; - description - "Path computation has failed because there is no topology - with the provided topology-identifier."; - } - - identity path-computation-error-no-dependent-server { - base path-computation-error-reason; - description - "Path computation has failed because one or more dependent - path computation servers are unavailable. - - The dependent path computation server could be - a Backward-Recursive Path Computation (BRPC) downstream - PCE or a child PCE."; - reference - "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC) - Procedure to Compute Shortest Constrained - Inter-Domain Traffic Engineering Label Switched - Paths - RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture"; - } - - identity path-computation-error-pce-unavailable { - base path-computation-error-reason; - description - "Path computation has failed because PCE is not available. - - It corresponds to bit 31 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP) - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-no-inclusion-hop { - base path-computation-error-reason; - description - "Path computation has failed because there is no - node or link provided by one or more inclusion hops."; - } - - identity path-computation-error-destination-unknown-in-domain { - base path-computation-error-reason; - description - "Path computation has failed because the destination node is - unknown in indicated destination domain. - - It corresponds to bit 19 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-no-resource { - base path-computation-error-reason; - description - "Path computation has failed because there is no - available resource in one or more domains. - - It corresponds to bit 20 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-child-pce-unresponsive { - base path-computation-error-no-dependent-server; - description - "Path computation has failed because child PCE is not - responsive. - - It corresponds to bit 21 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-destination-domain-unknown { - base path-computation-error-reason; - description - "Path computation has failed because the destination domain - was unknown. - - It corresponds to bit 22 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-p2mp { - base path-computation-error-reason; - description - "Path computation has failed because of P2MP reachability - problem. - - It corresponds to bit 24 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 8306: Extensions to the Path Computation Element - Communication Protocol (PCEP) for - Point-to-Multipoint Traffic Engineering Label - Switched Paths - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-no-gco-migration { - base path-computation-error-reason; - description - "Path computation has failed because of no Global Concurrent - Optimization (GCO) migration path found. - - It corresponds to bit 26 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5557: Path Computation Element Communication Protocol - (PCEP) Requirements and Protocol Extensions in - Support of Global Concurrent Optimization - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-no-gco-solution { - base path-computation-error-reason; - description - "Path computation has failed because of no GCO solution - found. - - It corresponds to bit 25 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5557: Path Computation Element Communication Protocol - (PCEP) Requirements and Protocol Extensions in - Support of Global Concurrent Optimization - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-pks-expansion { - base path-computation-error-reason; - description - "Path computation has failed because of Path-Key Subobject - (PKS) expansion failure. - - It corresponds to bit 27 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5520: Preserving Topology Confidentiality in - Inter-Domain Path Computation Using a - Path-Key-Based Mechanism - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-brpc-chain-unavailable { - base path-computation-error-no-dependent-server; - description - "Path computation has failed because PCE BRPC chain - unavailable. - - It corresponds to bit 28 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC) - Procedure to Compute Shortest Constrained - Inter-Domain Traffic Engineering Label Switched - Paths - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-source-unknown { - base path-computation-error-reason; - description - "Path computation has failed because source node is - unknown. - - It corresponds to bit 29 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP); - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity path-computation-error-destination-unknown { - base path-computation-error-reason; - description - "Path computation has failed because destination node is - unknown. - - It corresponds to bit 30 of the Flags field of the - NO-PATH-VECTOR TLV."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP); - - https://www.iana.org/assignments/pcep - /pcep.xhtml#no-path-vector-tlv"; - } - - identity protocol-origin-type { - description - "Base identity for protocol origin type."; - } - - identity protocol-origin-api { - base protocol-origin-type; - description - "Protocol origin is via Application Programming Interface - (API)."; - } - - identity protocol-origin-pcep { - base protocol-origin-type; - description - "Protocol origin is Path Computation Engine Protocol - (PCEP)."; - reference - "RFC 5440: Path Computation Element (PCE) Communication - Protocol (PCEP)"; - } - - identity protocol-origin-bgp { - base protocol-origin-type; - description - "Protocol origin is Border Gateway Protocol (BGP)."; - reference - "RFC 9012: The BGP Tunnel Encapsulation Attribute"; - } - - identity svec-objective-function-type { - description - "Base identity for SVEC objective function type."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; - } - - identity svec-of-minimize-agg-bandwidth-consumption { - base svec-objective-function-type; - description - "Objective function for minimizing aggregate bandwidth - consumption (MBC)."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-of-minimize-load-most-loaded-link { - base svec-objective-function-type; - description - "Objective function for minimizing the load on the link that - is carrying the highest load (MLL)."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-of-minimize-cost-path-set { - base svec-objective-function-type; - description - "Objective function for minimizing the cost on a path set - (MCC)."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-of-minimize-common-transit-domain { - base svec-objective-function-type; - description - "Objective function for minimizing the number of common - transit domains (MCTD)."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture."; - } - - identity svec-of-minimize-shared-link { - base svec-objective-function-type; - description - "Objective function for minimizing the number of shared - links (MSL)."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture."; - } - - identity svec-of-minimize-shared-srlg { - base svec-objective-function-type; - description - "Objective function for minimizing the number of shared - Shared Risk Link Groups (SRLG) (MSS)."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture."; - } - - identity svec-of-minimize-shared-nodes { - base svec-objective-function-type; - description - "Objective function for minimizing the number of shared - nodes (MSN)."; - reference - "RFC 8685: Path Computation Element Communication Protocol - (PCEP) Extensions for the Hierarchical Path - Computation Element (H-PCE) Architecture."; - } - - identity svec-metric-type { - description - "Base identity for SVEC metric type."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol (PCEP)"; - } - - identity svec-metric-cumulative-te { - base svec-metric-type; - description - "Cumulative TE cost."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-metric-cumulative-igp { - base svec-metric-type; - description - "Cumulative IGP cost."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-metric-cumulative-hop { - base svec-metric-type; - description - "Cumulative Hop path metric."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-metric-aggregate-bandwidth-consumption { - base svec-metric-type; - description - "Aggregate bandwidth consumption."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - identity svec-metric-load-of-the-most-loaded-link { - base svec-metric-type; - description - "Load of the most loaded link."; - reference - "RFC 5541: Encoding of Objective Functions in the Path - Computation Element Communication Protocol - (PCEP)"; - } - - /* - * Typedefs - */ - - typedef admin-group { - type yang:hex-string { - /* 01:02:03:04 */ - length "1..11"; - } - description - "Administrative group / resource class / color representation - in 'hex-string' type. - - The most significant byte in the hex-string is the farthest - to the left in the byte sequence. - - Leading zero bytes in the configured value may be omitted - for brevity."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2 - RFC 5305: IS-IS Extensions for Traffic Engineering - RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; - } - - typedef admin-groups { - type union { - type admin-group; - type extended-admin-group; - } - description - "Derived types for TE administrative groups."; - } - - typedef extended-admin-group { - type yang:hex-string; - description - "Extended administrative group / resource class / color - representation in 'hex-string' type. - - The most significant byte in the hex-string is the farthest - to the left in the byte sequence. - - Leading zero bytes in the configured value may be omitted - for brevity."; - reference - "RFC 7308: Extended Administrative Groups in MPLS Traffic - Engineering (MPLS-TE)"; - } - - typedef path-attribute-flags { - type union { - type identityref { - base session-attributes-flags; - } - type identityref { - base lsp-attributes-flags; - } - } - description - "Path attributes flags type."; - } - - typedef performance-metrics-normality { - type enumeration { - enum unknown { - value 0; - description - "Unknown."; - } - enum normal { - value 1; - description - "Normal. - - Indicates that the anomalous bit is not set."; - } - enum abnormal { - value 2; - description - "Abnormal. - - Indicates that the anomalous bit is set."; - } - } - description - "Indicates whether a performance metric is normal (anomalous - bit not set), abnormal (anomalous bit set), or unknown."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; - } - - typedef srlg { - type uint32; - description - "Shared Risk Link Group (SRLG) type."; - reference - "RFC 4203: OSPF Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS) - RFC 5307: IS-IS Extensions in Support of Generalized - Multi-Protocol Label Switching (GMPLS)"; - } - - typedef te-common-status { - type enumeration { - enum up { - description - "Enabled."; - } - enum down { - description - "Disabled."; - } - enum testing { - description - "In some test mode."; - } - enum preparing-maintenance { - description - "The resource is disabled in the control plane to prepare - for a graceful shutdown for maintenance purposes."; - reference - "RFC 5817: Graceful Shutdown in MPLS and Generalized MPLS - Traffic Engineering Networks"; - } - enum maintenance { - description - "The resource is disabled in the data plane for maintenance - purposes."; - } - enum unknown { - description - "Status is unknown."; - } - } - description - "Defines a type representing the common states of a TE - resource."; - } - - typedef te-bandwidth { - type string { - pattern '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' - + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' - + '[pP](\+)?(12[0-7]|' - + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+' - + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' - + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' - + '[pP](\+)?(12[0-7]|' - + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*'; - } - description - "This is the generic bandwidth type. - - It is a string containing a list of numbers separated by - commas, where each of these numbers can be non-negative - decimal, hex integer, or hex float, as defined in - ISO/IEC 9899: - - (dec | hex | float)[*(','(dec | hex | float))] - - For the packet-switching type, the string encoding MUST follow - the type 'bandwidth-ieee-float32' as defined in RFC 8294 - (e.g., 0x1p10), where the units are in bytes per second. - - Canonically, the string is represented as all lowercase and in - hex, where the prefix '0x' precedes the hex number."; - reference - "ISO/IEC 9899:2024: Information Technology - Programming - Languages - C, Section 6.4.4.2 - RFC 8294: Common YANG Data Types for the Routing Area"; - } - - typedef te-ds-class { - type uint8 { - range "0..7"; - } - description - "The Differentiated Services Class-Type of traffic."; - reference - "RFC 4124: Protocol Extensions for Support of Diffserv-aware - MPLS Traffic Engineering, Section 4.3.1"; - } - - typedef te-global-id { - type uint32; - description - "An identifier to uniquely identify an operator, which can be - either a provider or a client. - - The definition of this type is taken from RFCs 6370 and 5003. - - This attribute type is used solely to provide a globally - unique context for TE topologies."; - reference - "RFC 5003: Attachment Individual Identifier (AII) Types for - Aggregation - RFC 6370: MPLS Transport Profile (MPLS-TP) Identifiers"; - } - - typedef te-hop-type { - type enumeration { - enum loose { - description - "A loose hop in an explicit path."; - } - enum strict { - description - "A strict hop in an explicit path."; - } - } - description - "Enumerated type for specifying loose or strict paths."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3.3"; - } - - typedef te-link-access-type { - type enumeration { - enum point-to-point { - description - "The link is point-to-point."; - } - enum multi-access { - description - "The link is multi-access, including broadcast and NBMA."; - } - } - description - "The access types of a TE link."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; - } - - typedef te-label-direction { - type enumeration { - enum forward { - description - "Label allocated for the forward LSP direction."; - } - enum reverse { - description - "Label allocated for the reverse LSP direction."; - } - } - description - "Enumerated type for specifying the forward or reverse - label."; - } - - typedef te-link-direction { - type enumeration { - enum incoming { - description - "The explicit route represents an incoming link on - a node."; - } - enum outgoing { - description - "The explicit route represents an outgoing link on - a node."; - } - } - description - "Enumerated type for specifying the direction of a link on - a node."; - } - - typedef te-metric { - type uint32; - description - "Traffic Engineering (TE) metric."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2, Section 2.5.5 - RFC 5305: IS-IS Extensions for Traffic Engineering, - Section 3.7"; - } - - typedef te-node-id { - type union { - type yang:dotted-quad; - type inet:ipv6-address-no-zone; - } - description - "A type representing the identifier for a node in a TE - topology. - - The identifier is represented either as 4 octets in - dotted-quad notation, or as 16 octets in full, mixed, - shortened, or shortened-mixed IPv6 address notation. - - This attribute MAY be mapped to the Router Address TLV - described in Section 2.4.1 of RFC 3630, the TE Router ID - described in Section 3 of RFC 6827, the Traffic Engineering - Router ID TLV described in Section 4.3 of RFC 5305, the TE - Router ID TLV described in Section 3.2.1 of RFC 6119, or the - IPv6 TE Router ID TLV described in Section 4.1 of RFC 6119. - - The reachability of such a TE node MAY be achieved by a - mechanism such as that described in Section 6.2 of RFC 6827."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2, Section 2.4.1 - RFC 5305: IS-IS Extensions for Traffic Engineering, - Section 4.3 - RFC 6119: IPv6 Traffic Engineering in IS-IS, Section 3.2.1 - RFC 6827: Automatically Switched Optical Network (ASON) - Routing for OSPFv2 Protocols, Section 3"; - } - - typedef te-oper-status { - type te-common-status; - description - "Defines a type representing the operational status of - a TE resource."; - } - - typedef te-admin-status { - type te-common-status; - description - "Defines a type representing the administrative status of - a TE resource."; - } - - typedef te-path-disjointness { - type bits { - bit node { - position 0; - description - "Node disjoint."; - } - bit link { - position 1; - description - "Link disjoint."; - } - bit srlg { - position 2; - description - "Shared Risk Link Group (SRLG) disjoint."; - } - } - description - "Type of the resource disjointness for a TE tunnel path."; - reference - "RFC 4872: RSVP-TE Extensions in Support of End-to-End - Generalized Multi-Protocol Label Switching (GMPLS) - Recovery"; - } - - typedef te-recovery-status { - type enumeration { - enum normal { - description - "Both the recovery span and the working span are fully - allocated and active, data traffic is being - transported over (or selected from) the working - span, and no trigger events are reported."; - } - enum recovery-started { - description - "The recovery action has been started but not completed."; - } - enum recovery-succeeded { - description - "The recovery action has succeeded. - - The working span has reported a failure/degrade condition, - and the user traffic is being transported (or selected) - on the recovery span."; - } - enum recovery-failed { - description - "The recovery action has failed."; - } - enum reversion-started { - description - "The reversion has started."; - } - enum reversion-succeeded { - description - "The reversion action has succeeded."; - } - enum reversion-failed { - description - "The reversion has failed."; - } - enum recovery-unavailable { - description - "The recovery is unavailable, as a result of either an - operator's lockout command or a failure condition - detected on the recovery span."; - } - enum recovery-admin { - description - "The operator has issued a command to switch the user - traffic to the recovery span."; - } - enum wait-to-restore { - description - "The recovery domain is recovering from a failure/degrade - condition on the working span that is being controlled by - the Wait-to-Restore (WTR) timer."; - } - } - description - "Defines the status of a recovery action."; - reference - "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection - RFC 4427: Recovery (Protection and Restoration) Terminology - for Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - - typedef te-template-name { - type string { - pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; - } - description - "A type for the name of a TE node template or TE link - template."; - } - - typedef te-topology-event-type { - type enumeration { - enum add { - value 0; - description - "A TE node or TE link has been added."; - } - enum remove { - value 1; - description - "A TE node or TE link has been removed."; - } - enum update { - value 2; - description - "A TE node or TE link has been updated."; - } - } - description - "TE event type for notifications."; - } - - typedef te-topology-id { - type union { - type string { - length "0"; - // empty string - } - type string { - pattern '([a-zA-Z0-9\-_.]+:)*' - + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; - } - } - description - "An identifier for a topology. - - It is optional to have one or more prefixes at the beginning, - separated by colons. - - The prefixes can be 'network-types' as defined in the - 'ietf-network' module in RFC 8345, to help the user better - understand the topology before further inquiry is made."; - reference - "RFC 8345: A YANG Data Model for Network Topologies"; - } - - typedef te-tp-id { - type union { - type uint32; - // Unnumbered - type inet:ip-address; - // IPv4 or IPv6 address - } - description - "An identifier for a TE link endpoint on a node. - - This attribute is mapped to a local or remote link identifier - as defined in RFCs 3630 and 5305."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2 - RFC 5305: IS-IS Extensions for Traffic Engineering"; - } - - typedef path-type { - type enumeration { - enum primary-path { - description - "Indicates that the TE path is a primary path."; - } - enum secondary-path { - description - "Indicates that the TE path is a secondary path."; - } - enum primary-reverse-path { - description - "Indicates that the TE path is a primary reverse path."; - } - enum secondary-reverse-path { - description - "Indicates that the TE path is a secondary reverse path."; - } - } - description - "The type of TE path, indicating whether a path is a primary, - or a reverse primary, or a secondary, or a reverse secondary - path."; - } - - /* - * TE bandwidth groupings - */ - - grouping te-bandwidth { - description - "This grouping defines the generic TE bandwidth. - - For some known data-plane technologies, specific modeling - structures are specified. - - The string-encoded 'te-bandwidth' type is used for - unspecified technologies. - - The modeling structure can be augmented later for other - technologies."; - container te-bandwidth { - description - "Container that specifies TE bandwidth. - - The choices can be augmented for specific data-plane - technologies."; - choice technology { - default "generic"; - description - "Data-plane technology type."; - case generic { - leaf generic { - type te-bandwidth; - description - "Bandwidth specified in a generic format."; - } - } - } - } - } - - /* - * TE label groupings - */ - - grouping te-label { - description - "This grouping defines the generic TE label. - - The modeling structure can be augmented for each technology. - - For unspecified technologies, 'rt-types:generalized-label' - is used."; - container te-label { - description - "Container that specifies the TE label. - - The choices can be augmented for specific data-plane - technologies."; - choice technology { - default "generic"; - description - "Data-plane technology type."; - case generic { - leaf generic { - type rt-types:generalized-label; - description - "TE label specified in a generic format."; - } - } - } - leaf direction { - type te-label-direction; - default "forward"; - description - "Label direction."; - } - } - } - - grouping te-topology-identifier { - description - "Augmentation for a TE topology."; - container te-topology-identifier { - description - "TE topology identifier container."; - leaf provider-id { - type te-global-id; - default "0"; - description - "An identifier to uniquely identify a provider. - If omitted, it assumes that the topology provider ID - value = 0 (the default)."; - } - leaf client-id { - type te-global-id; - default "0"; - description - "An identifier to uniquely identify a client. - If omitted, it assumes that the topology client ID - value = 0 (the default)."; - } - leaf topology-id { - type te-topology-id; - default ""; - description - "When the datastore contains several topologies, - 'topology-id' distinguishes between them. - - If omitted, the default (empty) string for this leaf is - assumed."; - } - } - } - - /* - * TE performance metrics groupings - */ - - grouping performance-metrics-one-way-delay-loss { - description - "Performance Metrics (PM) information in real time that can - be applicable to links or connections. - - PM defined in this grouping are applicable to generic TE PM - as well as packet TE PM."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf one-way-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - description - "One-way delay or latency."; - } - leaf one-way-delay-normality { - type te-types:performance-metrics-normality; - description - "One-way delay normality."; - } - } - - grouping performance-metrics-two-way-delay-loss { - description - "Performance Metrics (PM) information in real time that can be - applicable to links or connections. - - PM defined in this grouping are applicable to generic TE PM - as well as packet TE PM."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf two-way-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - description - "Two-way delay or latency."; - } - leaf two-way-delay-normality { - type te-types:performance-metrics-normality; - description - "Two-way delay normality."; - } - } - - grouping performance-metrics-one-way-bandwidth { - description - "Performance Metrics (PM) information in real time that can be - applicable to links. - - PM defined in this grouping are applicable to generic TE PM - as well as packet TE PM."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf one-way-residual-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Residual bandwidth that subtracts tunnel reservations from - Maximum Bandwidth (or link capacity) (RFC 3630) and - provides an aggregated remainder across QoS classes."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; - } - leaf one-way-residual-bandwidth-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Residual bandwidth normality."; - } - leaf one-way-available-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Available bandwidth that is defined to be residual - bandwidth minus the measured bandwidth used for the - actual forwarding of non-RSVP-TE LSP packets. - - For a bundled link, available bandwidth is defined to be - the sum of the component link available bandwidths."; - } - leaf one-way-available-bandwidth-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Available bandwidth normality."; - } - leaf one-way-utilized-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Bandwidth utilization that represents the actual - utilization of the link (i.e., as measured in the router). - For a bundled link, bandwidth utilization is defined to - be the sum of the component link bandwidth utilizations."; - } - leaf one-way-utilized-bandwidth-normality { - type te-types:performance-metrics-normality; - default "normal"; - description - "Bandwidth utilization normality."; - } - } - - grouping one-way-performance-metrics { - description - "One-way Performance Metrics (PM) throttle grouping."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf one-way-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "One-way delay or latency."; - } - leaf one-way-residual-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Residual bandwidth that subtracts tunnel reservations from - Maximum Bandwidth (or link capacity) (RFC 3630) and - provides an aggregated remainder across QoS classes."; - reference - "RFC 3630: Traffic Engineering (TE) Extensions to OSPF - Version 2"; - } - leaf one-way-available-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Available bandwidth that is defined to be residual - bandwidth minus the measured bandwidth used for the - actual forwarding of non-RSVP-TE LSP packets. - - For a bundled link, available bandwidth is defined to be - the sum of the component link available bandwidths."; - } - leaf one-way-utilized-bandwidth { - type rt-types:bandwidth-ieee-float32; - units "bytes per second"; - default "0x0p0"; - description - "Bandwidth utilization that represents the actual - utilization of the link (i.e., as measured in the router). - For a bundled link, bandwidth utilization is defined to - be the sum of the component link bandwidth utilizations."; - } - } - - grouping two-way-performance-metrics { - description - "Two-way Performance Metrics (PM) throttle grouping."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf two-way-delay { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Two-way delay or latency."; - } - } - - grouping performance-metrics-thresholds { - description - "Grouping for configurable thresholds for measured - attributes."; - uses one-way-performance-metrics; - uses two-way-performance-metrics; - } - - grouping performance-metrics-attributes { - description - "Contains Performance Metrics (PM) attributes."; - container performance-metrics-one-way { - description - "One-way link performance information in real time."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - uses performance-metrics-one-way-delay-loss; - uses performance-metrics-one-way-bandwidth; - } - container performance-metrics-two-way { - description - "Two-way link performance information in real time."; - reference - "RFC 6374: Packet Loss and Delay Measurement for MPLS - Networks"; - uses performance-metrics-two-way-delay-loss; - } - } - - grouping performance-metrics-throttle-container { - description - "Controls Performance Metrics (PM) throttling."; - container throttle { - must 'suppression-interval >= measure-interval' { - error-message "'suppression-interval' cannot be less than " - + "'measure-interval'."; - description - "Constraint on 'suppression-interval' and - 'measure-interval'."; - } - description - "Link performance information in real time."; - reference - "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions - RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions - RFC 7823: Performance-Based Path Selection for Explicitly - Routed Label Switched Paths (LSPs) Using TE Metric - Extensions"; - leaf one-way-delay-offset { - type uint32 { - range "0..16777215"; - } - units "microseconds"; - default "0"; - description - "Offset value to be added to the measured delay value."; - } - leaf measure-interval { - type uint32; - units "seconds"; - default "30"; - description - "Interval to measure the extended metric values."; - } - leaf advertisement-interval { - type uint32; - units "seconds"; - default "0"; - description - "Interval to advertise the extended metric values."; - } - leaf suppression-interval { - type uint32 { - range "1..max"; - } - units "seconds"; - default "120"; - description - "Interval to suppress advertisement of the extended metric - values."; - reference - "RFC 8570: IS-IS Traffic Engineering (TE) Metric - Extensions, Section 6"; - } - container threshold-out { - description - "If the measured parameter falls outside an upper bound - for all but the minimum-delay metric (or a lower bound - for the minimum-delay metric only) and the advertised - value is not already outside that bound, an 'anomalous' - announcement (anomalous bit set) will be triggered."; - uses performance-metrics-thresholds; - } - container threshold-in { - description - "If the measured parameter falls inside an upper bound - for all but the minimum-delay metric (or a lower bound - for the minimum-delay metric only) and the advertised - value is not already inside that bound, a 'normal' - announcement (anomalous bit cleared) will be triggered."; - uses performance-metrics-thresholds; - } - container threshold-accelerated-advertisement { - description - "When the difference between the last advertised value and - the current measured value exceeds this threshold, an - 'anomalous' announcement (anomalous bit set) will be - triggered."; - uses performance-metrics-thresholds; - } - } - } - - /* - * TE tunnel generic groupings - */ - - grouping explicit-route-hop { - description - "The explicit route entry grouping."; - choice type { - description - "The explicit route entry type."; - case numbered-node-hop { - container numbered-node-hop { - must 'node-id-uri or node-id' { - description - "At least one node identifier needs to be present."; - } - description - "Numbered node route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering - (RSVP-TE)"; - leaf node-id-uri { - type nw:node-id; - description - "The identifier of a node in the topology."; - } - leaf node-id { - type te-node-id; - description - "The identifier of a node in the TE topology."; - } - leaf hop-type { - type te-hop-type; - default "strict"; - description - "Strict or loose hop."; - } - } - } - case numbered-link-hop { - container numbered-link-hop { - description - "Numbered link explicit route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering - (RSVP-TE)"; - leaf link-tp-id { - type te-tp-id; - mandatory true; - description - "TE Link Termination Point (LTP) identifier."; - } - leaf hop-type { - type te-hop-type; - default "strict"; - description - "Strict or loose hop."; - } - leaf direction { - type te-link-direction; - default "outgoing"; - description - "Link route object direction."; - } - } - } - case unnumbered-link-hop { - container unnumbered-link-hop { - must '(link-tp-id-uri or link-tp-id) and ' - + '(node-id-uri or node-id)' { - description - "At least one node identifier and at least one Link - Termination Point (LTP) identifier need to be - present."; - } - description - "Unnumbered link explicit route hop."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, - Section 4.3, EXPLICIT_ROUTE in RSVP-TE - RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering - (RSVP-TE)"; - leaf link-tp-id-uri { - type nt:tp-id; - description - "Link Termination Point (LTP) identifier."; - } - leaf link-tp-id { - type te-tp-id; - description - "TE LTP identifier. - - The combination of the TE link ID and the TE node ID - is used to identify an unnumbered TE link."; - } - leaf node-id-uri { - type nw:node-id; - description - "The identifier of a node in the topology."; - } - leaf node-id { - type te-node-id; - description - "The identifier of a node in the TE topology."; - } - leaf hop-type { - type te-hop-type; - default "strict"; - description - "Strict or loose hop."; - } - leaf direction { - type te-link-direction; - default "outgoing"; - description - "Link route object direction."; - } - } - } - case as-number { - container as-number-hop { - description - "Autonomous System (AS) explicit route hop."; - leaf as-number { - type inet:as-number; - mandatory true; - description - "The Autonomous System (AS) number."; - } - leaf hop-type { - type te-hop-type; - default "strict"; - description - "Strict or loose hop."; - } - } - } - case label { - description - "The label explicit route hop type."; - container label-hop { - description - "Label hop type."; - uses te-label; - } - } - } - } - - grouping explicit-route-hop-with-srlg { - description - "Augments the explicit route entry grouping with Shared Risk - Link Group (SRLG) hop type."; - uses explicit-route-hop { - augment "type" { - description - "Augmentation for a generic explicit route for Shared - Risk Link Group (SRLG) inclusion or exclusion."; - case srlg { - description - "An Shared Risk Link Group (SRLG) value to be - included or excluded."; - container srlg { - description - "Shared Risk Link Group (SRLG) container."; - leaf srlg { - type uint32; - description - "Shared Risk Link Group (SRLG) value."; - } - } - } - } - } - } - - grouping record-route-state { - description - "The Record Route grouping."; - leaf index { - type uint32; - description - "Record Route hop index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without relying - on key values."; - } - choice type { - description - "The Record Route entry type."; - case numbered-node-hop { - description - "Numbered node route hop."; - container numbered-node-hop { - must 'node-id-uri or node-id' { - description - "At least one node identifier need to be present."; - } - description - "Numbered node route hop container."; - leaf node-id-uri { - type nw:node-id; - description - "The identifier of a node in the topology."; - } - leaf node-id { - type te-node-id; - description - "The identifier of a node in the TE topology."; - } - leaf-list flags { - type path-attribute-flags; - description - "Path attributes flags."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels - RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; - } - } - } - case numbered-link-hop { - description - "Numbered link route hop."; - container numbered-link-hop { - description - "Numbered link route hop container."; - leaf link-tp-id { - type te-tp-id; - mandatory true; - description - "Numbered TE LTP identifier."; - } - leaf-list flags { - type path-attribute-flags; - description - "Path attributes flags."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels - RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; - } - } - } - case unnumbered-link-hop { - description - "Unnumbered link route hop."; - container unnumbered-link-hop { - must '(link-tp-id-uri or link-tp-id) and ' - + '(node-id-uri or node-id)' { - description - "At least one node identifier and at least one Link - Termination Point (LTP) identifier need to be - present."; - } - description - "Unnumbered link Record Route hop."; - reference - "RFC 3477: Signalling Unnumbered Links in Resource - ReSerVation Protocol - Traffic Engineering - (RSVP-TE)"; - leaf link-tp-id-uri { - type nt:tp-id; - description - "Link Termination Point (LTP) identifier."; - } - leaf link-tp-id { - type te-tp-id; - description - "TE LTP identifier. - - The combination of the TE link ID and the TE node ID - is used to identify an unnumbered TE link."; - } - leaf node-id-uri { - type nw:node-id; - description - "The identifier of a node in the topology."; - } - leaf node-id { - type te-node-id; - description - "The identifier of a node in the TE topology."; - } - leaf-list flags { - type path-attribute-flags; - description - "Path attributes flags."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels - RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; - } - } - } - case label { - description - "The label Record Route entry types."; - container label-hop { - description - "Label route hop type."; - uses te-label; - leaf-list flags { - type path-attribute-flags; - description - "Path attributes flags."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels - RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP - Tunnels - RFC 4561: Definition of a Record Route Object (RRO) - Node-Id Sub-Object"; - } - } - } - } - } - - grouping label-restriction-info { - description - "Label set item information."; - leaf restriction { - type enumeration { - enum inclusive { - description - "The label or label range is inclusive."; - } - enum exclusive { - description - "The label or label range is exclusive."; - } - } - default "inclusive"; - description - "Indicates whether the list item is inclusive or exclusive."; - } - leaf index { - type uint32; - description - "The index of the label restriction list entry."; - } - container label-start { - must "(not(../label-end/te-label/direction) and" - + " not(te-label/direction))" - + " or " - + "(../label-end/te-label/direction = te-label/direction)" - + " or " - + "(not(te-label/direction) and" - + " (../label-end/te-label/direction = 'forward'))" - + " or " - + "(not(../label-end/te-label/direction) and" - + " (te-label/direction = 'forward'))" { - error-message "'label-start' and 'label-end' must have the " - + "same direction."; - } - description - "This is the starting label if a label range is specified. - This is the label value if a single label is specified, - in which case the 'label-end' attribute is not set."; - uses te-label; - } - container label-end { - must "(not(../label-start/te-label/direction) and" - + " not(te-label/direction))" - + " or " - + "(../label-start/te-label/direction = " - + "te-label/direction)" - + " or " - + "(not(te-label/direction) and" - + " (../label-start/te-label/direction = 'forward'))" - + " or " - + "(not(../label-start/te-label/direction) and" - + " (te-label/direction = 'forward'))" { - error-message "'label-start' and 'label-end' must have the " - + "same direction."; - } - description - "This is the ending label if a label range is specified. - This attribute is not set if a single label is specified."; - uses te-label; - } - container label-step { - description - "The step increment between labels in the label range. - - The label start/end values MUST be consistent with the sign - of label step. - - For example: - 'label-start' < 'label-end' enforces 'label-step' > 0 - 'label-start' > 'label-end' enforces 'label-step' < 0."; - choice technology { - default "generic"; - description - "Data-plane technology type."; - case generic { - leaf generic { - type int32; - default "1"; - description - "Label range step."; - } - } - } - } - leaf range-bitmap { - type yang:hex-string; - description - "When there are gaps between 'label-start' and 'label-end', - this attribute is used to specify the positions - of the used labels. - - This is represented in big endian as 'hex-string'. - - In case the restriction is 'inclusive', the bit-position is - set if the corresponding mapped label is available. - In this case, if the range-bitmap is not present, all the - labels in the range are available. - - In case the restriction is 'exclusive', the bit-position is - set if the corresponding mapped label is not available. - In this case, if the range-bitmap is not present, all the - labels in the range are not available. - - The most significant byte in the hex-string is the farthest - to the left in the byte sequence. - - Leading zero bytes in the configured value may be omitted - for brevity. - - Each bit position in the 'range-bitmap' 'hex-string' maps - to a label in the range derived from 'label-start'. - - For example, assuming that 'label-start' = 16000 and - 'range-bitmap' = 0x01000001, then: - - bit position (0) is set, and the corresponding mapped - label from the range is 16000 + (0 * 'label-step') or - 16000 for default 'label-step' = 1. - - bit position (24) is set, and the corresponding mapped - label from the range is 16000 + (24 * 'label-step') or - 16024 for default 'label-step' = 1."; - } - } - - grouping label-set-info { - description - "Grouping for the list of label restrictions specifying what - labels may or may not be used."; - container label-restrictions { - description - "The label restrictions container."; - list label-restriction { - key "index"; - description - "The absence of the label restrictions container implies - that all labels are acceptable; otherwise, only restricted - labels are available."; - reference - "RFC 7579: General Network Element Constraint Encoding - for GMPLS-Controlled Networks"; - uses label-restriction-info; - } - } - } - - grouping optimization-metric-entry { - description - "Optimization metrics configuration grouping."; - leaf metric-type { - type identityref { - base path-metric-optimization-type; - } - description - "Identifies the 'metric-type' that the path computation - process uses for optimization."; - } - leaf weight { - type uint8; - default "1"; - description - "TE path metric normalization weight."; - } - container explicit-route-exclude-objects { - when "../metric-type = " - + "'te-types:path-metric-optimize-excludes'"; - description - "Container for the 'exclude route' object list."; - uses path-route-exclude-objects; - } - container explicit-route-include-objects { - when "../metric-type = " - + "'te-types:path-metric-optimize-includes'"; - description - "Container for the 'include route' object list."; - uses path-route-include-objects; - } - } - - grouping common-constraints { - description - "Common constraints grouping that can be set on - a constraint set or directly on the tunnel."; - uses te-bandwidth { - description - "A requested bandwidth to use for path computation."; - } - leaf link-protection { - type identityref { - base link-protection-type; - } - default "te-types:link-protection-unprotected"; - description - "Link protection type required for the links included - in the computed path."; - reference - "RFC 4202: Routing Extensions in Support of - Generalized Multi-Protocol Label Switching - (GMPLS)"; - } - leaf setup-priority { - type uint8 { - range "0..7"; - } - default "7"; - description - "TE LSP requested setup priority."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - leaf hold-priority { - type uint8 { - range "0..7"; - } - default "7"; - description - "TE LSP requested hold priority."; - reference - "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; - } - leaf signaling-type { - type identityref { - base path-signaling-type; - } - default "te-types:path-setup-rsvp"; - description - "TE tunnel path signaling type."; - } - } - - grouping tunnel-constraints { - description - "Tunnel constraints grouping that can be set on - a constraint set or directly on the tunnel."; - leaf network-id { - type nw:network-id; - description - "The network topology identifier."; - } - uses te-topology-identifier; - uses common-constraints; - } - - grouping path-constraints-route-objects { - description - "List of route entries to be included or excluded when - performing the path computation."; - container explicit-route-objects { - description - "Container for the explicit route object lists."; - list route-object-exclude-always { - key "index"; - ordered-by user; - description - "List of route objects to always exclude from the path - computation."; - leaf index { - type uint32; - description - "Explicit Route Object index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without - relying on key values."; - } - uses explicit-route-hop { - refine "type/numbered-node-hop/numbered-node-hop" - + "/hop-type" { - must '. = "strict"' { - description - "Loose hops can only be used for 'include' route - objects."; - reference - "RFC 4874: Exclude Routes - Extension to Resource - ReserVation Protocol-Traffic Engineering - (RSVP-TE), Section 3.1"; - } - } - } - } - list route-object-include-exclude { - key "index"; - ordered-by user; - description - "List of route objects to include or exclude in the path - computation."; - leaf explicit-route-usage { - type identityref { - base route-usage-type; - } - default "te-types:route-include-object"; - description - "Indicates whether to include or exclude the - route object. - - The default is to include it."; - } - leaf index { - type uint32; - description - "Route object include-exclude index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without - relying on key values."; - } - uses explicit-route-hop-with-srlg { - refine "type/numbered-node-hop/numbered-node-hop" - + "/hop-type" { - must '(. = "strict") or ' - + 'derived-from-or-self(../../explicit-route-usage,' - + '"te-types:route-include-object")' { - description - "Loose hops can only be used for 'include' route - objects."; - reference - "RFC 4874: Exclude Routes - Extension to Resource - ReserVation Protocol-Traffic Engineering - (RSVP-TE), Section 3.1"; - } - } - } - } - } - } - - grouping path-route-include-objects { - description - "List of route objects to be included when performing - the path computation."; - list route-object-include-object { - key "index"; - ordered-by user; - description - "List of Explicit Route Objects to be included in the - path computation."; - leaf index { - type uint32; - description - "Route object entry index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without - relying on key values."; - } - uses explicit-route-hop; - } - } - - grouping path-route-exclude-objects { - description - "List of route objects to be excluded when performing - the path computation."; - list route-object-exclude-object { - key "index"; - ordered-by user; - description - "List of Explicit Route Objects to be excluded in the - path computation."; - leaf index { - type uint32; - description - "Route object entry index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without - relying on key values."; - } - uses explicit-route-hop-with-srlg; - } - } - - grouping generic-path-metric-bounds { - description - "TE path metric bounds grouping."; - container path-metric-bounds { - description - "Top-level container for the list of path metric bounds."; - list path-metric-bound { - key "metric-type"; - description - "List of path metric bounds, which can apply to link and - path metrics. - - TE paths which have at least one path metric which - exceeds the specified bounds MUST NOT be selected. - - TE paths that traverse TE links which have at least one - link metric which exceeds the specified bounds MUST NOT - be selected."; - leaf metric-type { - type identityref { - base link-path-metric-type; - } - description - "Identifies an entry in the list of 'metric-type' items - bound for the TE path."; - } - leaf upper-bound { - type uint64; - default "0"; - description - "Upper bound on the specified 'metric-type'. - - A zero indicates an unbounded upper limit for the - specified 'metric-type'. - - The unit of is interpreted in the context of the - 'metric-type' identity."; - } - } - } - } - - grouping generic-path-optimization { - description - "TE generic path optimization grouping."; - container optimizations { - description - "The objective function container that includes - attributes to impose when computing a TE path."; - choice algorithm { - description - "Optimizations algorithm."; - case metric { - if-feature "path-optimization-metric"; - /* Optimize by metric */ - list optimization-metric { - key "metric-type"; - description - "TE path metric type."; - uses optimization-metric-entry; - } - /* Tiebreakers */ - container tiebreakers { - status deprecated; - description - "Container for the list of tiebreakers. - - This container has been deprecated by the tiebreaker - leaf."; - list tiebreaker { - key "tiebreaker-type"; - status deprecated; - description - "The list of tiebreaker criteria to apply on an - equally favored set of paths, in order to pick - the best."; - leaf tiebreaker-type { - type identityref { - base path-metric-type; - } - status deprecated; - description - "Identifies an entry in the list of tiebreakers."; - } - } - } - } - case objective-function { - if-feature "path-optimization-objective-function"; - /* Objective functions */ - container objective-function { - description - "The objective function container that includes - attributes to impose when computing a TE path."; - leaf objective-function-type { - type identityref { - base objective-function-type; - } - default "te-types:of-minimize-cost-path"; - description - "Objective function entry."; - } - } - } - } - } - leaf tiebreaker { - type identityref { - base path-tiebreaker-type; - } - default "te-types:path-tiebreaker-random"; - description - "The tiebreaker criteria to apply on an equally favored set - of paths, in order to pick the best."; - } - } - - grouping generic-path-affinities { - description - "Path affinities grouping."; - container path-affinities-values { - description - "Path affinities represented as values."; - list path-affinities-value { - key "usage"; - description - "List of named affinity constraints."; - leaf usage { - type identityref { - base resource-affinities-type; - } - description - "Identifies an entry in the list of value affinity - constraints."; - } - leaf value { - type admin-groups; - default ""; - description - "The affinity value. - - The default is empty."; - } - } - } - container path-affinity-names { - description - "Path affinities represented as names."; - list path-affinity-name { - key "usage"; - description - "List of named affinity constraints."; - leaf usage { - type identityref { - base resource-affinities-type; - } - description - "Identifies an entry in the list of named affinity - constraints."; - } - list affinity-name { - key "name"; - description - "List of named affinities."; - leaf name { - type string; - description - "Identifies a named affinity entry."; - } - } - } - } - } - - grouping generic-path-srlgs { - description - "Path Shared Risk Link Group (SRLG) grouping."; - container path-srlgs-lists { - description - "Path Shared Risk Link Group (SRLG) properties container."; - list path-srlgs-list { - key "usage"; - description - "List of Shared Risk Link Group (SRLG) values to be - included or excluded."; - leaf usage { - type identityref { - base route-usage-type; - } - description - "Identifies an entry in a list of Shared Risk Link Groups - (SRLGs) to either include or exclude."; - } - leaf-list values { - type srlg; - description - "List of Shared Risk Link Group (SRLG) values."; - } - } - } - container path-srlgs-names { - description - "Container for the list of named Shared Risk Link Groups - (SRLGs)."; - list path-srlgs-name { - key "usage"; - description - "List of named Shared Risk Link Groups (SRLGs) to be - included or excluded."; - leaf usage { - type identityref { - base route-usage-type; - } - description - "Identifies an entry in a list of named Shared Risk Link - Groups (SRLGs) to either include or exclude."; - } - leaf-list names { - type string; - description - "List of named Shared Risk Link Groups (SRLGs)."; - } - } - } - } - - grouping generic-path-disjointness { - description - "Path disjointness grouping."; - leaf disjointness { - type te-path-disjointness; - description - "The type of resource disjointness. - When configured for a primary path, the disjointness level - applies to all secondary LSPs. - - When configured for a secondary path, the disjointness - level overrides the level configured for the primary path."; - } - } - - grouping common-path-constraints-attributes { - description - "Common path constraints configuration grouping."; - uses common-constraints; - uses generic-path-metric-bounds; - uses generic-path-affinities; - uses generic-path-srlgs; - } - - grouping generic-path-constraints { - description - "Global named path constraints configuration grouping."; - container path-constraints { - description - "TE named path constraints container."; - uses common-path-constraints-attributes; - uses generic-path-disjointness; - } - } - - grouping generic-path-properties { - description - "TE generic path properties grouping."; - container path-properties { - config false; - description - "The TE path properties."; - list path-metric { - key "metric-type"; - description - "TE path metric type."; - leaf metric-type { - type identityref { - base path-metric-type; - } - description - "TE path metric type."; - } - leaf accumulative-value { - type uint64; - description - "TE path metric accumulative value."; - } - } - uses generic-path-affinities; - uses generic-path-srlgs; - container path-route-objects { - description - "Container for the list of route objects either returned by - the computation engine or actually used by an LSP."; - list path-route-object { - key "index"; - ordered-by user; - description - "List of route objects either returned by the computation - engine or actually used by an LSP."; - leaf index { - type uint32; - description - "Route object entry index. - - The index is used to identify an entry in the list. - - The order of entries is defined by the user without - relying on key values."; - } - uses explicit-route-hop; - } - } - } - } - - grouping encoding-and-switching-type { - description - "Common grouping to define the LSP encoding and - switching types"; - leaf encoding { - type identityref { - base te-types:lsp-encoding-types; - } - description - "LSP encoding type."; - reference - "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS) - Architecture"; - } - leaf switching-type { - type identityref { - base te-types:switching-capabilities; - } - description - "LSP switching type."; - reference - "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS) - Architecture"; - } - } - - grouping te-generic-node-id { - description - "A reusable grouping for a TE generic node identifier."; - leaf id { - type union { - type te-node-id; - type inet:ip-address; - type nw:node-id; - } - description - "The identifier of the node. - - It can be represented as IP address or dotted quad address - or as a URI. - - The type data node disambiguates the union type."; - } - leaf type { - type enumeration { - enum ip { - description - "IP address representation of the node identifier."; - } - enum te-id { - description - "TE identifier of the node"; - } - enum node-id { - description - "URI representation of the node identifier."; - } - } - description - "Type of node identifier representation."; - } - } -} -- GitLab From 2f14baa8e4e4f913c8b563042b35f51e5396aeaf Mon Sep 17 00:00:00 2001 From: armingol Date: Fri, 27 Mar 2026 11:27:43 +0000 Subject: [PATCH 353/371] Update Yang models --- .../yang/ietf-te-packet-types@2020-06-10.yang | 475 +++ .../yang/ietf-te-types@2020-06-10.yang | 3379 +++++++++++++++++ 2 files changed, 3854 insertions(+) create mode 100644 src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang create mode 100644 src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang diff --git a/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang new file mode 100644 index 000000000..8e7d4aafa --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-te-packet-types@2020-06-10.yang @@ -0,0 +1,475 @@ +module ietf-te-packet-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-packet-types"; + prefix te-packet-types; + + /* Import TE generic types */ + + import ietf-te-types { + prefix te-types; + reference + "RFC 8776: Common YANG Data Types for Traffic Engineering"; + } + + organization + "IETF Traffic Engineering Architecture and Signaling (TEAS) + Working Group"; + contact + "WG Web: + WG List: + + Editor: Tarek Saad + + + Editor: Rakesh Gandhi + + + Editor: Vishnu Pavan Beeram + + + Editor: Xufeng Liu + + + Editor: Igor Bryskin + "; + description + "This YANG module contains a collection of generally useful YANG + data type definitions specific to MPLS TE. The model fully + conforms to the Network Management Datastore Architecture + (NMDA). + + Copyright (c) 2020 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject to + the license terms contained in, the Simplified BSD License set + forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8776; see the + RFC itself for full legal notices."; + + revision 2020-06-10 { + description + "Latest revision of TE MPLS types."; + reference + "RFC 8776: Common YANG Data Types for Traffic Engineering"; + } + + /** + * Typedefs + */ + + typedef te-bandwidth-requested-type { + type enumeration { + enum specified { + description + "Bandwidth is explicitly specified."; + } + enum auto { + description + "Bandwidth is automatically computed."; + } + } + description + "Enumerated type for specifying whether bandwidth is + explicitly specified or automatically computed."; + } + + typedef te-class-type { + type uint8; + description + "Diffserv-TE Class-Type. Defines a set of Traffic Trunks + crossing a link that is governed by a specific set of + bandwidth constraints. Class-Type is used for the purposes + of link bandwidth allocation, constraint-based routing, and + admission control."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + typedef bc-type { + type uint8 { + range "0..7"; + } + description + "Diffserv-TE bandwidth constraints as defined in RFC 4124."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + typedef bandwidth-kbps { + type uint64; + units "Kbps"; + description + "Bandwidth values, expressed in kilobits per second."; + } + + typedef bandwidth-mbps { + type uint64; + units "Mbps"; + description + "Bandwidth values, expressed in megabits per second."; + } + + typedef bandwidth-gbps { + type uint64; + units "Gbps"; + description + "Bandwidth values, expressed in gigabits per second."; + } + + identity backup-protection-type { + description + "Base identity for the backup protection type."; + } + + identity backup-protection-link { + base backup-protection-type; + description + "Backup provides link protection only."; + } + + identity backup-protection-node-link { + base backup-protection-type; + description + "Backup offers node (preferred) or link protection."; + } + + identity bc-model-type { + description + "Base identity for the Diffserv-TE Bandwidth Constraints + Model type."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering"; + } + + identity bc-model-rdm { + base bc-model-type; + description + "Russian Dolls Bandwidth Constraints Model type."; + reference + "RFC 4127: Russian Dolls Bandwidth Constraints Model for + Diffserv-aware MPLS Traffic Engineering"; + } + + identity bc-model-mam { + base bc-model-type; + description + "Maximum Allocation Bandwidth Constraints Model type."; + reference + "RFC 4125: Maximum Allocation Bandwidth Constraints Model for + Diffserv-aware MPLS Traffic Engineering"; + } + + identity bc-model-mar { + base bc-model-type; + description + "Maximum Allocation with Reservation Bandwidth Constraints + Model type."; + reference + "RFC 4126: Max Allocation with Reservation Bandwidth + Constraints Model for Diffserv-aware MPLS Traffic Engineering + & Performance Comparisons"; + } + + grouping performance-metrics-attributes-packet { + description + "Contains PM attributes."; + uses te-types:performance-metrics-attributes { + augment "performance-metrics-one-way" { + leaf one-way-min-delay { + type uint32 { + range "0..16777215"; + } + description + "One-way minimum delay or latency in microseconds."; + } + leaf one-way-min-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way minimum delay or latency normality."; + } + leaf one-way-max-delay { + type uint32 { + range "0..16777215"; + } + description + "One-way maximum delay or latency in microseconds."; + } + leaf one-way-max-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way maximum delay or latency normality."; + } + leaf one-way-delay-variation { + type uint32 { + range "0..16777215"; + } + description + "One-way delay variation in microseconds."; + reference + "RFC 5481: Packet Delay Variation Applicability + Statement, Section 4.2"; + } + leaf one-way-delay-variation-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "One-way delay variation normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + leaf one-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + description + "One-way packet loss as a percentage of the total traffic + sent over a configurable interval. The finest precision + is 0.000003%, where the maximum is 50.331642%."; + reference + "RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 4.4"; + } + leaf one-way-packet-loss-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Packet loss normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + description + "PM one-way packet-specific augmentation for a generic PM + grouping."; + } + augment "performance-metrics-two-way" { + leaf two-way-min-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way minimum delay or latency in microseconds."; + } + leaf two-way-min-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way minimum delay or latency normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + leaf two-way-max-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way maximum delay or latency in microseconds."; + } + leaf two-way-max-delay-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way maximum delay or latency normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + leaf two-way-delay-variation { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way delay variation in microseconds."; + reference + "RFC 5481: Packet Delay Variation Applicability + Statement, Section 4.2"; + } + leaf two-way-delay-variation-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way delay variation normality."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric + Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + leaf two-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + default "0"; + description + "Two-way packet loss as a percentage of the total traffic + sent over a configurable interval. The finest precision + is 0.000003%."; + } + leaf two-way-packet-loss-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Two-way packet loss normality."; + } + description + "PM two-way packet-specific augmentation for a generic PM + grouping."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for + Explicitly Routed Label Switched Paths (LSPs) Using + TE Metric Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions"; + } + } + } + + grouping one-way-performance-metrics-packet { + description + "One-way packet PM throttle grouping."; + leaf one-way-min-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "One-way minimum delay or latency in microseconds."; + } + leaf one-way-max-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "One-way maximum delay or latency in microseconds."; + } + leaf one-way-delay-variation { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "One-way delay variation in microseconds."; + } + leaf one-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + default "0"; + description + "One-way packet loss as a percentage of the total traffic + sent over a configurable interval. The finest precision is + 0.000003%."; + } + } + + grouping two-way-performance-metrics-packet { + description + "Two-way packet PM throttle grouping."; + leaf two-way-min-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way minimum delay or latency in microseconds."; + } + leaf two-way-max-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way maximum delay or latency in microseconds."; + } + leaf two-way-delay-variation { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way delay variation in microseconds."; + } + leaf two-way-packet-loss { + type decimal64 { + fraction-digits 6; + range "0..50.331642"; + } + default "0"; + description + "Two-way packet loss as a percentage of the total traffic + sent over a configurable interval. The finest precision is + 0.000003%."; + } + } + + grouping performance-metrics-throttle-container-packet { + description + "Packet PM threshold grouping."; + uses te-types:performance-metrics-throttle-container { + augment "throttle/threshold-out" { + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + description + "PM threshold-out packet augmentation for a + generic grouping."; + } + augment "throttle/threshold-in" { + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + description + "PM threshold-in packet augmentation for a + generic grouping."; + } + augment "throttle/threshold-accelerated-advertisement" { + uses one-way-performance-metrics-packet; + uses two-way-performance-metrics-packet; + description + "PM accelerated advertisement packet augmentation for a + generic grouping."; + } + } + } +} diff --git a/src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang b/src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang new file mode 100644 index 000000000..6fc0544de --- /dev/null +++ b/src/nbi/service/ietf_network/yang/ietf-te-types@2020-06-10.yang @@ -0,0 +1,3379 @@ +module ietf-te-types { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-te-types"; + prefix te-types; + + import ietf-inet-types { + prefix inet; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-yang-types { + prefix yang; + reference + "RFC 6991: Common YANG Data Types"; + } + import ietf-routing-types { + prefix rt-types; + reference + "RFC 8294: Common YANG Data Types for the Routing Area"; + } + + organization + "IETF Traffic Engineering Architecture and Signaling (TEAS) + Working Group"; + contact + "WG Web: + WG List: + + Editor: Tarek Saad + + + Editor: Rakesh Gandhi + + + Editor: Vishnu Pavan Beeram + + + Editor: Xufeng Liu + + + Editor: Igor Bryskin + "; + description + "This YANG module contains a collection of generally useful + YANG data type definitions specific to TE. The model fully + conforms to the Network Management Datastore Architecture + (NMDA). + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here. + + Copyright (c) 2020 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject to + the license terms contained in, the Simplified BSD License set + forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8776; see the + RFC itself for full legal notices."; + + revision 2020-06-10 { + description + "Latest revision of TE types."; + reference + "RFC 8776: Common YANG Data Types for Traffic Engineering"; + } + + /** + * Typedefs + */ + + typedef admin-group { + type yang:hex-string { + /* 01:02:03:04 */ + length "1..11"; + } + description + "Administrative group / resource class / color representation + in 'hex-string' type. + The most significant byte in the hex-string is the farthest + to the left in the byte sequence. Leading zero bytes in the + configured value may be omitted for brevity."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2 + RFC 5305: IS-IS Extensions for Traffic Engineering + RFC 7308: Extended Administrative Groups in MPLS Traffic + Engineering (MPLS-TE)"; + } + + typedef admin-groups { + type union { + type admin-group; + type extended-admin-group; + } + description + "Derived types for TE administrative groups."; + } + + typedef extended-admin-group { + type yang:hex-string; + description + "Extended administrative group / resource class / color + representation in 'hex-string' type. + The most significant byte in the hex-string is the farthest + to the left in the byte sequence. Leading zero bytes in the + configured value may be omitted for brevity."; + reference + "RFC 7308: Extended Administrative Groups in MPLS Traffic + Engineering (MPLS-TE)"; + } + + typedef path-attribute-flags { + type union { + type identityref { + base session-attributes-flags; + } + type identityref { + base lsp-attributes-flags; + } + } + description + "Path attributes flags type."; + } + + typedef performance-metrics-normality { + type enumeration { + enum unknown { + value 0; + description + "Unknown."; + } + enum normal { + value 1; + description + "Normal. Indicates that the anomalous bit is not set."; + } + enum abnormal { + value 2; + description + "Abnormal. Indicates that the anomalous bit is set."; + } + } + description + "Indicates whether a performance metric is normal (anomalous + bit not set), abnormal (anomalous bit set), or unknown."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + } + + typedef srlg { + type uint32; + description + "SRLG type."; + reference + "RFC 4203: OSPF Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS) + RFC 5307: IS-IS Extensions in Support of Generalized + Multi-Protocol Label Switching (GMPLS)"; + } + + typedef te-common-status { + type enumeration { + enum up { + description + "Enabled."; + } + enum down { + description + "Disabled."; + } + enum testing { + description + "In some test mode."; + } + enum preparing-maintenance { + description + "The resource is disabled in the control plane to prepare + for a graceful shutdown for maintenance purposes."; + reference + "RFC 5817: Graceful Shutdown in MPLS and Generalized MPLS + Traffic Engineering Networks"; + } + enum maintenance { + description + "The resource is disabled in the data plane for maintenance + purposes."; + } + enum unknown { + description + "Status is unknown."; + } + } + description + "Defines a type representing the common states of a TE + resource."; + } + + typedef te-bandwidth { + type string { + pattern '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' + + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' + + '[pP](\+)?(12[0-7]|' + + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+' + + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|' + + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?' + + '[pP](\+)?(12[0-7]|' + + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*'; + } + description + "This is the generic bandwidth type. It is a string containing + a list of numbers separated by commas, where each of these + numbers can be non-negative decimal, hex integer, or + hex float: + + (dec | hex | float)[*(','(dec | hex | float))] + + For the packet-switching type, the string encoding follows + the type 'bandwidth-ieee-float32' as defined in RFC 8294 + (e.g., 0x1p10), where the units are in bytes per second. + + For the Optical Transport Network (OTN) switching type, + a list of integers can be used, such as '0,2,3,1', indicating + two ODU0s and one ODU3. ('ODU' stands for 'Optical Data + Unit'.) For Dense Wavelength Division Multiplexing (DWDM), + a list of pairs of slot numbers and widths can be used, + such as '0,2,3,3', indicating a frequency slot 0 with + slot width 2 and a frequency slot 3 with slot width 3. + Canonically, the string is represented as all lowercase and in + hex, where the prefix '0x' precedes the hex number."; + reference + "RFC 8294: Common YANG Data Types for the Routing Area + ITU-T Recommendation G.709: Interfaces for the + optical transport network"; + } + + typedef te-ds-class { + type uint8 { + range "0..7"; + } + description + "The Differentiated Services Class-Type of traffic."; + reference + "RFC 4124: Protocol Extensions for Support of Diffserv-aware + MPLS Traffic Engineering, Section 4.3.1"; + } + + typedef te-global-id { + type uint32; + description + "An identifier to uniquely identify an operator, which can be + either a provider or a client. + The definition of this type is taken from RFCs 6370 and 5003. + This attribute type is used solely to provide a globally + unique context for TE topologies."; + reference + "RFC 5003: Attachment Individual Identifier (AII) Types for + Aggregation + RFC 6370: MPLS Transport Profile (MPLS-TP) Identifiers"; + } + + typedef te-hop-type { + type enumeration { + enum loose { + description + "A loose hop in an explicit path."; + } + enum strict { + description + "A strict hop in an explicit path."; + } + } + description + "Enumerated type for specifying loose or strict paths."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3.3"; + } + + typedef te-link-access-type { + type enumeration { + enum point-to-point { + description + "The link is point-to-point."; + } + enum multi-access { + description + "The link is multi-access, including broadcast and NBMA."; + } + } + description + "Defines a type representing the access type of a TE link."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2"; + } + + typedef te-label-direction { + type enumeration { + enum forward { + description + "Label allocated for the forward LSP direction."; + } + enum reverse { + description + "Label allocated for the reverse LSP direction."; + } + } + description + "Enumerated type for specifying the forward or reverse + label."; + } + + typedef te-link-direction { + type enumeration { + enum incoming { + description + "The explicit route represents an incoming link on + a node."; + } + enum outgoing { + description + "The explicit route represents an outgoing link on + a node."; + } + } + description + "Enumerated type for specifying the direction of a link on + a node."; + } + + typedef te-metric { + type uint32; + description + "TE metric."; + reference + "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a + second MPLS Traffic Engineering (TE) Metric"; + } + + typedef te-node-id { + type yang:dotted-quad; + description + "A type representing the identifier for a node in a TE + topology. + The identifier is represented as 4 octets in dotted-quad + notation. + This attribute MAY be mapped to the Router Address TLV + described in Section 2.4.1 of RFC 3630, the TE Router ID + described in Section 3 of RFC 6827, the Traffic Engineering + Router ID TLV described in Section 4.3 of RFC 5305, or the + TE Router ID TLV described in Section 3.2.1 of RFC 6119. + The reachability of such a TE node MAY be achieved by a + mechanism such as that described in Section 6.2 of RFC 6827."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2, Section 2.4.1 + RFC 5305: IS-IS Extensions for Traffic Engineering, + Section 4.3 + RFC 6119: IPv6 Traffic Engineering in IS-IS, Section 3.2.1 + RFC 6827: Automatically Switched Optical Network (ASON) + Routing for OSPFv2 Protocols, Section 3"; + } + + typedef te-oper-status { + type te-common-status; + description + "Defines a type representing the operational status of + a TE resource."; + } + + typedef te-admin-status { + type te-common-status; + description + "Defines a type representing the administrative status of + a TE resource."; + } + + typedef te-path-disjointness { + type bits { + bit node { + position 0; + description + "Node disjoint."; + } + bit link { + position 1; + description + "Link disjoint."; + } + bit srlg { + position 2; + description + "SRLG (Shared Risk Link Group) disjoint."; + } + } + description + "Type of the resource disjointness for a TE tunnel path."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + typedef te-recovery-status { + type enumeration { + enum normal { + description + "Both the recovery span and the working span are fully + allocated and active, data traffic is being + transported over (or selected from) the working + span, and no trigger events are reported."; + } + enum recovery-started { + description + "The recovery action has been started but not completed."; + } + enum recovery-succeeded { + description + "The recovery action has succeeded. The working span has + reported a failure/degrade condition, and the user traffic + is being transported (or selected) on the recovery span."; + } + enum recovery-failed { + description + "The recovery action has failed."; + } + enum reversion-started { + description + "The reversion has started."; + } + enum reversion-succeeded { + description + "The reversion action has succeeded."; + } + enum reversion-failed { + description + "The reversion has failed."; + } + enum recovery-unavailable { + description + "The recovery is unavailable, as a result of either an + operator's lockout command or a failure condition + detected on the recovery span."; + } + enum recovery-admin { + description + "The operator has issued a command to switch the user + traffic to the recovery span."; + } + enum wait-to-restore { + description + "The recovery domain is recovering from a failure/degrade + condition on the working span that is being controlled by + the Wait-to-Restore (WTR) timer."; + } + } + description + "Defines the status of a recovery action."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS) + RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection"; + } + + typedef te-template-name { + type string { + pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + description + "A type for the name of a TE node template or TE link + template."; + } + + typedef te-topology-event-type { + type enumeration { + enum add { + value 0; + description + "A TE node or TE link has been added."; + } + enum remove { + value 1; + description + "A TE node or TE link has been removed."; + } + enum update { + value 2; + description + "A TE node or TE link has been updated."; + } + } + description + "TE event type for notifications."; + } + + typedef te-topology-id { + type union { + type string { + length "0"; + // empty string + } + type string { + pattern '([a-zA-Z0-9\-_.]+:)*' + + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*'; + } + } + description + "An identifier for a topology. + It is optional to have one or more prefixes at the beginning, + separated by colons. The prefixes can be 'network-types' as + defined in the 'ietf-network' module in RFC 8345, to help the + user better understand the topology before further inquiry + is made."; + reference + "RFC 8345: A YANG Data Model for Network Topologies"; + } + + typedef te-tp-id { + type union { + type uint32; + // Unnumbered + type inet:ip-address; + // IPv4 or IPv6 address + } + description + "An identifier for a TE link endpoint on a node. + This attribute is mapped to a local or remote link identifier + as defined in RFCs 3630 and 5305."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2 + RFC 5305: IS-IS Extensions for Traffic Engineering"; + } + + /* TE features */ + + feature p2mp-te { + description + "Indicates support for Point-to-Multipoint TE (P2MP-TE)."; + reference + "RFC 4875: Extensions to Resource Reservation Protocol - + Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE + Label Switched Paths (LSPs)"; + } + + feature frr-te { + description + "Indicates support for TE Fast Reroute (FRR)."; + reference + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; + } + + feature extended-admin-groups { + description + "Indicates support for TE link extended administrative + groups."; + reference + "RFC 7308: Extended Administrative Groups in MPLS Traffic + Engineering (MPLS-TE)"; + } + + feature named-path-affinities { + description + "Indicates support for named path affinities."; + } + + feature named-extended-admin-groups { + description + "Indicates support for named extended administrative groups."; + } + + feature named-srlg-groups { + description + "Indicates support for named SRLG groups."; + } + + feature named-path-constraints { + description + "Indicates support for named path constraints."; + } + + feature path-optimization-metric { + description + "Indicates support for path optimization metrics."; + } + + feature path-optimization-objective-function { + description + "Indicates support for path optimization objective functions."; + } + + /* + * Identities + */ + + identity session-attributes-flags { + description + "Base identity for the RSVP-TE session attributes flags."; + } + + identity local-protection-desired { + base session-attributes-flags; + description + "Local protection is desired."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.7.1"; + } + + identity se-style-desired { + base session-attributes-flags; + description + "Shared explicit style, to allow the LSP to be established + and share resources with the old LSP."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity local-recording-desired { + base session-attributes-flags; + description + "Label recording is desired."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.7.1"; + } + + identity bandwidth-protection-desired { + base session-attributes-flags; + description + "Requests FRR bandwidth protection on LSRs, if present."; + reference + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; + } + + identity node-protection-desired { + base session-attributes-flags; + description + "Requests FRR node protection on LSRs, if present."; + reference + "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels"; + } + + identity path-reevaluation-request { + base session-attributes-flags; + description + "This flag indicates that a path re-evaluation (of the + current path in use) is requested. Note that this does + not trigger any LSP reroutes but instead just signals a + request to evaluate whether a preferable path exists."; + reference + "RFC 4736: Reoptimization of Multiprotocol Label Switching + (MPLS) Traffic Engineering (TE) Loosely Routed Label Switched + Path (LSP)"; + } + + identity soft-preemption-desired { + base session-attributes-flags; + description + "Soft preemption of LSP resources is desired."; + reference + "RFC 5712: MPLS Traffic Engineering Soft Preemption"; + } + + identity lsp-attributes-flags { + description + "Base identity for LSP attributes flags."; + } + + identity end-to-end-rerouting-desired { + base lsp-attributes-flags; + description + "Indicates end-to-end rerouting behavior for an LSP + undergoing establishment. This MAY also be used to + specify the behavior of end-to-end LSP recovery for + established LSPs."; + reference + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol Traffic Engineering + (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity boundary-rerouting-desired { + base lsp-attributes-flags; + description + "Indicates boundary rerouting behavior for an LSP undergoing + establishment. This MAY also be used to specify + segment-based LSP recovery through nested crankback for + established LSPs. The boundary Area Border Router (ABR) / + Autonomous System Border Router (ASBR) can decide to forward + the PathErr message upstream to either an upstream boundary + ABR/ASBR or the ingress LSR. Alternatively, it can try to + select another egress boundary LSR."; + reference + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol Traffic Engineering + (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity segment-based-rerouting-desired { + base lsp-attributes-flags; + description + "Indicates segment-based rerouting behavior for an LSP + undergoing establishment. This MAY also be used to specify + segment-based LSP recovery for established LSPs."; + reference + "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS + RSVP-TE + RFC 5420: Encoding of Attributes for MPLS LSP Establishment + Using Resource Reservation Protocol Traffic Engineering + (RSVP-TE) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity lsp-integrity-required { + base lsp-attributes-flags; + description + "Indicates that LSP integrity is required."; + reference + "RFC 4875: Extensions to Resource Reservation Protocol - + Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE + Label Switched Paths (LSPs) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity contiguous-lsp-desired { + base lsp-attributes-flags; + description + "Indicates that a contiguous LSP is desired."; + reference + "RFC 5151: Inter-Domain MPLS and GMPLS Traffic Engineering -- + Resource Reservation Protocol-Traffic Engineering (RSVP-TE) + Extensions + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity lsp-stitching-desired { + base lsp-attributes-flags; + description + "Indicates that LSP stitching is desired."; + reference + "RFC 5150: Label Switched Path Stitching with Generalized + Multiprotocol Label Switching Traffic Engineering (GMPLS TE) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity pre-planned-lsp-flag { + base lsp-attributes-flags; + description + "Indicates that the LSP MUST be provisioned in the + control plane only."; + reference + "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions for + Multi-Layer and Multi-Region Networks (MLN/MRN) + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity non-php-behavior-flag { + base lsp-attributes-flags; + description + "Indicates that non-PHP (non-Penultimate Hop Popping) behavior + for the LSP is desired."; + reference + "RFC 6511: Non-Penultimate Hop Popping Behavior and Out-of-Band + Mapping for RSVP-TE Label Switched Paths + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity oob-mapping-flag { + base lsp-attributes-flags; + description + "Indicates that signaling of the egress binding information is + out of band (e.g., via the Border Gateway Protocol (BGP))."; + reference + "RFC 6511: Non-Penultimate Hop Popping Behavior and Out-of-Band + Mapping for RSVP-TE Label Switched Paths + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity entropy-label-capability { + base lsp-attributes-flags; + description + "Indicates entropy label capability."; + reference + "RFC 6790: The Use of Entropy Labels in MPLS Forwarding + RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO)"; + } + + identity oam-mep-entity-desired { + base lsp-attributes-flags; + description + "OAM Maintenance Entity Group End Point (MEP) entities + desired."; + reference + "RFC 7260: GMPLS RSVP-TE Extensions for Operations, + Administration, and Maintenance (OAM) Configuration"; + } + + identity oam-mip-entity-desired { + base lsp-attributes-flags; + description + "OAM Maintenance Entity Group Intermediate Points (MIP) + entities desired."; + reference + "RFC 7260: GMPLS RSVP-TE Extensions for Operations, + Administration, and Maintenance (OAM) Configuration"; + } + + identity srlg-collection-desired { + base lsp-attributes-flags; + description + "SRLG collection desired."; + reference + "RFC 7570: Label Switched Path (LSP) Attribute in the Explicit + Route Object (ERO) + RFC 8001: RSVP-TE Extensions for Collecting Shared Risk + Link Group (SRLG) Information"; + } + + identity loopback-desired { + base lsp-attributes-flags; + description + "This flag indicates that a particular node on the LSP is + required to enter loopback mode. This can also be + used to specify the loopback state of the node."; + reference + "RFC 7571: GMPLS RSVP-TE Extensions for Lock Instruct and + Loopback"; + } + + identity p2mp-te-tree-eval-request { + base lsp-attributes-flags; + description + "P2MP-TE tree re-evaluation request."; + reference + "RFC 8149: RSVP Extensions for Reoptimization of Loosely Routed + Point-to-Multipoint Traffic Engineering Label Switched Paths + (LSPs)"; + } + + identity rtm-set-desired { + base lsp-attributes-flags; + description + "Residence Time Measurement (RTM) attribute flag requested."; + reference + "RFC 8169: Residence Time Measurement in MPLS Networks"; + } + + identity link-protection-type { + description + "Base identity for the link protection type."; + } + + identity link-protection-unprotected { + base link-protection-type; + description + "Unprotected link type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity link-protection-extra-traffic { + base link-protection-type; + description + "Extra-Traffic protected link type."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity link-protection-shared { + base link-protection-type; + description + "Shared protected link type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity link-protection-1-for-1 { + base link-protection-type; + description + "One-for-one (1:1) protected link type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity link-protection-1-plus-1 { + base link-protection-type; + description + "One-plus-one (1+1) protected link type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity link-protection-enhanced { + base link-protection-type; + description + "A compound link protection type derived from the underlay + TE tunnel protection configuration supporting the TE link."; + } + + identity association-type { + description + "Base identity for the tunnel association."; + } + + identity association-type-recovery { + base association-type; + description + "Association type for recovery, used to associate LSPs of the + same tunnel for recovery."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery + RFC 6780: RSVP ASSOCIATION Object Extensions"; + } + + identity association-type-resource-sharing { + base association-type; + description + "Association type for resource sharing, used to enable + resource sharing during make-before-break."; + reference + "RFC 4873: GMPLS Segment Recovery + RFC 6780: RSVP ASSOCIATION Object Extensions"; + } + + identity association-type-double-sided-bidir { + base association-type; + description + "Association type for double-sided bidirectional LSPs, + used to associate two LSPs of two tunnels that are + independently configured on either endpoint."; + reference + "RFC 7551: RSVP-TE Extensions for Associated Bidirectional + Label Switched Paths (LSPs)"; + } + + identity association-type-single-sided-bidir { + base association-type; + description + "Association type for single-sided bidirectional LSPs, + used to associate two LSPs of two tunnels, where one + tunnel is configured on one side/endpoint and the other + tunnel is dynamically created on the other endpoint."; + reference + "RFC 6780: RSVP ASSOCIATION Object Extensions + RFC 7551: RSVP-TE Extensions for Associated Bidirectional + Label Switched Paths (LSPs)"; + } + + identity objective-function-type { + description + "Base objective function type."; + } + + identity of-minimize-cost-path { + base objective-function-type; + description + "Objective function for minimizing path cost."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity of-minimize-load-path { + base objective-function-type; + description + "Objective function for minimizing the load on one or more + paths."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity of-maximize-residual-bandwidth { + base objective-function-type; + description + "Objective function for maximizing residual bandwidth."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity of-minimize-agg-bandwidth-consumption { + base objective-function-type; + description + "Objective function for minimizing aggregate bandwidth + consumption."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity of-minimize-load-most-loaded-link { + base objective-function-type; + description + "Objective function for minimizing the load on the link that + is carrying the highest load."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity of-minimize-cost-path-set { + base objective-function-type; + description + "Objective function for minimizing the cost on a path set."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity path-computation-method { + description + "Base identity for supported path computation mechanisms."; + } + + identity path-locally-computed { + base path-computation-method; + description + "Indicates a constrained-path LSP in which the + path is computed by the local LER."; + reference + "RFC 3272: Overview and Principles of Internet Traffic + Engineering, Section 5.4"; + } + + identity path-externally-queried { + base path-computation-method; + description + "Constrained-path LSP in which the path is obtained by + querying an external source, such as a PCE server. + In the case that an LSP is defined to be externally queried, + it may also have associated explicit definitions (provided + to the external source to aid computation). The path that is + returned by the external source may require further local + computation on the device."; + reference + "RFC 3272: Overview and Principles of Internet Traffic + Engineering + RFC 4657: Path Computation Element (PCE) Communication + Protocol Generic Requirements"; + } + + identity path-explicitly-defined { + base path-computation-method; + description + "Constrained-path LSP in which the path is + explicitly specified as a collection of strict and/or loose + hops."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 3272: Overview and Principles of Internet Traffic + Engineering"; + } + + identity lsp-metric-type { + description + "Base identity for the LSP metric specification types."; + } + + identity lsp-metric-relative { + base lsp-metric-type; + description + "The metric specified for the LSPs to which this identity + refers is specified as a value relative to the IGP metric + cost to the LSP's tail end."; + reference + "RFC 4657: Path Computation Element (PCE) Communication + Protocol Generic Requirements"; + } + + identity lsp-metric-absolute { + base lsp-metric-type; + description + "The metric specified for the LSPs to which this identity + refers is specified as an absolute value."; + reference + "RFC 4657: Path Computation Element (PCE) Communication + Protocol Generic Requirements"; + } + + identity lsp-metric-inherited { + base lsp-metric-type; + description + "The metric for the LSPs to which this identity refers is + not specified explicitly; rather, it is directly inherited + from the IGP cost."; + reference + "RFC 4657: Path Computation Element (PCE) Communication + Protocol Generic Requirements"; + } + + identity te-tunnel-type { + description + "Base identity from which specific tunnel types are derived."; + } + + identity te-tunnel-p2p { + base te-tunnel-type; + description + "TE Point-to-Point (P2P) tunnel type."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity te-tunnel-p2mp { + base te-tunnel-type; + description + "TE P2MP tunnel type."; + reference + "RFC 4875: Extensions to Resource Reservation Protocol - + Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE + Label Switched Paths (LSPs)"; + } + + identity tunnel-action-type { + description + "Base identity from which specific tunnel action types + are derived."; + } + + identity tunnel-action-resetup { + base tunnel-action-type; + description + "TE tunnel action that tears down the tunnel's current LSP + (if any) and attempts to re-establish a new LSP."; + } + + identity tunnel-action-reoptimize { + base tunnel-action-type; + description + "TE tunnel action that reoptimizes the placement of the + tunnel LSP(s)."; + } + + identity tunnel-action-switchpath { + base tunnel-action-type; + description + "TE tunnel action that switches the tunnel's LSP to use the + specified path."; + } + + identity te-action-result { + description + "Base identity from which specific TE action results + are derived."; + } + + identity te-action-success { + base te-action-result; + description + "TE action was successful."; + } + + identity te-action-fail { + base te-action-result; + description + "TE action failed."; + } + + identity tunnel-action-inprogress { + base te-action-result; + description + "TE action is in progress."; + } + + identity tunnel-admin-state-type { + description + "Base identity for TE tunnel administrative states."; + } + + identity tunnel-admin-state-up { + base tunnel-admin-state-type; + description + "Tunnel's administrative state is up."; + } + + identity tunnel-admin-state-down { + base tunnel-admin-state-type; + description + "Tunnel's administrative state is down."; + } + + identity tunnel-state-type { + description + "Base identity for TE tunnel states."; + } + + identity tunnel-state-up { + base tunnel-state-type; + description + "Tunnel's state is up."; + } + + identity tunnel-state-down { + base tunnel-state-type; + description + "Tunnel's state is down."; + } + + identity lsp-state-type { + description + "Base identity for TE LSP states."; + } + + identity lsp-path-computing { + base lsp-state-type; + description + "State path computation is in progress."; + } + + identity lsp-path-computation-ok { + base lsp-state-type; + description + "State path computation was successful."; + } + + identity lsp-path-computation-failed { + base lsp-state-type; + description + "State path computation failed."; + } + + identity lsp-state-setting-up { + base lsp-state-type; + description + "State is being set up."; + } + + identity lsp-state-setup-ok { + base lsp-state-type; + description + "State setup was successful."; + } + + identity lsp-state-setup-failed { + base lsp-state-type; + description + "State setup failed."; + } + + identity lsp-state-up { + base lsp-state-type; + description + "State is up."; + } + + identity lsp-state-tearing-down { + base lsp-state-type; + description + "State is being torn down."; + } + + identity lsp-state-down { + base lsp-state-type; + description + "State is down."; + } + + identity path-invalidation-action-type { + description + "Base identity for TE path invalidation action types."; + } + + identity path-invalidation-action-drop { + base path-invalidation-action-type; + description + "Upon invalidation of the TE tunnel path, the tunnel remains + valid, but any packet mapped over the tunnel is dropped."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 2.5"; + } + + identity path-invalidation-action-teardown { + base path-invalidation-action-type; + description + "TE path invalidation action teardown."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 2.5"; + } + + identity lsp-restoration-type { + description + "Base identity from which LSP restoration types are derived."; + } + + identity lsp-restoration-restore-any { + base lsp-restoration-type; + description + "Any LSP affected by a failure is restored."; + } + + identity lsp-restoration-restore-all { + base lsp-restoration-type; + description + "Affected LSPs are restored after all LSPs of the tunnel are + broken."; + } + + identity restoration-scheme-type { + description + "Base identity for LSP restoration schemes."; + } + + identity restoration-scheme-preconfigured { + base restoration-scheme-type; + description + "Restoration LSP is preconfigured prior to the failure."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity restoration-scheme-precomputed { + base restoration-scheme-type; + description + "Restoration LSP is precomputed prior to the failure."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity restoration-scheme-presignaled { + base restoration-scheme-type; + description + "Restoration LSP is presignaled prior to the failure."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity lsp-protection-type { + description + "Base identity from which LSP protection types are derived."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-unprotected { + base lsp-protection-type; + description + "'Unprotected' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-reroute-extra { + base lsp-protection-type; + description + "'(Full) Rerouting' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-reroute { + base lsp-protection-type; + description + "'Rerouting without Extra-Traffic' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-1-for-n { + base lsp-protection-type; + description + "'1:N Protection with Extra-Traffic' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-1-for-1 { + base lsp-protection-type; + description + "LSP protection '1:1 Protection Type'."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-unidir-1-plus-1 { + base lsp-protection-type; + description + "'1+1 Unidirectional Protection' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-bidir-1-plus-1 { + base lsp-protection-type; + description + "'1+1 Bidirectional Protection' LSP protection type."; + reference + "RFC 4872: RSVP-TE Extensions in Support of End-to-End + Generalized Multi-Protocol Label Switching (GMPLS) Recovery"; + } + + identity lsp-protection-extra-traffic { + base lsp-protection-type; + description + "Extra-Traffic LSP protection type."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity lsp-protection-state { + description + "Base identity of protection states for reporting purposes."; + } + + identity normal { + base lsp-protection-state; + description + "Normal state."; + } + + identity signal-fail-of-protection { + base lsp-protection-state; + description + "The protection transport entity has a signal fail condition + that is of higher priority than the forced switchover + command."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity lockout-of-protection { + base lsp-protection-state; + description + "A Loss of Protection (LoP) command is active."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity forced-switch { + base lsp-protection-state; + description + "A forced switchover command is active."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity signal-fail { + base lsp-protection-state; + description + "There is a signal fail condition on either the working path + or the protection path."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity signal-degrade { + base lsp-protection-state; + description + "There is a signal degrade condition on either the working + path or the protection path."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity manual-switch { + base lsp-protection-state; + description + "A manual switchover command is active."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity wait-to-restore { + base lsp-protection-state; + description + "A WTR timer is running."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity do-not-revert { + base lsp-protection-state; + description + "A Do Not Revert (DNR) condition is active because of + non-revertive behavior."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity failure-of-protocol { + base lsp-protection-state; + description + "LSP protection is not working because of a protocol failure + condition."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity protection-external-commands { + description + "Base identity from which protection-related external commands + used for troubleshooting purposes are derived."; + } + + identity action-freeze { + base protection-external-commands; + description + "A temporary configuration action initiated by an operator + command that prevents any switchover action from being taken + and, as such, freezes the current state."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity clear-freeze { + base protection-external-commands; + description + "An action that clears the active freeze state."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity action-lockout-of-normal { + base protection-external-commands; + description + "A temporary configuration action initiated by an operator + command to ensure that the normal traffic is not allowed + to use the protection transport entity."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity clear-lockout-of-normal { + base protection-external-commands; + description + "An action that clears the active lockout of the + normal state."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity action-lockout-of-protection { + base protection-external-commands; + description + "A temporary configuration action initiated by an operator + command to ensure that the protection transport entity is + temporarily not available to transport a traffic signal + (either normal or Extra-Traffic)."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity action-forced-switch { + base protection-external-commands; + description + "A switchover action initiated by an operator command to switch + the Extra-Traffic signal, the normal traffic signal, or the + null signal to the protection transport entity, unless a + switchover command of equal or higher priority is in effect."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity action-manual-switch { + base protection-external-commands; + description + "A switchover action initiated by an operator command to switch + the Extra-Traffic signal, the normal traffic signal, or + the null signal to the protection transport entity, unless + a fault condition exists on other transport entities or a + switchover command of equal or higher priority is in effect."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity action-exercise { + base protection-external-commands; + description + "An action that starts testing whether or not APS communication + is operating correctly. It is of lower priority than any + other state or command."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity clear { + base protection-external-commands; + description + "An action that clears the active near-end lockout of a + protection, forced switchover, manual switchover, WTR state, + or exercise command."; + reference + "RFC 4427: Recovery (Protection and Restoration) Terminology + for Generalized Multi-Protocol Label Switching (GMPLS)"; + } + + identity switching-capabilities { + description + "Base identity for interface switching capabilities."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity switching-psc1 { + base switching-capabilities; + description + "Packet-Switch Capable-1 (PSC-1)."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity switching-evpl { + base switching-capabilities; + description + "Ethernet Virtual Private Line (EVPL)."; + reference + "RFC 6004: Generalized MPLS (GMPLS) Support for Metro Ethernet + Forum and G.8011 Ethernet Service Switching"; + } + + identity switching-l2sc { + base switching-capabilities; + description + "Layer-2 Switch Capable (L2SC)."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity switching-tdm { + base switching-capabilities; + description + "Time-Division-Multiplex Capable (TDM)."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity switching-otn { + base switching-capabilities; + description + "OTN-TDM capable."; + reference + "RFC 7138: Traffic Engineering Extensions to OSPF for GMPLS + Control of Evolving G.709 Optical Transport Networks"; + } + + identity switching-dcsc { + base switching-capabilities; + description + "Data Channel Switching Capable (DCSC)."; + reference + "RFC 6002: Generalized MPLS (GMPLS) Data Channel + Switching Capable (DCSC) and Channel Set Label Extensions"; + } + + identity switching-lsc { + base switching-capabilities; + description + "Lambda-Switch Capable (LSC)."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity switching-fsc { + base switching-capabilities; + description + "Fiber-Switch Capable (FSC)."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-types { + description + "Base identity for encoding types."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-packet { + base lsp-encoding-types; + description + "Packet LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-ethernet { + base lsp-encoding-types; + description + "Ethernet LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-pdh { + base lsp-encoding-types; + description + "ANSI/ETSI PDH LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-sdh { + base lsp-encoding-types; + description + "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-digital-wrapper { + base lsp-encoding-types; + description + "Digital Wrapper LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-lambda { + base lsp-encoding-types; + description + "Lambda (photonic) LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-fiber { + base lsp-encoding-types; + description + "Fiber LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-fiber-channel { + base lsp-encoding-types; + description + "FiberChannel LSP encoding."; + reference + "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Functional Description"; + } + + identity lsp-encoding-oduk { + base lsp-encoding-types; + description + "G.709 ODUk (Digital Path) LSP encoding."; + reference + "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Extensions for G.709 Optical Transport Networks + Control"; + } + + identity lsp-encoding-optical-channel { + base lsp-encoding-types; + description + "G.709 Optical Channel LSP encoding."; + reference + "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS) + Signaling Extensions for G.709 Optical Transport Networks + Control"; + } + + identity lsp-encoding-line { + base lsp-encoding-types; + description + "Line (e.g., 8B/10B) LSP encoding."; + reference + "RFC 6004: Generalized MPLS (GMPLS) Support for Metro + Ethernet Forum and G.8011 Ethernet Service Switching"; + } + + identity path-signaling-type { + description + "Base identity from which specific LSP path setup types + are derived."; + } + + identity path-setup-static { + base path-signaling-type; + description + "Static LSP provisioning path setup."; + } + + identity path-setup-rsvp { + base path-signaling-type; + description + "RSVP-TE signaling path setup."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity path-setup-sr { + base path-signaling-type; + description + "Segment-routing path setup."; + } + + identity path-scope-type { + description + "Base identity from which specific path scope types are + derived."; + } + + identity path-scope-segment { + base path-scope-type; + description + "Path scope segment."; + reference + "RFC 4873: GMPLS Segment Recovery"; + } + + identity path-scope-end-to-end { + base path-scope-type; + description + "Path scope end to end."; + reference + "RFC 4873: GMPLS Segment Recovery"; + } + + identity route-usage-type { + description + "Base identity for route usage."; + } + + identity route-include-object { + base route-usage-type; + description + "'Include route' object."; + } + + identity route-exclude-object { + base route-usage-type; + description + "'Exclude route' object."; + reference + "RFC 4874: Exclude Routes - Extension to Resource ReserVation + Protocol-Traffic Engineering (RSVP-TE)"; + } + + identity route-exclude-srlg { + base route-usage-type; + description + "Excludes SRLGs."; + reference + "RFC 4874: Exclude Routes - Extension to Resource ReserVation + Protocol-Traffic Engineering (RSVP-TE)"; + } + + identity path-metric-type { + description + "Base identity for the path metric type."; + } + + identity path-metric-te { + base path-metric-type; + description + "TE path metric."; + reference + "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a + second MPLS Traffic Engineering (TE) Metric"; + } + + identity path-metric-igp { + base path-metric-type; + description + "IGP path metric."; + reference + "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a + second MPLS Traffic Engineering (TE) Metric"; + } + + identity path-metric-hop { + base path-metric-type; + description + "Hop path metric."; + } + + identity path-metric-delay-average { + base path-metric-type; + description + "Average unidirectional link delay."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + } + + identity path-metric-delay-minimum { + base path-metric-type; + description + "Minimum unidirectional link delay."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + } + + identity path-metric-residual-bandwidth { + base path-metric-type; + description + "Unidirectional Residual Bandwidth, which is defined to be + Maximum Bandwidth (RFC 3630) minus the bandwidth currently + allocated to LSPs."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2 + RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions"; + } + + identity path-metric-optimize-includes { + base path-metric-type; + description + "A metric that optimizes the number of included resources + specified in a set."; + } + + identity path-metric-optimize-excludes { + base path-metric-type; + description + "A metric that optimizes to a maximum the number of excluded + resources specified in a set."; + } + + identity path-tiebreaker-type { + description + "Base identity for the path tiebreaker type."; + } + + identity path-tiebreaker-minfill { + base path-tiebreaker-type; + description + "Min-Fill LSP path placement."; + } + + identity path-tiebreaker-maxfill { + base path-tiebreaker-type; + description + "Max-Fill LSP path placement."; + } + + identity path-tiebreaker-random { + base path-tiebreaker-type; + description + "Random LSP path placement."; + } + + identity resource-affinities-type { + description + "Base identity for resource class affinities."; + reference + "RFC 2702: Requirements for Traffic Engineering Over MPLS"; + } + + identity resource-aff-include-all { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel, all of which must be present for a link + to be acceptable."; + reference + "RFC 2702: Requirements for Traffic Engineering Over MPLS + RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity resource-aff-include-any { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel, any of which must be present for a link + to be acceptable."; + reference + "RFC 2702: Requirements for Traffic Engineering Over MPLS + RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity resource-aff-exclude-any { + base resource-affinities-type; + description + "The set of attribute filters associated with a + tunnel, any of which renders a link unacceptable."; + reference + "RFC 2702: Requirements for Traffic Engineering Over MPLS + RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + + identity te-optimization-criterion { + description + "Base identity for the TE optimization criteria."; + reference + "RFC 3272: Overview and Principles of Internet Traffic + Engineering"; + } + + identity not-optimized { + base te-optimization-criterion; + description + "Optimization is not applied."; + } + + identity cost { + base te-optimization-criterion; + description + "Optimized on cost."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity delay { + base te-optimization-criterion; + description + "Optimized on delay."; + reference + "RFC 5541: Encoding of Objective Functions in the Path + Computation Element Communication Protocol (PCEP)"; + } + + identity path-computation-srlg-type { + description + "Base identity for SRLG path computation."; + } + + identity srlg-ignore { + base path-computation-srlg-type; + description + "Ignores SRLGs in the path computation."; + } + + identity srlg-strict { + base path-computation-srlg-type; + description + "Includes a strict SRLG check in the path computation."; + } + + identity srlg-preferred { + base path-computation-srlg-type; + description + "Includes a preferred SRLG check in the path computation."; + } + + identity srlg-weighted { + base path-computation-srlg-type; + description + "Includes a weighted SRLG check in the path computation."; + } + + /** + * TE bandwidth groupings + **/ + + grouping te-bandwidth { + description + "This grouping defines the generic TE bandwidth. + For some known data-plane technologies, specific modeling + structures are specified. The string-encoded 'te-bandwidth' + type is used for unspecified technologies. + The modeling structure can be augmented later for other + technologies."; + container te-bandwidth { + description + "Container that specifies TE bandwidth. The choices + can be augmented for specific data-plane technologies."; + choice technology { + default "generic"; + description + "Data-plane technology type."; + case generic { + leaf generic { + type te-bandwidth; + description + "Bandwidth specified in a generic format."; + } + } + } + } + } + + /** + * TE label groupings + **/ + + grouping te-label { + description + "This grouping defines the generic TE label. + The modeling structure can be augmented for each technology. + For unspecified technologies, 'rt-types:generalized-label' + is used."; + container te-label { + description + "Container that specifies the TE label. The choices can + be augmented for specific data-plane technologies."; + choice technology { + default "generic"; + description + "Data-plane technology type."; + case generic { + leaf generic { + type rt-types:generalized-label; + description + "TE label specified in a generic format."; + } + } + } + leaf direction { + type te-label-direction; + default "forward"; + description + "Label direction."; + } + } + } + + grouping te-topology-identifier { + description + "Augmentation for a TE topology."; + container te-topology-identifier { + description + "TE topology identifier container."; + leaf provider-id { + type te-global-id; + default "0"; + description + "An identifier to uniquely identify a provider. + If omitted, it assumes that the topology provider ID + value = 0 (the default)."; + } + leaf client-id { + type te-global-id; + default "0"; + description + "An identifier to uniquely identify a client. + If omitted, it assumes that the topology client ID + value = 0 (the default)."; + } + leaf topology-id { + type te-topology-id; + default ""; + description + "When the datastore contains several topologies, + 'topology-id' distinguishes between them. If omitted, + the default (empty) string for this leaf is assumed."; + } + } + } + + /** + * TE performance metrics groupings + **/ + + grouping performance-metrics-one-way-delay-loss { + description + "Performance Metrics (PM) information in real time that can + be applicable to links or connections. PM defined in this + grouping are applicable to generic TE PM as well as packet TE + PM."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + leaf one-way-delay { + type uint32 { + range "0..16777215"; + } + description + "One-way delay or latency in microseconds."; + } + leaf one-way-delay-normality { + type te-types:performance-metrics-normality; + description + "One-way delay normality."; + } + } + + grouping performance-metrics-two-way-delay-loss { + description + "PM information in real time that can be applicable to links or + connections. PM defined in this grouping are applicable to + generic TE PM as well as packet TE PM."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + leaf two-way-delay { + type uint32 { + range "0..16777215"; + } + description + "Two-way delay or latency in microseconds."; + } + leaf two-way-delay-normality { + type te-types:performance-metrics-normality; + description + "Two-way delay normality."; + } + } + + grouping performance-metrics-one-way-bandwidth { + description + "PM information in real time that can be applicable to links. + PM defined in this grouping are applicable to generic TE PM + as well as packet TE PM."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + leaf one-way-residual-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Residual bandwidth that subtracts tunnel reservations from + Maximum Bandwidth (or link capacity) (RFC 3630) and + provides an aggregated remainder across QoS classes."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2"; + } + leaf one-way-residual-bandwidth-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Residual bandwidth normality."; + } + leaf one-way-available-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Available bandwidth that is defined to be residual + bandwidth minus the measured bandwidth used for the + actual forwarding of non-RSVP-TE LSP packets. For a + bundled link, available bandwidth is defined to be the + sum of the component link available bandwidths."; + } + leaf one-way-available-bandwidth-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Available bandwidth normality."; + } + leaf one-way-utilized-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Bandwidth utilization that represents the actual + utilization of the link (i.e., as measured in the router). + For a bundled link, bandwidth utilization is defined to + be the sum of the component link bandwidth utilizations."; + } + leaf one-way-utilized-bandwidth-normality { + type te-types:performance-metrics-normality; + default "normal"; + description + "Bandwidth utilization normality."; + } + } + + grouping one-way-performance-metrics { + description + "One-way PM throttle grouping."; + leaf one-way-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "One-way delay or latency in microseconds."; + } + leaf one-way-residual-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Residual bandwidth that subtracts tunnel reservations from + Maximum Bandwidth (or link capacity) (RFC 3630) and + provides an aggregated remainder across QoS classes."; + reference + "RFC 3630: Traffic Engineering (TE) Extensions to OSPF + Version 2"; + } + leaf one-way-available-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Available bandwidth that is defined to be residual + bandwidth minus the measured bandwidth used for the + actual forwarding of non-RSVP-TE LSP packets. For a + bundled link, available bandwidth is defined to be the + sum of the component link available bandwidths."; + } + leaf one-way-utilized-bandwidth { + type rt-types:bandwidth-ieee-float32; + units "bytes per second"; + default "0x0p0"; + description + "Bandwidth utilization that represents the actual + utilization of the link (i.e., as measured in the router). + For a bundled link, bandwidth utilization is defined to + be the sum of the component link bandwidth utilizations."; + } + } + + grouping two-way-performance-metrics { + description + "Two-way PM throttle grouping."; + leaf two-way-delay { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Two-way delay or latency in microseconds."; + } + } + + grouping performance-metrics-thresholds { + description + "Grouping for configurable thresholds for measured + attributes."; + uses one-way-performance-metrics; + uses two-way-performance-metrics; + } + + grouping performance-metrics-attributes { + description + "Contains PM attributes."; + container performance-metrics-one-way { + description + "One-way link performance information in real time."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + uses performance-metrics-one-way-delay-loss; + uses performance-metrics-one-way-bandwidth; + } + container performance-metrics-two-way { + description + "Two-way link performance information in real time."; + reference + "RFC 6374: Packet Loss and Delay Measurement for MPLS + Networks"; + uses performance-metrics-two-way-delay-loss; + } + } + + grouping performance-metrics-throttle-container { + description + "Controls PM throttling."; + container throttle { + must 'suppression-interval >= measure-interval' { + error-message "'suppression-interval' cannot be less than " + + "'measure-interval'."; + description + "Constraint on 'suppression-interval' and + 'measure-interval'."; + } + description + "Link performance information in real time."; + reference + "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions + RFC 7823: Performance-Based Path Selection for Explicitly + Routed Label Switched Paths (LSPs) Using TE Metric + Extensions + RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions"; + leaf one-way-delay-offset { + type uint32 { + range "0..16777215"; + } + default "0"; + description + "Offset value to be added to the measured delay value."; + } + leaf measure-interval { + type uint32; + default "30"; + description + "Interval, in seconds, to measure the extended metric + values."; + } + leaf advertisement-interval { + type uint32; + default "0"; + description + "Interval, in seconds, to advertise the extended metric + values."; + } + leaf suppression-interval { + type uint32 { + range "1..max"; + } + default "120"; + description + "Interval, in seconds, to suppress advertisement of the + extended metric values."; + reference + "RFC 8570: IS-IS Traffic Engineering (TE) Metric + Extensions, Section 6"; + } + container threshold-out { + uses performance-metrics-thresholds; + description + "If the measured parameter falls outside an upper bound + for all but the minimum-delay metric (or a lower bound + for the minimum-delay metric only) and the advertised + value is not already outside that bound, an 'anomalous' + announcement (anomalous bit set) will be triggered."; + } + container threshold-in { + uses performance-metrics-thresholds; + description + "If the measured parameter falls inside an upper bound + for all but the minimum-delay metric (or a lower bound + for the minimum-delay metric only) and the advertised + value is not already inside that bound, a 'normal' + announcement (anomalous bit cleared) will be triggered."; + } + container threshold-accelerated-advertisement { + description + "When the difference between the last advertised value and + the current measured value exceeds this threshold, an + 'anomalous' announcement (anomalous bit set) will be + triggered."; + uses performance-metrics-thresholds; + } + } + } + + /** + * TE tunnel generic groupings + **/ + + grouping explicit-route-hop { + description + "The explicit route entry grouping."; + choice type { + description + "The explicit route entry type."; + case numbered-node-hop { + container numbered-node-hop { + leaf node-id { + type te-node-id; + mandatory true; + description + "The identifier of a node in the TE topology."; + } + leaf hop-type { + type te-hop-type; + default "strict"; + description + "Strict or loose hop."; + } + description + "Numbered node route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; + } + } + case numbered-link-hop { + container numbered-link-hop { + leaf link-tp-id { + type te-tp-id; + mandatory true; + description + "TE Link Termination Point (LTP) identifier."; + } + leaf hop-type { + type te-hop-type; + default "strict"; + description + "Strict or loose hop."; + } + leaf direction { + type te-link-direction; + default "outgoing"; + description + "Link route object direction."; + } + description + "Numbered link explicit route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; + } + } + case unnumbered-link-hop { + container unnumbered-link-hop { + leaf link-tp-id { + type te-tp-id; + mandatory true; + description + "TE LTP identifier. The combination of the TE link ID + and the TE node ID is used to identify an unnumbered + TE link."; + } + leaf node-id { + type te-node-id; + mandatory true; + description + "The identifier of a node in the TE topology."; + } + leaf hop-type { + type te-hop-type; + default "strict"; + description + "Strict or loose hop."; + } + leaf direction { + type te-link-direction; + default "outgoing"; + description + "Link route object direction."; + } + description + "Unnumbered link explicit route hop."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels, + Section 4.3, EXPLICIT_ROUTE in RSVP-TE + RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; + } + } + case as-number { + container as-number-hop { + leaf as-number { + type inet:as-number; + mandatory true; + description + "The Autonomous System (AS) number."; + } + leaf hop-type { + type te-hop-type; + default "strict"; + description + "Strict or loose hop."; + } + description + "AS explicit route hop."; + } + } + case label { + container label-hop { + description + "Label hop type."; + uses te-label; + } + description + "The label explicit route hop type."; + } + } + } + + grouping record-route-state { + description + "The Record Route grouping."; + leaf index { + type uint32; + description + "Record Route hop index. The index is used to + identify an entry in the list. The order of entries + is defined by the user without relying on key values."; + } + choice type { + description + "The Record Route entry type."; + case numbered-node-hop { + container numbered-node-hop { + description + "Numbered node route hop container."; + leaf node-id { + type te-node-id; + mandatory true; + description + "The identifier of a node in the TE topology."; + } + leaf-list flags { + type path-attribute-flags; + description + "Path attributes flags."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels + RFC 4561: Definition of a Record Route Object (RRO) + Node-Id Sub-Object"; + } + } + description + "Numbered node route hop."; + } + case numbered-link-hop { + container numbered-link-hop { + description + "Numbered link route hop container."; + leaf link-tp-id { + type te-tp-id; + mandatory true; + description + "Numbered TE LTP identifier."; + } + leaf-list flags { + type path-attribute-flags; + description + "Path attributes flags."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels + RFC 4561: Definition of a Record Route Object (RRO) + Node-Id Sub-Object"; + } + } + description + "Numbered link route hop."; + } + case unnumbered-link-hop { + container unnumbered-link-hop { + leaf link-tp-id { + type te-tp-id; + mandatory true; + description + "TE LTP identifier. The combination of the TE link ID + and the TE node ID is used to identify an unnumbered + TE link."; + } + leaf node-id { + type te-node-id; + description + "The identifier of a node in the TE topology."; + } + leaf-list flags { + type path-attribute-flags; + description + "Path attributes flags."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels + RFC 4561: Definition of a Record Route Object (RRO) + Node-Id Sub-Object"; + } + description + "Unnumbered link Record Route hop."; + reference + "RFC 3477: Signalling Unnumbered Links in Resource + ReSerVation Protocol - Traffic Engineering (RSVP-TE)"; + } + description + "Unnumbered link route hop."; + } + case label { + container label-hop { + description + "Label route hop type."; + uses te-label; + leaf-list flags { + type path-attribute-flags; + description + "Path attributes flags."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels + RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP + Tunnels + RFC 4561: Definition of a Record Route Object (RRO) + Node-Id Sub-Object"; + } + } + description + "The label Record Route entry types."; + } + } + } + + grouping label-restriction-info { + description + "Label set item information."; + leaf restriction { + type enumeration { + enum inclusive { + description + "The label or label range is inclusive."; + } + enum exclusive { + description + "The label or label range is exclusive."; + } + } + default "inclusive"; + description + "Indicates whether the list item is inclusive or exclusive."; + } + leaf index { + type uint32; + description + "The index of the label restriction list entry."; + } + container label-start { + must "(not(../label-end/te-label/direction) and" + + " not(te-label/direction))" + + " or " + + "(../label-end/te-label/direction = te-label/direction)" + + " or " + + "(not(te-label/direction) and" + + " (../label-end/te-label/direction = 'forward'))" + + " or " + + "(not(../label-end/te-label/direction) and" + + " (te-label/direction = 'forward'))" { + error-message "'label-start' and 'label-end' must have the " + + "same direction."; + } + description + "This is the starting label if a label range is specified. + This is the label value if a single label is specified, + in which case the 'label-end' attribute is not set."; + uses te-label; + } + container label-end { + must "(not(../label-start/te-label/direction) and" + + " not(te-label/direction))" + + " or " + + "(../label-start/te-label/direction = te-label/direction)" + + " or " + + "(not(te-label/direction) and" + + " (../label-start/te-label/direction = 'forward'))" + + " or " + + "(not(../label-start/te-label/direction) and" + + " (te-label/direction = 'forward'))" { + error-message "'label-start' and 'label-end' must have the " + + "same direction."; + } + description + "This is the ending label if a label range is specified. + This attribute is not set if a single label is specified."; + uses te-label; + } + container label-step { + description + "The step increment between labels in the label range. + The label start/end values will have to be consistent + with the sign of label step. For example, + 'label-start' < 'label-end' enforces 'label-step' > 0 + 'label-start' > 'label-end' enforces 'label-step' < 0."; + choice technology { + default "generic"; + description + "Data-plane technology type."; + case generic { + leaf generic { + type int32; + default "1"; + description + "Label range step."; + } + } + } + } + leaf range-bitmap { + type yang:hex-string; + description + "When there are gaps between 'label-start' and 'label-end', + this attribute is used to specify the positions + of the used labels. This is represented in big endian as + 'hex-string'. + The most significant byte in the hex-string is the farthest + to the left in the byte sequence. Leading zero bytes in the + configured value may be omitted for brevity. + Each bit position in the 'range-bitmap' 'hex-string' maps + to a label in the range derived from 'label-start'. + + For example, assuming that 'label-start' = 16000 and + 'range-bitmap' = 0x01000001, then: + + - bit position (0) is set, and the corresponding mapped + label from the range is 16000 + (0 * 'label-step') or + 16000 for default 'label-step' = 1. + - bit position (24) is set, and the corresponding mapped + label from the range is 16000 + (24 * 'label-step') or + 16024 for default 'label-step' = 1."; + } + } + + grouping label-set-info { + description + "Grouping for the list of label restrictions specifying what + labels may or may not be used."; + container label-restrictions { + description + "The label restrictions container."; + list label-restriction { + key "index"; + description + "The absence of the label restrictions container implies + that all labels are acceptable; otherwise, only restricted + labels are available."; + reference + "RFC 7579: General Network Element Constraint Encoding + for GMPLS-Controlled Networks"; + uses label-restriction-info; + } + } + } + + grouping optimization-metric-entry { + description + "Optimization metrics configuration grouping."; + leaf metric-type { + type identityref { + base path-metric-type; + } + description + "Identifies the 'metric-type' that the path computation + process uses for optimization."; + } + leaf weight { + type uint8; + default "1"; + description + "TE path metric normalization weight."; + } + container explicit-route-exclude-objects { + when "../metric-type = " + + "'te-types:path-metric-optimize-excludes'"; + description + "Container for the 'exclude route' object list."; + uses path-route-exclude-objects; + } + container explicit-route-include-objects { + when "../metric-type = " + + "'te-types:path-metric-optimize-includes'"; + description + "Container for the 'include route' object list."; + uses path-route-include-objects; + } + } + + grouping common-constraints { + description + "Common constraints grouping that can be set on + a constraint set or directly on the tunnel."; + uses te-bandwidth { + description + "A requested bandwidth to use for path computation."; + } + leaf link-protection { + type identityref { + base link-protection-type; + } + default "te-types:link-protection-unprotected"; + description + "Link protection type required for the links included + in the computed path."; + reference + "RFC 4202: Routing Extensions in Support of + Generalized Multi-Protocol Label Switching (GMPLS)"; + } + leaf setup-priority { + type uint8 { + range "0..7"; + } + default "7"; + description + "TE LSP requested setup priority."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + leaf hold-priority { + type uint8 { + range "0..7"; + } + default "7"; + description + "TE LSP requested hold priority."; + reference + "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels"; + } + leaf signaling-type { + type identityref { + base path-signaling-type; + } + default "te-types:path-setup-rsvp"; + description + "TE tunnel path signaling type."; + } + } + + grouping tunnel-constraints { + description + "Tunnel constraints grouping that can be set on + a constraint set or directly on the tunnel."; + uses te-topology-identifier; + uses common-constraints; + } + + grouping path-constraints-route-objects { + description + "List of route entries to be included or excluded when + performing the path computation."; + container explicit-route-objects-always { + description + "Container for the 'exclude route' object list."; + list route-object-exclude-always { + key "index"; + ordered-by user; + description + "List of route objects to always exclude from the path + computation."; + leaf index { + type uint32; + description + "Explicit Route Object index. The index is used to + identify an entry in the list. The order of entries + is defined by the user without relying on key values."; + } + uses explicit-route-hop; + } + list route-object-include-exclude { + key "index"; + ordered-by user; + description + "List of route objects to include or exclude in the path + computation."; + leaf explicit-route-usage { + type identityref { + base route-usage-type; + } + default "te-types:route-include-object"; + description + "Indicates whether to include or exclude the + route object. The default is to include it."; + } + leaf index { + type uint32; + description + "Route object include-exclude index. The index is used + to identify an entry in the list. The order of entries + is defined by the user without relying on key values."; + } + uses explicit-route-hop { + augment "type" { + case srlg { + container srlg { + description + "SRLG container."; + leaf srlg { + type uint32; + description + "SRLG value."; + } + } + description + "An SRLG value to be included or excluded."; + } + description + "Augmentation for a generic explicit route for SRLG + exclusion."; + } + } + } + } + } + + grouping path-route-include-objects { + description + "List of route objects to be included when performing + the path computation."; + list route-object-include-object { + key "index"; + ordered-by user; + description + "List of Explicit Route Objects to be included in the + path computation."; + leaf index { + type uint32; + description + "Route object entry index. The index is used to + identify an entry in the list. The order of entries + is defined by the user without relying on key values."; + } + uses explicit-route-hop; + } + } + + grouping path-route-exclude-objects { + description + "List of route objects to be excluded when performing + the path computation."; + list route-object-exclude-object { + key "index"; + ordered-by user; + description + "List of Explicit Route Objects to be excluded in the + path computation."; + leaf index { + type uint32; + description + "Route object entry index. The index is used to + identify an entry in the list. The order of entries + is defined by the user without relying on key values."; + } + uses explicit-route-hop { + augment "type" { + case srlg { + container srlg { + description + "SRLG container."; + leaf srlg { + type uint32; + description + "SRLG value."; + } + } + description + "An SRLG value to be included or excluded."; + } + description + "Augmentation for a generic explicit route for SRLG + exclusion."; + } + } + } + } + + grouping generic-path-metric-bounds { + description + "TE path metric bounds grouping."; + container path-metric-bounds { + description + "TE path metric bounds container."; + list path-metric-bound { + key "metric-type"; + description + "List of TE path metric bounds."; + leaf metric-type { + type identityref { + base path-metric-type; + } + description + "Identifies an entry in the list of 'metric-type' items + bound for the TE path."; + } + leaf upper-bound { + type uint64; + default "0"; + description + "Upper bound on the end-to-end TE path metric. A zero + indicates an unbounded upper limit for the specific + 'metric-type'."; + } + } + } + } + + grouping generic-path-optimization { + description + "TE generic path optimization grouping."; + container optimizations { + description + "The objective function container that includes + attributes to impose when computing a TE path."; + choice algorithm { + description + "Optimizations algorithm."; + case metric { + if-feature "path-optimization-metric"; + /* Optimize by metric */ + list optimization-metric { + key "metric-type"; + description + "TE path metric type."; + uses optimization-metric-entry; + } + /* Tiebreakers */ + container tiebreakers { + description + "Container for the list of tiebreakers."; + list tiebreaker { + key "tiebreaker-type"; + description + "The list of tiebreaker criteria to apply on an + equally favored set of paths, in order to pick + the best."; + leaf tiebreaker-type { + type identityref { + base path-metric-type; + } + description + "Identifies an entry in the list of tiebreakers."; + } + } + } + } + case objective-function { + if-feature "path-optimization-objective-function"; + /* Objective functions */ + container objective-function { + description + "The objective function container that includes + attributes to impose when computing a TE path."; + leaf objective-function-type { + type identityref { + base objective-function-type; + } + default "te-types:of-minimize-cost-path"; + description + "Objective function entry."; + } + } + } + } + } + } + + grouping generic-path-affinities { + description + "Path affinities grouping."; + container path-affinities-values { + description + "Path affinities represented as values."; + list path-affinities-value { + key "usage"; + description + "List of named affinity constraints."; + leaf usage { + type identityref { + base resource-affinities-type; + } + description + "Identifies an entry in the list of value affinity + constraints."; + } + leaf value { + type admin-groups; + default ""; + description + "The affinity value. The default is empty."; + } + } + } + container path-affinity-names { + description + "Path affinities represented as names."; + list path-affinity-name { + key "usage"; + description + "List of named affinity constraints."; + leaf usage { + type identityref { + base resource-affinities-type; + } + description + "Identifies an entry in the list of named affinity + constraints."; + } + list affinity-name { + key "name"; + leaf name { + type string; + description + "Identifies a named affinity entry."; + } + description + "List of named affinities."; + } + } + } + } + + grouping generic-path-srlgs { + description + "Path SRLG grouping."; + container path-srlgs-lists { + description + "Path SRLG properties container."; + list path-srlgs-list { + key "usage"; + description + "List of SRLG values to be included or excluded."; + leaf usage { + type identityref { + base route-usage-type; + } + description + "Identifies an entry in a list of SRLGs to either + include or exclude."; + } + leaf-list values { + type srlg; + description + "List of SRLG values."; + } + } + } + container path-srlgs-names { + description + "Container for the list of named SRLGs."; + list path-srlgs-name { + key "usage"; + description + "List of named SRLGs to be included or excluded."; + leaf usage { + type identityref { + base route-usage-type; + } + description + "Identifies an entry in a list of named SRLGs to either + include or exclude."; + } + leaf-list names { + type string; + description + "List of named SRLGs."; + } + } + } + } + + grouping generic-path-disjointness { + description + "Path disjointness grouping."; + leaf disjointness { + type te-path-disjointness; + description + "The type of resource disjointness. + When configured for a primary path, the disjointness level + applies to all secondary LSPs. When configured for a + secondary path, the disjointness level overrides the level + configured for the primary path."; + } + } + + grouping common-path-constraints-attributes { + description + "Common path constraints configuration grouping."; + uses common-constraints; + uses generic-path-metric-bounds; + uses generic-path-affinities; + uses generic-path-srlgs; + } + + grouping generic-path-constraints { + description + "Global named path constraints configuration grouping."; + container path-constraints { + description + "TE named path constraints container."; + uses common-path-constraints-attributes; + uses generic-path-disjointness; + } + } + + grouping generic-path-properties { + description + "TE generic path properties grouping."; + container path-properties { + config false; + description + "The TE path properties."; + list path-metric { + key "metric-type"; + description + "TE path metric type."; + leaf metric-type { + type identityref { + base path-metric-type; + } + description + "TE path metric type."; + } + leaf accumulative-value { + type uint64; + description + "TE path metric accumulative value."; + } + } + uses generic-path-affinities; + uses generic-path-srlgs; + container path-route-objects { + description + "Container for the list of route objects either returned by + the computation engine or actually used by an LSP."; + list path-route-object { + key "index"; + ordered-by user; + description + "List of route objects either returned by the computation + engine or actually used by an LSP."; + leaf index { + type uint32; + description + "Route object entry index. The index is used to + identify an entry in the list. The order of entries + is defined by the user without relying on key + values."; + } + uses explicit-route-hop; + } + } + } + } +} -- GitLab From b6edd2103d590ff7046ca07915b7a2e83f415415 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 27 Mar 2026 11:45:48 +0000 Subject: [PATCH 354/371] Remove wrong submodule openconfig_public --- openconfig_public | 1 - 1 file changed, 1 deletion(-) delete mode 160000 openconfig_public diff --git a/openconfig_public b/openconfig_public deleted file mode 160000 index 834db2b62..000000000 --- a/openconfig_public +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 834db2b62f8ee66ee6c8f8b567569ad81caac34e -- GitLab From 29fa0a012ec048ce2e3e53d35c4899269cb65080 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 27 Mar 2026 13:51:38 +0000 Subject: [PATCH 355/371] WebUI component - Add Device Page: - Add missing OpenROADM field --- src/webui/service/templates/device/add.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/webui/service/templates/device/add.html b/src/webui/service/templates/device/add.html index 24c0dd949..1c01f2292 100644 --- a/src/webui/service/templates/device/add.html +++ b/src/webui/service/templates/device/add.html @@ -107,6 +107,7 @@
{{ form.device_drivers_ryu }} {{ form.device_drivers_ryu.label(class="col-sm-3 col-form-label") }} {{ form.device_drivers_gnmi_nokia_srlinux }} {{ form.device_drivers_gnmi_nokia_srlinux.label(class="col-sm-3 col-form-label") }} + {{ form.device_drivers_openroadm }} {{ form.device_drivers_openroadm.label(class="col-sm-3 col-form-label") }} {% endif %} -- GitLab From 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Fri, 27 Mar 2026 19:52:38 +0100 Subject: [PATCH 356/371] working closed loop and threshold --- src/tests/automation/descriptors/automation.json | 2 +- src/tests/ofc26_flexscale/run_ofc26_test.sh | 14 ++++++++++++++ src/tests/ofc26_flexscale/test_ofc26_messages.py | 4 ++-- .../test_ofc26_mgon_integration_V2.py | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/tests/automation/descriptors/automation.json b/src/tests/automation/descriptors/automation.json index 5e6287ec3..bef7c4aa6 100644 --- a/src/tests/automation/descriptors/automation.json +++ b/src/tests/automation/descriptors/automation.json @@ -10,7 +10,7 @@ "analyzer":{ "operation_mode": "ANALYZEROPERATIONMODE_STREAMING", "parameters": { - "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"avg\": [-5, -25]}]}" + "thresholds": "{\"task_type\": \"AggregationHandler\",\"task_parameter\": [ {\"last\": [-20, 5]}]}" }, "input_kpi_ids": [ {"kpi_id": { "uuid": "6e22f180-ba28-4641-b190-2287bf447777"}} diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh index 8fbdd0457..9d29118ce 100755 --- a/src/tests/ofc26_flexscale/run_ofc26_test.sh +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -20,6 +20,20 @@ cd src/ CRDB_SQL_ADDRESS=$(kubectl get service --namespace ${CRDB_NAMESPACE} cockroachdb-public -o 'jsonpath={.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" +#added for kafka exposure +export KFK_SERVER_ADDRESS='127.0.0.1:9094' + +kubectl port-forward -n kafka service/kafka-public 9094:9094 > /dev/null 2>&1 & +KAFKA_PF_PID=$! + +# Function to cleanup port-forward on exit +cleanup() { + # echo "Cleaning up Kafka port-forward (PID: ${KAFKA_PF_PID})..." + kill ${KAFKA_PF_PID} 2>/dev/null || true + wait ${KAFKA_PF_PID} 2>/dev/null || true +} + + IP_KPI=$(kubectl get all --all-namespaces | grep service/kpi-managerservice | awk '{print $4}') export IP_KPI echo "KPI Manager Service IP: ${IP_KPI}" diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py index 2dbef239f..b29bb949e 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_messages.py +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -17,7 +17,7 @@ def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): _create_kpi_request.device_id.device_uuid.uuid = "ddb3ef8e-ee65-5cf9-9d21-dac56a27f85b" # confirm for TFS _create_kpi_request.service_id.service_uuid.uuid = "b2a60c5b-8c46-5707-a64a-9c6539d395f2" # _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "<>" + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "2" # _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' # _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' return _create_kpi_request @@ -35,7 +35,7 @@ devices = { 'kpi' : KPI.KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER, #'resource': 'oc-wave-router:wavelength-router/fsmgon:optical-bands/optical-band[index=4]/state/optical-power-total-input/instant', 'resource' : 'wavelength-router', #TODO: verify resource name form mg-on model - 'endpoint' : '1', + 'endpoint' : '2', 'skip_verify': True }, } diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index 6f115231b..ec3a57ee0 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -104,7 +104,7 @@ def test_Complete_MGON_Integration(kpi_manager_client, telemetry_frontend_client collector_thread = threading.Thread( target=_service.GenericCollectorHandler, args=( - _coll_id, _collector, None, _duration, _interval, + _coll_id, _collector, "6e22f180-ba28-4641-b190-2287bf447777", _duration, _interval, None, None, None, "43813baf-195e-5da6-af20-b3d0922e71a7", stop_event ), daemon=False -- GitLab From 27bb40b7dd0340cc4a2d889b5f9c60a61df7fa18 Mon Sep 17 00:00:00 2001 From: sgambelluri Date: Mon, 30 Mar 2026 11:06:51 +0200 Subject: [PATCH 357/371] pre-merge commit for optical closed automation --- .../grpc/kpi_sample_types/KpiSampleTypes.java | 24 +++++++++++++++- src/policy/target/kubernetes/kubernetes.yml | 20 ++++++------- src/tests/ofc26_flexscale/my_deploy_ofc26.sh | 2 +- .../grpc/kpi_sample_types/KpiSampleTypes.java | 24 +++++++++++++++- src/ztp/target/kubernetes/kubernetes.yml | 28 +++++++++---------- 5 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java b/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java index 0c98ddbb4..3f4a7a2a6 100644 --- a/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java +++ b/src/policy/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java @@ -71,6 +71,14 @@ public final class KpiSampleTypes { * KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501; */ KPISAMPLETYPE_OPTICAL_SECURITY_STATUS(501), + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT(502), + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER(503), /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -280,6 +288,16 @@ public final class KpiSampleTypes { */ public static final int KPISAMPLETYPE_OPTICAL_SECURITY_STATUS_VALUE = 501; + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + public static final int KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT_VALUE = 502; + + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + public static final int KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER_VALUE = 503; + /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -503,6 +521,10 @@ public final class KpiSampleTypes { return KPISAMPLETYPE_ML_CONFIDENCE; case 501: return KPISAMPLETYPE_OPTICAL_SECURITY_STATUS; + case 502: + return KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT; + case 503: + return KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER; case 601: return KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS; case 602: @@ -628,7 +650,7 @@ public final class KpiSampleTypes { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\346\r\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022)\n$KPISA" + "MPLETYPE_L3_UNIQUE_ATTACK_CONNS\020\331\004\022*\n%KP" + "ISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS\020\332\004\022&" + "\n!KPISAMPLETYPE_L3_UNIQUE_ATTACKERS\020\333\004\0220" + "\n+KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CL" + "IENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3_SECURITY_ST" + "ATUS_CRYPTO\020\335\004\022%\n KPISAMPLETYPE_SERVICE_" + "LATENCY_MS\020\275\005\0221\n,KPISAMPLETYPE_PACKETS_T" + "RANSMITTED_AGG_OUTPUT\020\315\010\022.\n)KPISAMPLETYP" + "E_PACKETS_RECEIVED_AGG_OUTPUT\020\316\010\022-\n(KPIS" + "AMPLETYPE_PACKETS_DROPPED_AGG_OUTPUT\020\317\010\022" + "/\n*KPISAMPLETYPE_BYTES_TRANSMITTED_AGG_O" + "UTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BYTES_RECEIVED" + "_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLETYPE_BYTES_DR" + "OPPED_AGG_OUTPUT\020\263\t\0220\n+KPISAMPLETYPE_SER" + "VICE_LATENCY_MS_AGG_OUTPUT\020\245\r\022\036\n\031KPISAMP" + "LETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPISAMPLETYPE_I" + "NT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYPE_INT_TS_EGR" + "\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP_LAT\020\324\017\022\"\n\035K" + "PISAMPLETYPE_INT_PORT_ID_ING\020\325\017\022\"\n\035KPISA" + "MPLETYPE_INT_PORT_ID_EGR\020\326\017\022\"\n\035KPISAMPLE" + "TYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032KPISAMPLETYPE" + "_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW01\020\265\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "4\020\270\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW05\020\271" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW06\020\272\020\022#" + "\n\036KPISAMPLETYPE_INT_HOP_LAT_SW07\020\273\020\022#\n\036K" + "PISAMPLETYPE_INT_HOP_LAT_SW08\020\274\020\022#\n\036KPIS" + "AMPLETYPE_INT_HOP_LAT_SW09\020\275\020\022#\n\036KPISAMP" + "LETYPE_INT_HOP_LAT_SW10\020\276\020\022#\n\036KPISAMPLET" + "YPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031KPISAMPLETYPE" + "_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLETYPE_INT_DRO" + "P_REASON\020\232\021b\006proto3" }; + java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\302\016\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022,\n\'KPISA" + "MPLETYPE_OPTICAL_POWER_TOTAL_INPUT\020\366\003\022,\n" + "\'KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER" + "\020\367\003\022)\n$KPISAMPLETYPE_L3_UNIQUE_ATTACK_CO" + "NNS\020\331\004\022*\n%KPISAMPLETYPE_L3_TOTAL_DROPPED" + "_PACKTS\020\332\004\022&\n!KPISAMPLETYPE_L3_UNIQUE_AT" + "TACKERS\020\333\004\0220\n+KPISAMPLETYPE_L3_UNIQUE_CO" + "MPROMISED_CLIENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3" + "_SECURITY_STATUS_CRYPTO\020\335\004\022%\n KPISAMPLET" + "YPE_SERVICE_LATENCY_MS\020\275\005\0221\n,KPISAMPLETY" + "PE_PACKETS_TRANSMITTED_AGG_OUTPUT\020\315\010\022.\n)" + "KPISAMPLETYPE_PACKETS_RECEIVED_AGG_OUTPU" + "T\020\316\010\022-\n(KPISAMPLETYPE_PACKETS_DROPPED_AG" + "G_OUTPUT\020\317\010\022/\n*KPISAMPLETYPE_BYTES_TRANS" + "MITTED_AGG_OUTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BY" + "TES_RECEIVED_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLET" + "YPE_BYTES_DROPPED_AGG_OUTPUT\020\263\t\0220\n+KPISA" + "MPLETYPE_SERVICE_LATENCY_MS_AGG_OUTPUT\020\245" + "\r\022\036\n\031KPISAMPLETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPI" + "SAMPLETYPE_INT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYP" + "E_INT_TS_EGR\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP" + "_LAT\020\324\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_ING" + "\020\325\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_EGR\020\326\017\022" + "\"\n\035KPISAMPLETYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032K" + "PISAMPLETYPE_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPL" + "ETYPE_INT_HOP_LAT_SW01\020\265\020\022#\n\036KPISAMPLETY" + "PE_INT_HOP_LAT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_" + "INT_HOP_LAT_SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT" + "_HOP_LAT_SW04\020\270\020\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW05\020\271\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW06\020\272\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW07\020\273\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "8\020\274\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW09\020\275" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW10\020\276\020\022#" + "\n\036KPISAMPLETYPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031K" + "PISAMPLETYPE_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLE" + "TYPE_INT_DROP_REASON\020\232\021b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); } // @@protoc_insertion_point(outer_class_scope) diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index a83d03403..a997d8582 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-21 - 15:35:10 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-21 - 15:35:10 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-21 - 15:35:10 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:42:32 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -75,14 +75,14 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace + - name: SERVICE_SERVICE_HOST + value: serviceservice + - name: MONITORING_SERVICE_HOST + value: monitoringservice - name: KAFKA_BROKER_HOST value: kafka-public.kafka.svc.cluster.local - name: CONTEXT_SERVICE_HOST value: contextservice - - name: MONITORING_SERVICE_HOST - value: monitoringservice - - name: SERVICE_SERVICE_HOST - value: serviceservice image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 imagePullPolicy: Always livenessProbe: diff --git a/src/tests/ofc26_flexscale/my_deploy_ofc26.sh b/src/tests/ofc26_flexscale/my_deploy_ofc26.sh index 540a57646..5c9282e9f 100755 --- a/src/tests/ofc26_flexscale/my_deploy_ofc26.sh +++ b/src/tests/ofc26_flexscale/my_deploy_ofc26.sh @@ -146,7 +146,7 @@ export CRDB_DEPLOY_MODE="single" export CRDB_DROP_DATABASE_IF_EXISTS="YES" # Disable flag for re-deploying CockroachDB from scratch. -export CRDB_REDEPLOY="" +export CRDB_REDEPLOY="YES" # ----- NATS ------------------------------------------------------------------- diff --git a/src/ztp/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java b/src/ztp/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java index 0c98ddbb4..3f4a7a2a6 100644 --- a/src/ztp/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java +++ b/src/ztp/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java @@ -71,6 +71,14 @@ public final class KpiSampleTypes { * KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501; */ KPISAMPLETYPE_OPTICAL_SECURITY_STATUS(501), + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT(502), + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER(503), /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -280,6 +288,16 @@ public final class KpiSampleTypes { */ public static final int KPISAMPLETYPE_OPTICAL_SECURITY_STATUS_VALUE = 501; + /** + * KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT = 502; + */ + public static final int KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT_VALUE = 502; + + /** + * KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER = 503; + */ + public static final int KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER_VALUE = 503; + /** * KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601; */ @@ -503,6 +521,10 @@ public final class KpiSampleTypes { return KPISAMPLETYPE_ML_CONFIDENCE; case 501: return KPISAMPLETYPE_OPTICAL_SECURITY_STATUS; + case 502: + return KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT; + case 503: + return KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER; case 601: return KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS; case 602: @@ -628,7 +650,7 @@ public final class KpiSampleTypes { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\346\r\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022)\n$KPISA" + "MPLETYPE_L3_UNIQUE_ATTACK_CONNS\020\331\004\022*\n%KP" + "ISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS\020\332\004\022&" + "\n!KPISAMPLETYPE_L3_UNIQUE_ATTACKERS\020\333\004\0220" + "\n+KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CL" + "IENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3_SECURITY_ST" + "ATUS_CRYPTO\020\335\004\022%\n KPISAMPLETYPE_SERVICE_" + "LATENCY_MS\020\275\005\0221\n,KPISAMPLETYPE_PACKETS_T" + "RANSMITTED_AGG_OUTPUT\020\315\010\022.\n)KPISAMPLETYP" + "E_PACKETS_RECEIVED_AGG_OUTPUT\020\316\010\022-\n(KPIS" + "AMPLETYPE_PACKETS_DROPPED_AGG_OUTPUT\020\317\010\022" + "/\n*KPISAMPLETYPE_BYTES_TRANSMITTED_AGG_O" + "UTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BYTES_RECEIVED" + "_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLETYPE_BYTES_DR" + "OPPED_AGG_OUTPUT\020\263\t\0220\n+KPISAMPLETYPE_SER" + "VICE_LATENCY_MS_AGG_OUTPUT\020\245\r\022\036\n\031KPISAMP" + "LETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPISAMPLETYPE_I" + "NT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYPE_INT_TS_EGR" + "\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP_LAT\020\324\017\022\"\n\035K" + "PISAMPLETYPE_INT_PORT_ID_ING\020\325\017\022\"\n\035KPISA" + "MPLETYPE_INT_PORT_ID_EGR\020\326\017\022\"\n\035KPISAMPLE" + "TYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032KPISAMPLETYPE" + "_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW01\020\265\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "4\020\270\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW05\020\271" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW06\020\272\020\022#" + "\n\036KPISAMPLETYPE_INT_HOP_LAT_SW07\020\273\020\022#\n\036K" + "PISAMPLETYPE_INT_HOP_LAT_SW08\020\274\020\022#\n\036KPIS" + "AMPLETYPE_INT_HOP_LAT_SW09\020\275\020\022#\n\036KPISAMP" + "LETYPE_INT_HOP_LAT_SW10\020\276\020\022#\n\036KPISAMPLET" + "YPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031KPISAMPLETYPE" + "_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLETYPE_INT_DRO" + "P_REASON\020\232\021b\006proto3" }; + java.lang.String[] descriptorData = { "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" + "es*\302\016\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" + "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" + "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" + "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" + "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" + "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" + "PLETYPE_BYTES_DROPPED\020\313\001\022+\n&KPISAMPLETYP" + "E_LINK_TOTAL_CAPACITY_GBPS\020\255\002\022*\n%KPISAMP" + "LETYPE_LINK_USED_CAPACITY_GBPS\020\256\002\022 \n\033KPI" + "SAMPLETYPE_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLE" + "TYPE_OPTICAL_SECURITY_STATUS\020\365\003\022,\n\'KPISA" + "MPLETYPE_OPTICAL_POWER_TOTAL_INPUT\020\366\003\022,\n" + "\'KPISAMPLETYPE_OPTICAL_TOTAL_INPUT_POWER" + "\020\367\003\022)\n$KPISAMPLETYPE_L3_UNIQUE_ATTACK_CO" + "NNS\020\331\004\022*\n%KPISAMPLETYPE_L3_TOTAL_DROPPED" + "_PACKTS\020\332\004\022&\n!KPISAMPLETYPE_L3_UNIQUE_AT" + "TACKERS\020\333\004\0220\n+KPISAMPLETYPE_L3_UNIQUE_CO" + "MPROMISED_CLIENTS\020\334\004\022,\n\'KPISAMPLETYPE_L3" + "_SECURITY_STATUS_CRYPTO\020\335\004\022%\n KPISAMPLET" + "YPE_SERVICE_LATENCY_MS\020\275\005\0221\n,KPISAMPLETY" + "PE_PACKETS_TRANSMITTED_AGG_OUTPUT\020\315\010\022.\n)" + "KPISAMPLETYPE_PACKETS_RECEIVED_AGG_OUTPU" + "T\020\316\010\022-\n(KPISAMPLETYPE_PACKETS_DROPPED_AG" + "G_OUTPUT\020\317\010\022/\n*KPISAMPLETYPE_BYTES_TRANS" + "MITTED_AGG_OUTPUT\020\261\t\022,\n\'KPISAMPLETYPE_BY" + "TES_RECEIVED_AGG_OUTPUT\020\262\t\022+\n&KPISAMPLET" + "YPE_BYTES_DROPPED_AGG_OUTPUT\020\263\t\0220\n+KPISA" + "MPLETYPE_SERVICE_LATENCY_MS_AGG_OUTPUT\020\245" + "\r\022\036\n\031KPISAMPLETYPE_INT_SEQ_NUM\020\321\017\022\035\n\030KPI" + "SAMPLETYPE_INT_TS_ING\020\322\017\022\035\n\030KPISAMPLETYP" + "E_INT_TS_EGR\020\323\017\022\036\n\031KPISAMPLETYPE_INT_HOP" + "_LAT\020\324\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_ING" + "\020\325\017\022\"\n\035KPISAMPLETYPE_INT_PORT_ID_EGR\020\326\017\022" + "\"\n\035KPISAMPLETYPE_INT_QUEUE_OCCUP\020\327\017\022\037\n\032K" + "PISAMPLETYPE_INT_QUEUE_ID\020\330\017\022#\n\036KPISAMPL" + "ETYPE_INT_HOP_LAT_SW01\020\265\020\022#\n\036KPISAMPLETY" + "PE_INT_HOP_LAT_SW02\020\266\020\022#\n\036KPISAMPLETYPE_" + "INT_HOP_LAT_SW03\020\267\020\022#\n\036KPISAMPLETYPE_INT" + "_HOP_LAT_SW04\020\270\020\022#\n\036KPISAMPLETYPE_INT_HO" + "P_LAT_SW05\020\271\020\022#\n\036KPISAMPLETYPE_INT_HOP_L" + "AT_SW06\020\272\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_" + "SW07\020\273\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW0" + "8\020\274\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW09\020\275" + "\020\022#\n\036KPISAMPLETYPE_INT_HOP_LAT_SW10\020\276\020\022#" + "\n\036KPISAMPLETYPE_INT_LAT_ON_TOTAL\020\310\020\022\036\n\031K" + "PISAMPLETYPE_INT_IS_DROP\020\231\021\022\"\n\035KPISAMPLE" + "TYPE_INT_DROP_REASON\020\232\021b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); } // @@protoc_insertion_point(outer_class_scope) diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml index 9d2196ea6..da7022906 100644 --- a/src/ztp/target/kubernetes/kubernetes.yml +++ b/src/ztp/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-24 - 06:37:09 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:41:09 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -16,10 +16,6 @@ metadata: name: ztp spec: ports: - - name: https - port: 443 - protocol: TCP - targetPort: 8443 - name: http port: 80 protocol: TCP @@ -28,6 +24,10 @@ spec: port: 9000 protocol: TCP targetPort: 9000 + - name: https + port: 443 + protocol: TCP + targetPort: 8443 selector: app.kubernetes.io/name: ztp app.kubernetes.io/version: 0.2.0 @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-24 - 06:37:09 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:41:09 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 9e3e0ebd57f108eb7c0e1946bfc122dfd1a3180e - app.quarkus.io/build-timestamp: 2026-02-24 - 06:37:09 +0000 + app.quarkus.io/commit-id: 81b25ce03beb7463bc8bb5fcecf6a2cf4f64ddc4 + app.quarkus.io/build-timestamp: 2026-03-30 - 08:41:09 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -74,7 +74,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - image: ubuntu/ztp:0.2.0 + image: tfs/ztp:0.2.0 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -88,15 +88,15 @@ spec: timeoutSeconds: 10 name: ztp ports: - - containerPort: 8443 - name: https - protocol: TCP - containerPort: 8080 name: http protocol: TCP - containerPort: 9000 name: grpc protocol: TCP + - containerPort: 8443 + name: https + protocol: TCP readinessProbe: failureThreshold: 3 httpGet: -- GitLab From c2952cca04bc961c83c0d5d349361f82900b768a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:14:57 +0000 Subject: [PATCH 358/371] Pre-merge code cleanup --- my_deploy.sh | 4 +- ofc26.sh | 229 ------------------ .../{my_deploy_ofc26.sh => deploy_specs.sh} | 0 3 files changed, 2 insertions(+), 231 deletions(-) delete mode 100644 ofc26.sh rename src/tests/ofc26_flexscale/{my_deploy_ofc26.sh => deploy_specs.sh} (100%) diff --git a/my_deploy.sh b/my_deploy.sh index ac9167832..24e1f6902 100644 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp opticalcontroller service nbi webui" +export TFS_COMPONENTS="context device pathcomp service nbi webui" # Uncomment to activate Monitoring (old) #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" @@ -143,7 +143,7 @@ export CRDB_PASSWORD="tfs123" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="YES" +export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" diff --git a/ofc26.sh b/ofc26.sh deleted file mode 100644 index e6926b64e..000000000 --- a/ofc26.sh +++ /dev/null @@ -1,229 +0,0 @@ -#!/bin/bash -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# ----- TeraFlowSDN ------------------------------------------------------------ - -# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. -export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" - -# Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp opticalcontroller service nbi webui" - -# Uncomment to activate Monitoring (old) -#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" - -# Uncomment to activate Monitoring Framework (new) -export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation" - -# Uncomment to activate QoS Profiles -#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile" - -# Uncomment to activate BGP-LS Speaker -#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" - -# Uncomment to activate Optical Controller -# To manage optical connections, "service" requires "opticalcontroller" to be deployed -# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the -# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. -#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then -# BEFORE="${TFS_COMPONENTS% service*}" -# AFTER="${TFS_COMPONENTS#* service}" -# export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" -#fi - -# Uncomment to activate ZTP -#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" - -# Uncomment to activate Policy Manager -#export TFS_COMPONENTS="${TFS_COMPONENTS} policy" - -# Uncomment to activate Optical CyberSecurity -#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" - -# Uncomment to activate L3 CyberSecurity -#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector" - -# Uncomment to activate TE -#export TFS_COMPONENTS="${TFS_COMPONENTS} te" - -# Uncomment to activate Forecaster -#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" - -# Uncomment to activate E2E Orchestrator -#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" - -# Uncomment to activate VNT Manager -#export TFS_COMPONENTS="${TFS_COMPONENTS} vnt_manager" - -# Uncomment to activate OSM Client -#export TFS_COMPONENTS="${TFS_COMPONENTS} osm_client" - -# Uncomment to activate DLT and Interdomain -#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" -#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then -# export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" -# export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" -# export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" -#fi - -# Uncomment to activate QKD App -# To manage QKD Apps, "service" requires "qkd_app" to be deployed -# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the -# "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it. -#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then -# BEFORE="${TFS_COMPONENTS% service*}" -# AFTER="${TFS_COMPONENTS#* service}" -# export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}" -#fi - -# Uncomment to activate SIMAP Connector -#export TFS_COMPONENTS="${TFS_COMPONENTS} simap_connector" - -# Uncomment to activate Load Generator -#export TFS_COMPONENTS="${TFS_COMPONENTS} load_generator" - - -# Set the tag you want to use for your images. -export TFS_IMAGE_TAG="dev" - -# Set the name of the Kubernetes namespace to deploy TFS to. -export TFS_K8S_NAMESPACE="tfs" - -# Set additional manifest files to be applied after the deployment -export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" - -# Uncomment to monitor performance of components -#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" - -# Uncomment when deploying Optical CyberSecurity -#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" - -# Set the new Grafana admin password -export TFS_GRAFANA_PASSWORD="admin123+" - -# Disable skip-build flag to rebuild the Docker images. -export TFS_SKIP_BUILD="" - - -# ----- CockroachDB ------------------------------------------------------------ - -# Set the namespace where CockroackDB will be deployed. -export CRDB_NAMESPACE="crdb" - -# Set the external port CockroackDB Postgre SQL interface will be exposed to. -export CRDB_EXT_PORT_SQL="26257" - -# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to. -export CRDB_EXT_PORT_HTTP="8081" - -# Set the database username to be used by Context. -export CRDB_USERNAME="tfs" - -# Set the database user's password to be used by Context. -export CRDB_PASSWORD="tfs123" - -# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. -# See ./deploy/all.sh or ./deploy/crdb.sh for additional details -export CRDB_DEPLOY_MODE="single" - -# Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="YES" - -# Disable flag for re-deploying CockroachDB from scratch. -export CRDB_REDEPLOY="" - - -# ----- NATS ------------------------------------------------------------------- - -# Set the namespace where NATS will be deployed. -export NATS_NAMESPACE="nats" - -# Set the external port NATS Client interface will be exposed to. -export NATS_EXT_PORT_CLIENT="4222" - -# Set the external port NATS HTTP Mgmt GUI interface will be exposed to. -export NATS_EXT_PORT_HTTP="8222" - -# Set NATS installation mode to 'single'. This option is convenient for development and testing. -# See ./deploy/all.sh or ./deploy/nats.sh for additional details -export NATS_DEPLOY_MODE="single" - -# Disable flag for re-deploying NATS from scratch. -export NATS_REDEPLOY="" - - -# ----- Apache Kafka ----------------------------------------------------------- - -# Set the namespace where Apache Kafka will be deployed. -export KFK_NAMESPACE="kafka" - -# Set the port Apache Kafka server will be exposed to. -export KFK_EXT_PORT_CLIENT="9092" - -# Set Kafka installation mode to 'single'. This option is convenient for development and testing. -# See ./deploy/all.sh or ./deploy/kafka.sh for additional details -export KFK_DEPLOY_MODE="single" - -# Disable flag for re-deploying Kafka from scratch. -export KFK_REDEPLOY="" - - -# ----- QuestDB ---------------------------------------------------------------- - -# Set the namespace where QuestDB will be deployed. -export QDB_NAMESPACE="qdb" - -# Set the external port QuestDB Postgre SQL interface will be exposed to. -export QDB_EXT_PORT_SQL="8812" - -# Set the external port QuestDB Influx Line Protocol interface will be exposed to. -export QDB_EXT_PORT_ILP="9009" - -# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to. -export QDB_EXT_PORT_HTTP="9000" - -# Set the database username to be used for QuestDB. -export QDB_USERNAME="admin" - -# Set the database user's password to be used for QuestDB. -export QDB_PASSWORD="quest" - -# Set the table name to be used by Monitoring for KPIs. -export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" - -# Set the table name to be used by Slice for plotting groups. -export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" - -# Disable flag for dropping tables if they exist. -export QDB_DROP_TABLES_IF_EXIST="" - -# Disable flag for re-deploying QuestDB from scratch. -export QDB_REDEPLOY="" - - -# ----- K8s Observability ------------------------------------------------------ - -# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to. -export PROM_EXT_PORT_HTTP="9090" - -# Set the external port Grafana HTTP Dashboards will be exposed to. -export GRAF_EXT_PORT_HTTP="3000" - - -# ----- Telemetry Config ------------------------------------------------------ - -# Define a Load Balancer IP for Telemetry Collector components -export LOAD_BALANCER_IP="192.168.5.250" # <-- Change this to match your network diff --git a/src/tests/ofc26_flexscale/my_deploy_ofc26.sh b/src/tests/ofc26_flexscale/deploy_specs.sh similarity index 100% rename from src/tests/ofc26_flexscale/my_deploy_ofc26.sh rename to src/tests/ofc26_flexscale/deploy_specs.sh -- GitLab From 8387d16f46db041f71ac801689292f722a06c533 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:22:50 +0000 Subject: [PATCH 359/371] Kafka deployment: - Fix kafka service name --- src/common/tools/kafka/Variables.py | 2 +- src/policy/src/main/resources/application.yml | 2 +- src/policy/target/kubernetes/kubernetes.yml | 2 +- src/tests/ofc26_flexscale/run_ofc26_test.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index dd3d9e07b..5a8e68215 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -19,7 +19,7 @@ from kafka.errors import TopicAlreadyExistsError from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-public.{:s}.svc.cluster.local:{:s}' +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' KAFKA_TOPIC_NUM_PARTITIONS = 1 KAFKA_TOPIC_REPLICATION_FACTOR = 1 diff --git a/src/policy/src/main/resources/application.yml b/src/policy/src/main/resources/application.yml index 7292f222a..ccfbffdf5 100644 --- a/src/policy/src/main/resources/application.yml +++ b/src/policy/src/main/resources/application.yml @@ -63,7 +63,7 @@ quarkus: context-service-host: "contextservice" monitoring-service-host: "monitoringservice" service-service-host: "serviceservice" - kafka-broker-host: "kafka-public.kafka.svc.cluster.local" + kafka-broker-host: "kafka-service.kafka.svc.cluster.local" resources: requests: cpu: 50m diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index a997d8582..2af0c3587 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -80,7 +80,7 @@ spec: - name: MONITORING_SERVICE_HOST value: monitoringservice - name: KAFKA_BROKER_HOST - value: kafka-public.kafka.svc.cluster.local + value: kafka-service.kafka.svc.cluster.local - name: CONTEXT_SERVICE_HOST value: contextservice image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh index 9d29118ce..b437cc90f 100755 --- a/src/tests/ofc26_flexscale/run_ofc26_test.sh +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -23,7 +23,7 @@ export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt #added for kafka exposure export KFK_SERVER_ADDRESS='127.0.0.1:9094' -kubectl port-forward -n kafka service/kafka-public 9094:9094 > /dev/null 2>&1 & +kubectl port-forward -n kafka service/kafka-service 9094:9094 > /dev/null 2>&1 & KAFKA_PF_PID=$! # Function to cleanup port-forward on exit -- GitLab From 81d8c3a912f6443c1927989ac1b95739597eed87 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:29:50 +0000 Subject: [PATCH 360/371] Kafka deployment: - Fix kafka service port --- manifests/kafka/single-node.yaml | 2 +- scripts/run_tests_locally-analytics-backend.sh | 4 ++-- scripts/run_tests_locally-analytics-frontend.sh | 2 +- scripts/run_tests_locally-telemetry-gnmi.sh | 2 +- .../tests/gnmi_oc/test_integration_GnmiOCcollector.py | 2 +- src/tests/ofc26_flexscale/run_ofc26_test.sh | 6 +++--- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifests/kafka/single-node.yaml b/manifests/kafka/single-node.yaml index 6eb9bd03c..af0d67216 100644 --- a/manifests/kafka/single-node.yaml +++ b/manifests/kafka/single-node.yaml @@ -83,7 +83,7 @@ spec: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT" - name: KAFKA_CFG_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" + value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9092" # local clients use kubectl port-forward ... 9092:external - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES value: "CONTROLLER" - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS diff --git a/scripts/run_tests_locally-analytics-backend.sh b/scripts/run_tests_locally-analytics-backend.sh index 44e26bacb..fae768939 100755 --- a/scripts/run_tests_locally-analytics-backend.sh +++ b/scripts/run_tests_locally-analytics-backend.sh @@ -19,7 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require" @@ -28,4 +28,4 @@ export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytic # analytics/backend/tests/test_backend.py python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - analytics/backend/tests/test_backend.py::test_start_analytics_backend_for_mgon_agent \ No newline at end of file + analytics/backend/tests/test_backend.py::test_start_analytics_backend_for_mgon_agent diff --git a/scripts/run_tests_locally-analytics-frontend.sh b/scripts/run_tests_locally-analytics-frontend.sh index 4d999f625..4a90ec060 100755 --- a/scripts/run_tests_locally-analytics-frontend.sh +++ b/scripts/run_tests_locally-analytics-frontend.sh @@ -19,7 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require" diff --git a/scripts/run_tests_locally-telemetry-gnmi.sh b/scripts/run_tests_locally-telemetry-gnmi.sh index 965141e56..6825e42a5 100755 --- a/scripts/run_tests_locally-telemetry-gnmi.sh +++ b/scripts/run_tests_locally-telemetry-gnmi.sh @@ -17,7 +17,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' # This is unit test (should be tested with container-lab running) python3 -m pytest --log-level=info --log-cli-level=info --verbose \ diff --git a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py index 6543c8743..d200fc0b7 100644 --- a/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py +++ b/src/telemetry/backend/tests/gnmi_oc/test_integration_GnmiOCcollector.py @@ -164,7 +164,7 @@ def telemetry_backend_service(): # + Uncomment test_add_to_topology() in helper methods section to add a device. # - A KPI Descriptor must be added in KPI DB with correct device_id. # + Uncomment test_SetKpiDescriptor() in helper methods section to add a KPI Descriptor. - # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-service 9094:9094'. + # - Kafka should be exposed externally 'kubectl port-forward -n kafka service/kafka-service 9092:9092'. def test_helper_get_collector_by_kpi_id(kpi_manager_client, context_client): LOGGER.info("Testing get_collector_by_kpi_id...") diff --git a/src/tests/ofc26_flexscale/run_ofc26_test.sh b/src/tests/ofc26_flexscale/run_ofc26_test.sh index b437cc90f..2644320f5 100755 --- a/src/tests/ofc26_flexscale/run_ofc26_test.sh +++ b/src/tests/ofc26_flexscale/run_ofc26_test.sh @@ -21,9 +21,9 @@ CRDB_SQL_ADDRESS=$(kubectl get service --namespace ${CRDB_NAMESPACE} cockroachdb export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" #added for kafka exposure -export KFK_SERVER_ADDRESS='127.0.0.1:9094' +export KFK_SERVER_ADDRESS='127.0.0.1:9092' -kubectl port-forward -n kafka service/kafka-service 9094:9094 > /dev/null 2>&1 & +kubectl port-forward -n kafka service/kafka-service 9092:9092 > /dev/null 2>&1 & KAFKA_PF_PID=$! # Function to cleanup port-forward on exit @@ -44,4 +44,4 @@ echo "Telemetry Frontend Service IP: ${IP_TELE}" python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py \ No newline at end of file + tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py -- GitLab From b0c99012a3dd8e9944bcfb3afd3b7d2e22c88173 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:39:09 +0000 Subject: [PATCH 361/371] Pre-merge code cleanup --- .../service/task_scheduler/TaskScheduler.py | 223 +++++++++--------- 1 file changed, 106 insertions(+), 117 deletions(-) diff --git a/src/service/service/task_scheduler/TaskScheduler.py b/src/service/service/task_scheduler/TaskScheduler.py index c9eaff31c..a9a1a20e7 100644 --- a/src/service/service/task_scheduler/TaskScheduler.py +++ b/src/service/service/task_scheduler/TaskScheduler.py @@ -307,9 +307,8 @@ class TasksScheduler: else : has_optical_band = True return (has_media_channel, has_optical_band) - - - + + def compose_from_opticalcontroller_reply( self, pathcomp_reply : PathCompReply, is_delete : bool = False ) -> None: @@ -322,50 +321,48 @@ class TasksScheduler: has_optical_band = None for service in pathcomp_reply.services: + connections = self._context_client.ListConnections(service.service_id) + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=service.service_id + ) + + include_service( + service.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._add_service_to_executor_cache(service) - connections = self._context_client.ListConnections(service.service_id) - has_media_channel, has_optical_band = self.check_service_for_media_channel( - connections=connections, item=service.service_id - ) - - - include_service(service.service_id , has_media_channel=has_media_channel, has_optical_band=has_optical_band) - self._add_service_to_executor_cache(service) - - for connection in connections.connections: - self._add_connection_to_executor_cache(connection) - - + for connection in connections.connections: + self._add_connection_to_executor_cache(connection) for connection in pathcomp_reply.connections: - - connection_key = include_connection( - connection.connection_id, connection.service_id, has_media_channel=has_media_channel, - has_optical_band=has_optical_band - ) - self._add_connection_to_executor_cache(connection) + connection_key = include_connection( + connection.connection_id, connection.service_id, + has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._add_connection_to_executor_cache(connection) - self._executor.get_service(connection.service_id) - for sub_service_id in connection.sub_service_ids: - _,service_key_done = include_service( - sub_service_id, has_media_channel=has_media_channel, - has_optical_band=has_optical_band - ) - self._executor.get_service(sub_service_id) - self._dag.add(connection_key, service_key_done) + self._executor.get_service(connection.service_id) + for sub_service_id in connection.sub_service_ids: + _,service_key_done = include_service( + sub_service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) + self._executor.get_service(sub_service_id) + self._dag.add(connection_key, service_key_done) t1 = time.time() LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) - - - + + def compose_from_service_expansion( self, service :Service, ) -> None: t0 = time.time() include_service = self._optical_service_create include_connection = self._optical_connection_configure - + logging.debug(f"after setting the config {service}") #pending_items_to_explore.put(service) has_media_channel = None @@ -373,17 +370,16 @@ class TasksScheduler: if service is None : raise NotFoundException('Service', service, extra_details=[ 'service not found ' ]) - - - + connections = self._context_client.ListConnections(service.service_id) has_media_channel, has_optical_band = self.check_service_for_media_channel( connections=connections, item=service.service_id ) - - _,service_key_done= include_service(service.service_id , - has_media_channel=has_media_channel, - has_optical_band=has_optical_band) + + _,service_key_done= include_service( + service.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) # self._add_service_to_executor_cache(service) service_updating_key = self._add_task_if_not_exists(Task_ServiceSetStatus( self._executor, service.service_id, ServiceStatusEnum.SERVICESTATUS_UPDATING @@ -391,7 +387,8 @@ class TasksScheduler: self._add_service_to_executor_cache(service) for connection in connections.connections: connection_key = include_connection( - connection.connection_id, connection.service_id, has_media_channel=has_media_channel, + connection.connection_id, connection.service_id, + has_media_channel=has_media_channel, has_optical_band=has_optical_band ) self._add_connection_to_executor_cache(connection) @@ -399,7 +396,9 @@ class TasksScheduler: t1 = time.time() LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) - def compose_from_optical_service(self, service : Service, params:dict, is_delete : bool = False) -> None: + def compose_from_optical_service( + self, service : Service, params:dict, is_delete : bool = False + ) -> None: t0 = time.time() include_service = self._optical_service_remove if is_delete else self._service_create include_connection = self._optical_connection_deconfigure if is_delete else self._connection_configure @@ -408,127 +407,118 @@ class TasksScheduler: explored_items = set() pending_items_to_explore = queue.Queue() pending_items_to_explore.put(service) - has_media_channel=None - has_optical_band=None - reply=None - code=0 - reply_not_allowed="DELETE_NOT_ALLOWED" + has_media_channel = None + has_optical_band = None + reply = None + code = 0 + reply_not_allowed = "DELETE_NOT_ALLOWED" while not pending_items_to_explore.empty(): try: item = pending_items_to_explore.get(block=False) - except queue.Empty: break - + if isinstance(item, Service): - str_item_key = grpc_message_to_json_string(item.service_id) if str_item_key in explored_items: continue connections = self._context_client.ListConnections(item.service_id) - has_media_channel,has_optical_band=self.check_service_for_media_channel(connections=connections,item=item.service_id) - oc_type = 1 + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=item.service_id + ) + oc_type = 1 if len(service.service_config.config_rules) > 0: for constraint in service.service_constraints: if "type" in constraint.custom.constraint_type: oc_type = OpticalServiceType(str(constraint.custom.constraint_value)) - if oc_type == 2 : - reply,code = delete_lightpath( - params['src'] - , params ['dst'] - , params['bitrate'] - , flow_id= params['flow_id'] - ) - else : - reply,code = DelFlexLightpath( - params['src'] - , params ['dst'] - , params['bitrate'] - , params['ob_id'] - , flow_id=params['flow_id'] - ) + if oc_type == 2: + reply, code = delete_lightpath( + params['src'], params ['dst'], params['bitrate'], + flow_id= params['flow_id'] + ) + else: + reply, code = DelFlexLightpath( + params['src'], params ['dst'], params['bitrate'], + params['ob_id'], flow_id=params['flow_id'] + ) if code == 400 and reply_not_allowed in reply : MSG = 'Deleteion for the service is not Allowed , Served Lightpaths is not empty' raise Exception(MSG) - include_service(item.service_id,has_media_channel=has_media_channel,has_optical_band=has_optical_band) + include_service( + item.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._add_service_to_executor_cache(item) - - + for connection in connections.connections: - self._add_connection_to_executor_cache(connection) - pending_items_to_explore.put(connection) + self._add_connection_to_executor_cache(connection) + pending_items_to_explore.put(connection) explored_items.add(str_item_key) - elif isinstance(item, ServiceId): - - if code == 400 and reply_not_allowed in reply:break - + if code == 400 and reply_not_allowed in reply: break + str_item_key = grpc_message_to_json_string(item) if str_item_key in explored_items: continue connections = self._context_client.ListConnections(item) - has_media_channel,has_optical_band=self.check_service_for_media_channel(connections=connections,item=item) + has_media_channel, has_optical_band = self.check_service_for_media_channel( + connections=connections, item=item + ) + + include_service( + item, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) - - include_service(item,has_media_channel=has_media_channel,has_optical_band=has_optical_band) - - self._executor.get_service(item) - + for connection in connections.connections: - self._add_connection_to_executor_cache(connection) pending_items_to_explore.put(connection) - + explored_items.add(str_item_key) elif isinstance(item, Connection): if code == 400 and reply_not_allowed in reply:break str_item_key = grpc_message_to_json_string(item.connection_id) if str_item_key in explored_items: continue - - - connection_key = include_connection( item.connection_id - , item.service_id - , has_media_channel=has_media_channel - , has_optical_band=has_optical_band ) + + connection_key = include_connection( + item.connection_id, item.service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._add_connection_to_executor_cache(connection) - + if include_service_config is not None : - connections_list = ConnectionList() - connections_list.connections.append(item) - - is_media_channel,_=self.check_service_for_media_channel(connections=connections_list,item=service) - - if has_optical_band and is_media_channel: - include_service_config(item.connection_id - , item.service_id ) - + connections_list = ConnectionList() + connections_list.connections.append(item) + + is_media_channel,_=self.check_service_for_media_channel( + connections=connections_list,item=service + ) + + if has_optical_band and is_media_channel: + include_service_config(item.connection_id, item.service_id) self._executor.get_service(item.service_id) pending_items_to_explore.put(item.service_id) - - + for sub_service_id in item.sub_service_ids: - _,service_key_done = include_service(sub_service_id - ,has_media_channel=has_media_channel - ,has_optical_band=has_optical_band) + _,service_key_done = include_service( + sub_service_id, has_media_channel=has_media_channel, + has_optical_band=has_optical_band + ) self._executor.get_service(sub_service_id) self._dag.add(service_key_done, connection_key) pending_items_to_explore.put(sub_service_id) - - explored_items.add(str_item_key) - - else: MSG = 'Unsupported item {:s}({:s})' raise Exception(MSG.format(type(item).__name__, grpc_message_to_json_string(item))) - - t1 = time.time() - LOGGER.debug('[compose_from_service] elapsed_time: {:f} sec'.format(t1-t0)) + t1 = time.time() + LOGGER.debug('[compose_from_optical_service] elapsed_time: {:f} sec'.format(t1-t0)) def compose_from_service(self, service : Service, is_delete : bool = False) -> None: @@ -641,13 +631,12 @@ class TasksScheduler: self._dag.add(service_active_key, new_connection_configure_key) t1 = time.time() - LOGGER.debug('[RRERRSF] elapsed_time: {:f} sec'.format(t1-t0)) + LOGGER.debug('[compose_optical_service_update] elapsed_time: {:f} sec'.format(t1-t0)) def compose_optical_service_update1( self, service : Service, old_connection : Connection, new_connection : Connection ) -> None: - LOGGER.debug('[ttttttttttt] elapsed_time inside update1') t0 = time.time() self._add_service_to_executor_cache(service) @@ -686,7 +675,7 @@ class TasksScheduler: self._dag.add(service_active_key, new_connection_configure_key) t1 = time.time() - LOGGER.debug('[RRERRSF] elapsed_time: {:f} sec'.format(t1-t0)) + LOGGER.debug('[compose_optical_service_update1] elapsed_time: {:f} sec'.format(t1-t0)) def compose_service_connection_update( @@ -743,7 +732,7 @@ class TasksScheduler: task = self._tasks.get(task_key) succeeded = True if dry_run else task.execute() results.append(succeeded) - LOGGER.debug('[execute_allRRRR] finished task {:s} ; succeeded={:s}'.format(str_task_name, str(succeeded))) + LOGGER.debug('[execute_all] finished task {:s} ; succeeded={:s}'.format(str_task_name, str(succeeded))) LOGGER.debug('[execute_all] results={:s}'.format(str(results))) return zip(ordered_task_keys, results) -- GitLab From 354e02de1f13a762139a614f8c12da95859aad2b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:41:49 +0000 Subject: [PATCH 362/371] Kafka deployment: - Fix kafka service port --- manifests/kafka/single-node.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/kafka/single-node.yaml b/manifests/kafka/single-node.yaml index af0d67216..ead717849 100644 --- a/manifests/kafka/single-node.yaml +++ b/manifests/kafka/single-node.yaml @@ -83,7 +83,7 @@ spec: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT" - name: KAFKA_CFG_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9092" # local clients use kubectl port-forward ... 9092:external + value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" # local clients use kubectl port-forward ... 9092:external - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES value: "CONTROLLER" - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS -- GitLab From 6b70c5f9edca49721e310a94e71170538bbdc577 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:41:56 +0000 Subject: [PATCH 363/371] Pre-merge code cleanup --- src/analytics/backend/service/Streamer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/analytics/backend/service/Streamer.py b/src/analytics/backend/service/Streamer.py index ece1107cf..a8c9bffc6 100644 --- a/src/analytics/backend/service/Streamer.py +++ b/src/analytics/backend/service/Streamer.py @@ -25,13 +25,14 @@ from analytics.backend.service.AnalyzerHelper import AnalyzerHelper logger = logging.getLogger(__name__) class DaskStreamer(threading.Thread): - def __init__(self, key, input_kpis, output_kpis, thresholds, + def __init__( + self, key, input_kpis, output_kpis, thresholds, batch_size = 5, batch_duration = None, window_size = None, cluster_instance = None, producer_instance = AnalyzerHelper.initialize_kafka_producer() - ) -> None: + ) -> None: super().__init__() self.key = key self.input_kpis = input_kpis -- GitLab From a6a914c9b7675563bc97796c39d01b27347bd223 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:54:16 +0000 Subject: [PATCH 364/371] Automation component - Plugins: - Added pllugin for optical connections - Fixed filter fields --- .../zsm_handler_api/ZSMFilterFields.py | 10 +- .../service/zsm_handlers/OpticalZSMPlugin.py | 104 ++++++++++++++++++ .../service/zsm_handlers/P4INTZSMPlugin.py | 6 +- .../service/zsm_handlers/__init__.py | 7 ++ 4 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 src/automation/service/zsm_handlers/OpticalZSMPlugin.py diff --git a/src/automation/service/zsm_handler_api/ZSMFilterFields.py b/src/automation/service/zsm_handler_api/ZSMFilterFields.py index ab91e1bc5..e6c2fb844 100644 --- a/src/automation/service/zsm_handler_api/ZSMFilterFields.py +++ b/src/automation/service/zsm_handler_api/ZSMFilterFields.py @@ -16,19 +16,21 @@ from enum import Enum from common.proto.context_pb2 import ServiceTypeEnum class ZSMFilterFieldEnum(Enum): - TARGET_SERVICE_TYPE = 'target_service_type' + TARGET_SERVICE_TYPE = 'target_service_type' TELEMETRY_SERVICE_TYPE = 'telemetry_service_type' TARGET_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY + ServiceTypeEnum.SERVICETYPE_L2NM, + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, } TELEMETRY_SERVICE_TYPE_VALUES = { - ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY + ServiceTypeEnum.SERVICETYPE_INT, + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, } # Maps filter fields to allowed values per Filter field. # If no restriction (free text) None is specified ZSM_FILTER_FIELD_ALLOWED_VALUES = { - ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value : TARGET_SERVICE_TYPE_VALUES, + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE.value : TARGET_SERVICE_TYPE_VALUES, ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE.value : TELEMETRY_SERVICE_TYPE_VALUES, } diff --git a/src/automation/service/zsm_handlers/OpticalZSMPlugin.py b/src/automation/service/zsm_handlers/OpticalZSMPlugin.py new file mode 100644 index 000000000..6baacfde6 --- /dev/null +++ b/src/automation/service/zsm_handlers/OpticalZSMPlugin.py @@ -0,0 +1,104 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import grpc, logging +from uuid import uuid4 +from common.proto.analytics_frontend_pb2 import AnalyzerId +from common.proto.policy_pb2 import PolicyRuleState +from common.proto.automation_pb2 import ZSMCreateRequest, ZSMService + +from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendClient +from automation.client.PolicyClient import PolicyClient +from context.client.ContextClient import ContextClient +from automation.service.zsm_handler_api._ZSMHandler import _ZSMHandler + + +LOGGER = logging.getLogger(__name__) + + +class OpticalZSMPlugin(_ZSMHandler): + def __init__(self): + LOGGER.info('Init OpticalZSMPlugin') + + def zsmCreate(self, request : ZSMCreateRequest, context : grpc.ServicerContext): # type: ignore + context_client = ContextClient() + policy_client = PolicyClient() + analytics_frontend_client = AnalyticsFrontendClient() + + # Verify the input target service ID + try: + target_service_id = context_client.GetService(request.target_service_id) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get target service:\n{str(target_service_id)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + return self._zsm_create_response_empty() + + # Verify the input telemetry service ID + try: + telemetry_service_id = context_client.GetService(request.telemetry_service_id) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to get telemetry service:\n{str(telemetry_service_id)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + return self._zsm_create_response_empty() + + # Start an analyzer + try: + analyzer_id: AnalyzerId = analytics_frontend_client.StartAnalyzer(request.analyzer) # type: ignore + LOGGER.info('Analyzer_id:\n{:s}'.format(str(analyzer_id))) + except grpc.RpcError as ex: + LOGGER.exception(f'Unable to start Analyzer:\n{str(request.analyzer)}') + if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + context_client.close() + analytics_frontend_client.close() + return self._zsm_create_response_empty() + + # Create a policy + try: + LOGGER.info(f'Policy:\n{str(request.policy)}') + policy_rule_state: PolicyRuleState = policy_client.PolicyAddService(request.policy) # type: ignore + LOGGER.info(f'Policy rule state:\n{policy_rule_state}') + except Exception as ex: + LOGGER.exception(f'Unable to create policy:\n{str(request.policy)}') + LOGGER.exception(ex.code()) + # ToDo: Investigate why PolicyAddService throws exception + # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member + # context_client.close() + # policy_client.close() + # return self._zsm_create_response_empty() + + context_client.close() + analytics_frontend_client.close() + policy_client.close() + return self._zsm_create_response(request) + + def zsmDelete(self): + LOGGER.info('zsmDelete method') + + def zsmGetById(self): + LOGGER.info('zsmGetById method') + + def zsmGetByService(self): + LOGGER.info('zsmGetByService method') + + def _zsm_create_response(self, request): + response = ZSMService() + automation_id = str(uuid4()) + response.zsmServiceId.uuid.uuid = automation_id + response.serviceId.service_uuid.uuid = request.target_service_id.service_uuid.uuid + return response + + def _zsm_create_response_empty(self): + return ZSMService() diff --git a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py index f3ea519a6..74694a376 100644 --- a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py +++ b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py @@ -74,9 +74,9 @@ class P4INTZSMPlugin(_ZSMHandler): LOGGER.exception(ex.code()) # ToDo: Investigate why PolicyAddService throws exception # if ex.code() != grpc.StatusCode.NOT_FOUND: raise # pylint: disable=no-member - # context_client.close() - # policy_client.close() - # return self._zsm_create_response_empty() + context_client.close() + policy_client.close() + return self._zsm_create_response_empty() context_client.close() analytics_frontend_client.close() diff --git a/src/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py index abb5588f8..79e703ba8 100644 --- a/src/automation/service/zsm_handlers/__init__.py +++ b/src/automation/service/zsm_handlers/__init__.py @@ -15,9 +15,16 @@ from common.proto.context_pb2 import ServiceTypeEnum from ..zsm_handler_api.ZSMFilterFields import ZSMFilterFieldEnum from automation.service.zsm_handlers.P4INTZSMPlugin import P4INTZSMPlugin +from automation.service.zsm_handlers.OpticalZSMPlugin import OpticalZSMPlugin ZSM_SERVICE_HANDLERS = [ (P4INTZSMPlugin, [ + { + ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_L2NM, + ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_INT, + } + ]), + (OpticalZSMPlugin, [ { ZSMFilterFieldEnum.TARGET_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, ZSMFilterFieldEnum.TELEMETRY_SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, -- GitLab From d373581daf283f3ace29a27a7887ed7f7c7b9e16 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 14:54:59 +0000 Subject: [PATCH 365/371] Pre-merge code cleanup --- manifests/kafka/single-node.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/kafka/single-node.yaml b/manifests/kafka/single-node.yaml index ead717849..6eb9bd03c 100644 --- a/manifests/kafka/single-node.yaml +++ b/manifests/kafka/single-node.yaml @@ -83,7 +83,7 @@ spec: - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP value: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT" - name: KAFKA_CFG_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" # local clients use kubectl port-forward ... 9092:external + value: "PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,EXTERNAL://localhost:9094" - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES value: "CONTROLLER" - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS -- GitLab From 89d60b34f14190a71622bfadf68e2cf3c6e4a46e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 15:03:12 +0000 Subject: [PATCH 366/371] Pre-merge code cleanup --- .../service/ServiceServiceServicerImpl.py | 31 ++----------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py index 03bd27fc3..c71123573 100644 --- a/src/service/service/ServiceServiceServicerImpl.py +++ b/src/service/service/ServiceServiceServicerImpl.py @@ -343,9 +343,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): reply_txt = add_lightpath(src, dst, bitrate, bidir) else: reply_txt = add_flex_lightpath(src, dst, bitrate, bidir, preferred, ob_band, dj_optical_band_id) - #logging.info(f"TEEEEEEEEEEEEEEST {oc_type}") - #logging.info(f"POLIMI {reply_txt}") - if reply_txt == None: + if reply_txt is None: return service_with_uuids.service_id reply_json = json.loads(reply_txt) LOGGER.debug('[optical] reply_json[{:s}]={:s}'.format(str(type(reply_json)), str(reply_json))) @@ -596,11 +594,9 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): updated_service_with_uuids = get_service_by_id( context_client, updated_service_id_with_uuids, rw_copy=True, include_config_rules=True, include_constraints=True, include_endpoint_ids=True) - LOGGER.info('WYY:{}'.format(updated_service_with_uuids)) # Get active connection connections = context_client.ListConnections(updated_service_id_with_uuids) - LOGGER.info('WWWW:{}'.format(connections)) if len(connections.connections) == 0: MSG = 'Service({:s}) has no connections' str_service_id = grpc_message_to_json_string(updated_service_id_with_uuids) @@ -624,7 +620,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): raise NotImplementedException('service-connection-with-subservices', extra_details=str_extra_details) if updated_service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY: - LOGGER.info('WWWW:{}'.format("is optical")) context_id_x = json_context_id(DEFAULT_CONTEXT_NAME) topology_id_x = json_topology_id( DEFAULT_TOPOLOGY_NAME, context_id_x) @@ -632,8 +627,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): TopologyId(**topology_id_x)) str_old_connection = connection_to_string(old_connection) - LOGGER.info('WWW old_connection={}'.format(grpc_message_to_json_string(old_connection))) - LOGGER.info('WWW0={}'.format(updated_service_with_uuids.service_config.config_rules)) if len(updated_service_with_uuids.service_config.config_rules)> 0: #if len(updated_service.service_config.config_rules) > 0: c_rules_dict = json.loads( @@ -641,7 +634,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): #c_rules_dict = json.loads( # updated_service.service_config.config_rules[0].custom.resource_value) - LOGGER.info('WWW1:{}'.format(c_rules_dict)) flow_id=None #if "ob_id" in c_rules_dict: # ob_id = c_rules_dict["ob_id"] @@ -668,15 +660,12 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: str_candidate_new_connection = connection_to_string(new_connection) - LOGGER.info('QQQQ_old:{}'.format(str_old_connection)) - LOGGER.info('QQQQ_new:{}'.format(str_candidate_new_connection)) # Change UUID of new connection to prevent collisions tmp_connection = Connection() tmp_connection.CopyFrom(new_connection) tmp_connection.connection_id.connection_uuid.uuid = str(uuid.uuid4()) new_connection = tmp_connection service_new = optical_reply.services[0] - LOGGER.info('QQQQ:{}'.format(service_new)) # Feed TaskScheduler with the service to update, the old connection to # deconfigure and the new connection to configure. It will produce a # schedule of tasks (an ordered list of tasks to be executed) to @@ -689,7 +678,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): tasks_scheduler.execute_all() else: if ("ob_id" in c_rules_dict) and ("low-freq" in c_rules_dict): - LOGGER.info('PDP: it is an optical band') ob_id = c_rules_dict["ob_id"] band_txt = get_optical_band(ob_id) optical_band = json.loads(band_txt) @@ -697,14 +685,12 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): optical_band = None obs = context_client.GetOpticalBand() for obz in obs: - LOGGER.info(f"PDP: {obz.opticalband_id}") if obz.opticalband_id == ob_id: optical_band = obz if optical_band is not None: ''' #optical_band = context_client.SelectOpticalBand(ob_id) served_flows = optical_band.get('served_lightpaths') - LOGGER.info(f'PDP: served flows {served_flows}') #context_id_x = json_context_id(DEFAULT_CONTEXT_NAME) response = context_client.ListServices(ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))) #response = context_client.ListServices(context_id_x) @@ -720,7 +706,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): ) if ("flow_id" in c_rules_dict): flow_id = c_rules_dict["flow_id"] - LOGGER.info(f"PDP checking {flow_id} and {served_flows}") + LOGGER.info(f"Checking {flow_id} and {served_flows}") if flow_id in served_flows: ########## updated_service : Optional[Service] = get_service_by_id( @@ -733,27 +719,17 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): updated_service_with_uuids = get_service_by_id( context_client, updated_service_id_with_uuids, rw_copy=True, include_config_rules=True, include_constraints=True, include_endpoint_ids=True) - LOGGER.info('WYY:{}'.format(updated_service_with_uuids)) # Get active connection connections = context_client.ListConnections(updated_service_id_with_uuids) - LOGGER.info('WWWW:{}'.format(connections)) old_connection = connections.connections[0] - ''' - for service_idc in service_ids: - service_d = context_client.GetService(service_idc) - c_rules_dict = json.loads( - service_d.service_config.config_rules[0].custom.resource_value) - ''' - LOGGER.info('PDP:{}'.format(c_rules_dict)) flow_id = c_rules_dict["flow_id"] reply_txt = "" # to get the reply form the optical module #multi-granular reply_txt = reconfig_flex_lightpath(flow_id) reply_json = json.loads(reply_txt) - LOGGER.info('[PDP] reply_json[{:s}]={:s}'.format(str(type(reply_json)), str(reply_json))) devices = topology_details.devices context_uuid_x = topology_details.topology_id.context_id.context_uuid.uuid topology_uuid_x = topology_details.topology_id.topology_uuid.uuid @@ -768,15 +744,12 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: str_candidate_new_connection = connection_to_string(new_connection) - LOGGER.info('QQQQ_old:{}'.format(str_old_connection)) - LOGGER.info('QQQQ_new:{}'.format(str_candidate_new_connection)) # Change UUID of new connection to prevent collisions tmp_connection = Connection() tmp_connection.CopyFrom(new_connection) tmp_connection.connection_id.connection_uuid.uuid = str(uuid.uuid4()) new_connection = tmp_connection service_new = optical_reply.services[0] - LOGGER.info('QQQQ:{}'.format(service_new)) # Feed TaskScheduler with the service to update, the old connection to -- GitLab From e4e1401d4cd7dd2fa531456cad607aa847157de8 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 15:05:39 +0000 Subject: [PATCH 367/371] Pre-merge code cleanup --- src/service/service/monitoring.py | 148 ------------------------------ 1 file changed, 148 deletions(-) delete mode 100644 src/service/service/monitoring.py diff --git a/src/service/service/monitoring.py b/src/service/service/monitoring.py deleted file mode 100644 index dad72f00a..000000000 --- a/src/service/service/monitoring.py +++ /dev/null @@ -1,148 +0,0 @@ -import uuid -from common.proto import kpi_manager_pb2 -from common.proto.kpi_sample_types_pb2 import KpiSampleType -from kpi_manager.client.KpiManagerClient import KpiManagerClient -import logging -import pytest -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList - -import uuid -from common.proto import kpi_manager_pb2 -from common.proto.kpi_sample_types_pb2 import KpiSampleType -from src.telemetry.backend.service.collectors.gnmi_oc.KPI import KPI - -from telemetry.backend.service.collectors.gnmi_oc.GnmiOpenConfigCollector import GNMIOpenConfigCollector - - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) - - -@pytest.fixture(scope='session') -def kpi_manager_client(): - LOGGER.info('Starting KpiManagerClient...') - _client = KpiManagerClient(host="10.152.183.91") - _client.connect() - LOGGER.info('Yielding Connected KpiManagerClient...') - yield _client - LOGGER.info('Closed KpiManagerClient...') - _client.close() - - - -def create_kpi_descriptor_request(descriptor_name: str = "optical_monitoring"): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - #_create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) - _create_kpi_request.kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf448888" - # _create_kpi_request.kpi_id.kpi_id.uuid = "f974b6cc-095f-4767-b8c1-3457b383fb99" - _create_kpi_request.kpi_description = descriptor_name - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT - #_create_kpi_request.device_id.device_uuid.uuid = str(uuid.uuid4()) - _create_kpi_request.device_id.device_uuid.uuid = "5dc3f5d7-d3a9-5057-a9a0-8af943a5461c" - _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' - #_create_kpi_request.endpoint_id.endpoint_uuid.uuid = str(uuid.uuid4()) - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = "decb9c95-7298-5ec8-a4b6-7f276f595106" - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' - _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' - return _create_kpi_request - - -''' -def test_SetKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiId) -''' - -''' -def test_GetKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") - # adding KPI - response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - # get KPI - response = kpi_manager_client.GetKpiDescriptor(response_id) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiDescriptor) -''' - -# Test device connection parameters -devices = { - 'device1': { - 'host': '172.17.254.22', - 'port': '50061', - 'username': 'admin', - 'password': 'admin', - 'insecure': True, - } -} - -def create_basic_sub_request_parameters( - resource: str = 'components', - endpoint: str = 'port-1-in', # 'Ethernet1', - kpi: KPI = KPI.KPISAMPLETYPE_OPTICAL_POWER_TOTAL_INPUT, # It should be KPI Id not name? Need to be replaced with KPI id. -) -> dict: - - device = devices['device1'] - return { - 'target' : (device['host'], device['port']), - 'username' : device['username'], - 'password' : device['password'], - 'connect_timeout' : 15, - 'insecure' : device['insecure'], - 'mode' : 'sample', # Subscription internal mode posibly: on_change, poll, sample - 'sample_interval_ns': '3s', - 'sample_interval' : '10s', - 'kpi' : kpi, - 'resource' : resource, - 'endpoint' : endpoint, - } - - -@pytest.fixture -def sub_parameters(): - """Fixture to provide subscription parameters.""" - return create_basic_sub_request_parameters() - - -@pytest.fixture -def collector(sub_parameters): - """Fixture to create and connect GNMI collector.""" - collector = GNMIOpenConfigCollector( - username = sub_parameters['username'], - password = sub_parameters['password'], - insecure = sub_parameters['insecure'], - address = sub_parameters['target'][0], - port = sub_parameters['target'][1], - ) - collector.Connect() - yield collector - collector.Disconnect() - - -@pytest.fixture -def subscription_data(sub_parameters): - """Fixture to provide subscription data.""" - # It should return a list of tuples with subscription parameters. - return [ - ( - "sub_id_123", - { - "kpi" : sub_parameters['kpi'], - "endpoint" : sub_parameters['endpoint'], - "resource" : sub_parameters['resource'], - }, - float(10.0), - float(5.0), - ), - ] - - -def test_collector_connection(collector): - """Test collector connection.""" - LOGGER.info("----- Testing GNMI OpenConfig Collector Connection -----") - assert collector.connected is True - LOGGER.debug("Collector connected: %s", collector.connected) - - -- GitLab From 04c890364ae3c57ef12f00f8f455332a8bad055f Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 15:13:01 +0000 Subject: [PATCH 368/371] Pre-merge code cleanup --- src/tests/ofc24/deploy-node-agents.sh | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/tests/ofc24/deploy-node-agents.sh b/src/tests/ofc24/deploy-node-agents.sh index 5a809a140..18b1603a3 100755 --- a/src/tests/ofc24/deploy-node-agents.sh +++ b/src/tests/ofc24/deploy-node-agents.sh @@ -34,19 +34,22 @@ echo echo "Create Management Network and Node Agents:" echo "------------------------------------------" docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 --ip-range=172.254.253.0/24 na-br -docker run -d --name na-t1 --network=na-br --ip 172.254.253.1 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_t1.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-hhi.img:latest ./startNetconfAgent.sh -docker run -d --name na-t2 --network=na-br --ip 172.254.253.2 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_t2.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-hhi.img:latest ./startNetconfAgent.sh -docker run -d --name na-r1 --network=na-br --ip 172.254.253.101 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_r1.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-node.img:latest ./startNetconfAgent.sh - -docker run -d --name na-r2 --network=na-br --ip 172.254.253.102 \ - --volume "$PWD/src/tests/${TEST_NAME}/platform_r2.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ - asgamb1/flexscale-node.img:latest ./startNetconfAgent.sh +docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh +docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 --publish 2022 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh echo -- GitLab From 8cf947404df4fb452663c057116462d11097b691 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 15:15:35 +0000 Subject: [PATCH 369/371] Pre-merge code cleanup --- src/tests/ofc26_flexscale/mock_tfs_services.py | 14 +++++++++++++- src/tests/ofc26_flexscale/test_ofc26_messages.py | 13 +++++++++++++ .../test_ofc26_mgon_integration_V2.py | 13 +++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/tests/ofc26_flexscale/mock_tfs_services.py b/src/tests/ofc26_flexscale/mock_tfs_services.py index 6cbacd610..6145e60f5 100644 --- a/src/tests/ofc26_flexscale/mock_tfs_services.py +++ b/src/tests/ofc26_flexscale/mock_tfs_services.py @@ -1,4 +1,16 @@ - +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import os, pytest diff --git a/src/tests/ofc26_flexscale/test_ofc26_messages.py b/src/tests/ofc26_flexscale/test_ofc26_messages.py index b29bb949e..87549a300 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_messages.py +++ b/src/tests/ofc26_flexscale/test_ofc26_messages.py @@ -1,3 +1,16 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import json diff --git a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py index ec3a57ee0..49ac18b0c 100644 --- a/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py +++ b/src/tests/ofc26_flexscale/test_ofc26_mgon_integration_V2.py @@ -1,3 +1,16 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import logging -- GitLab From 0ac3bc0add39d9555191ff0665dd0cc470adc897 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 30 Mar 2026 15:50:54 +0000 Subject: [PATCH 370/371] Analytics component: - Fixed timeout to something reasonable --- src/analytics/frontend/tests/test_frontend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py index bc210889a..6532d6ee3 100644 --- a/src/analytics/frontend/tests/test_frontend.py +++ b/src/analytics/frontend/tests/test_frontend.py @@ -138,7 +138,7 @@ def test_StartAnalyzer_MGON_Agent(analyticsFrontend_client): added_analyzer_id = analyticsFrontend_client.StartAnalyzer(create_analyzer_for_mgon_agent()) LOGGER.debug(str(added_analyzer_id)) LOGGER.info("waiting for timer to complete 3000 seconds ...") - time.sleep(3000) + time.sleep(60) LOGGER.info('--> StopAnalyzer after timer completion') response = analyticsFrontend_client.StopAnalyzer(added_analyzer_id) LOGGER.debug(str(response)) -- GitLab From 440907c331fbf6ed9e1def50e502cb72039c99dc Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 31 Mar 2026 15:16:13 +0000 Subject: [PATCH 371/371] Service component: - Fix syntax warning --- src/service/service/ServiceServiceServicerImpl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py index c71123573..272174d99 100644 --- a/src/service/service/ServiceServiceServicerImpl.py +++ b/src/service/service/ServiceServiceServicerImpl.py @@ -655,7 +655,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): device_uuid = device.device_id.device_uuid.uuid device_names[device_uuid] = device.name - if reply_txt is not "": + if reply_txt != '': optical_reply = adapt_reply(devices, updated_service, reply_json, context_uuid_x, topology_uuid_x, "") new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: @@ -739,7 +739,7 @@ class ServiceServiceServicerImpl(ServiceServiceServicer): device_uuid = device.device_id.device_uuid.uuid device_names[device_uuid] = device.name - if reply_txt is not "": + if reply_txt != '': optical_reply = adapt_reply(devices, updated_service, reply_json, context_uuid_x, topology_uuid_x, "") new_connection = optical_reply.connections[0] #for candidate_new_connection in pathcomp_reply.connections: -- GitLab