diff --git a/common_requirements.in b/common_requirements.in index e1bcad78bfc23217633fb28ef28a2d70d070644a..b277265768c9726f17ab046d8aa932167615f523 100644 --- a/common_requirements.in +++ b/common_requirements.in @@ -15,6 +15,7 @@ coverage==6.3 grpcio==1.47.* grpcio-health-checking==1.47.* +grpcio-reflection==1.47.* grpcio-tools==1.47.* grpclib==0.4.4 prettytable==3.5.0 diff --git a/manifests/servicemonitors.yaml b/manifests/servicemonitors.yaml index d486ca971e63cf9ccc20a435d49c39e530fb438f..fa6aed0f927efa21d55ff65b18b401070e411bf4 100644 --- a/manifests/servicemonitors.yaml +++ b/manifests/servicemonitors.yaml @@ -575,9 +575,9 @@ apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: namespace: monitoring # namespace where prometheus is running - name: tfs-kpi_value_apiservice-metric + name: tfs-kpi-value-apiservice-metric labels: - app: kpi_value_apiservice + app: kpi-value-apiservice #release: prometheus #release: prom # name of the release # ( VERY IMPORTANT: You need to know the correct release name by viewing @@ -588,7 +588,7 @@ spec: matchLabels: # Target app service #namespace: tfs - app: kpi_value_apiservice # same as above + app: kpi-value-apiservice # same as above #release: prometheus # same as above endpoints: - port: metrics # named port in target app @@ -604,9 +604,9 @@ apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: namespace: monitoring # namespace where prometheus is running - name: tfs-kpi_value_writerservice-metric + name: tfs-kpi-value-writerservice-metric labels: - app: kpi_value_writerservice + app: kpi-value-writerservice #release: prometheus #release: prom # name of the release # ( VERY IMPORTANT: You need to know the correct release name by viewing @@ -617,7 +617,7 @@ spec: matchLabels: # Target app service #namespace: tfs - app: kpi_value_writerservice # same as above + app: kpi-value-writerservice # same as above #release: prometheus # same as above endpoints: - port: metrics # named port in target app diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index 4d3b7780c4cfd82a87f89baee57633503d30b92d..5a321c33e33e83b5eb67b9bacf8b9ce8f1edf304 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -12,6 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: grafana-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- apiVersion: apps/v1 kind: Deployment metadata: @@ -99,6 +110,13 @@ spec: limits: cpu: 500m memory: 1024Mi + volumeMounts: + - mountPath: /var/lib/grafana + name: grafana-pv + volumes: + - name: grafana-pv + persistentVolumeClaim: + claimName: grafana-pvc --- apiVersion: v1 kind: Service diff --git a/proto/context.proto b/proto/context.proto index 9f06d32ee04b5102ce2af511f45f8de34f984599..4d61572df1db6c95b64e9ce1cbfdd9e0db111078 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -258,6 +258,14 @@ message LinkId { Uuid link_uuid = 1; } +enum LinkTypeEnum { + LINKTYPE_UNKNOWN = 0; + LINKTYPE_COPPER = 1; + LINKTYPE_FIBER = 2; + LINKTYPE_RADIO = 3; + LINKTYPE_VIRTUAL = 4; +} + message LinkAttributes { float total_capacity_gbps = 1; float used_capacity_gbps = 2; @@ -266,9 +274,9 @@ message LinkAttributes { message Link { LinkId link_id = 1; string name = 2; - repeated EndPointId link_endpoint_ids = 3; - LinkAttributes attributes = 4; - LinkTypeEnum link_type = 5; + LinkTypeEnum link_type = 3; + repeated EndPointId link_endpoint_ids = 4; + LinkAttributes attributes = 5; } message LinkIdList { @@ -284,14 +292,6 @@ message LinkEvent { LinkId link_id = 2; } -enum LinkTypeEnum { - LINKTYPE_UNKNOWN = 0; - LINKTYPE_COPPER = 1; - LINKTYPE_VIRTUAL_COPPER = 2; - LINKTYPE_OPTICAL = 3; - LINKTYPE_VIRTUAL_OPTICAL = 4; -} - // ----- Service ------------------------------------------------------------------------------------------------------- message ServiceId { ContextId context_id = 1; diff --git a/scripts/grpcurl_inspect_context.sh b/scripts/grpcurl_inspect_context.sh new file mode 100755 index 0000000000000000000000000000000000000000..dda920a7a1899a9d8cdc3e1d1c7c576463c66fed --- /dev/null +++ b/scripts/grpcurl_inspect_context.sh @@ -0,0 +1,44 @@ +#!/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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Ref: https://github.com/fullstorydev/grpcurl + +source tfs_runtime_env_vars.sh + +GRPC_ENDPOINT="$CONTEXTSERVICE_SERVICE_HOST:$CONTEXTSERVICE_SERVICE_PORT_GRPC" +GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT" + +GRPC_SERVICES=`$GRP_CURL_CMD list` +echo "gRPC Services found in $GRPC_ENDPOINT:" +printf "\n" + +for GRPC_SERVICE in $GRPC_SERVICES; do + echo "gRPC Service: $GRPC_SERVICE" + $GRP_CURL_CMD describe $GRPC_SERVICE + printf "\n" +done + +echo "Done!" diff --git a/scripts/grpcurl_inspect_device.sh b/scripts/grpcurl_inspect_device.sh new file mode 100755 index 0000000000000000000000000000000000000000..0e1202fb6ed3b0306f3dfe03cd60eeb55c7abe83 --- /dev/null +++ b/scripts/grpcurl_inspect_device.sh @@ -0,0 +1,44 @@ +#!/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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Ref: https://github.com/fullstorydev/grpcurl + +source tfs_runtime_env_vars.sh + +GRPC_ENDPOINT="$DEVICESERVICE_SERVICE_HOST:$DEVICESERVICE_SERVICE_PORT_GRPC" +GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT" + +GRPC_SERVICES=`$GRP_CURL_CMD list` +echo "gRPC Services found in $GRPC_ENDPOINT:" +printf "\n" + +for GRPC_SERVICE in $GRPC_SERVICES; do + echo "gRPC Service: $GRPC_SERVICE" + $GRP_CURL_CMD describe $GRPC_SERVICE + printf "\n" +done + +echo "Done!" diff --git a/scripts/grpcurl_inspect_pathcomp_frontend.sh b/scripts/grpcurl_inspect_pathcomp_frontend.sh new file mode 100755 index 0000000000000000000000000000000000000000..686f7ae1e46aed2c60a33cd7fc7265ff1b5a3762 --- /dev/null +++ b/scripts/grpcurl_inspect_pathcomp_frontend.sh @@ -0,0 +1,44 @@ +#!/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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Ref: https://github.com/fullstorydev/grpcurl + +source tfs_runtime_env_vars.sh + +GRPC_ENDPOINT="$PATHCOMPSERVICE_SERVICE_HOST:$PATHCOMPSERVICE_SERVICE_PORT_GRPC" +GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT" + +GRPC_SERVICES=`$GRP_CURL_CMD list` +echo "gRPC Services found in $GRPC_ENDPOINT:" +printf "\n" + +for GRPC_SERVICE in $GRPC_SERVICES; do + echo "gRPC Service: $GRPC_SERVICE" + $GRP_CURL_CMD describe $GRPC_SERVICE + printf "\n" +done + +echo "Done!" diff --git a/scripts/grpcurl_inspect_service.sh b/scripts/grpcurl_inspect_service.sh new file mode 100755 index 0000000000000000000000000000000000000000..f1b674ee5aa8d7f0a1878840cc1f674d61b51ea5 --- /dev/null +++ b/scripts/grpcurl_inspect_service.sh @@ -0,0 +1,44 @@ +#!/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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Ref: https://github.com/fullstorydev/grpcurl + +source tfs_runtime_env_vars.sh + +GRPC_ENDPOINT="$SERVICESERVICE_SERVICE_HOST:$SERVICESERVICE_SERVICE_PORT_GRPC" +GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT" + +GRPC_SERVICES=`$GRP_CURL_CMD list` +echo "gRPC Services found in $GRPC_ENDPOINT:" +printf "\n" + +for GRPC_SERVICE in $GRPC_SERVICES; do + echo "gRPC Service: $GRPC_SERVICE" + $GRP_CURL_CMD describe $GRPC_SERVICE + printf "\n" +done + +echo "Done!" diff --git a/scripts/grpcurl_inspect_slice.sh b/scripts/grpcurl_inspect_slice.sh new file mode 100755 index 0000000000000000000000000000000000000000..170be7bf567c5f7adb0d84db62416ecc0d512f21 --- /dev/null +++ b/scripts/grpcurl_inspect_slice.sh @@ -0,0 +1,44 @@ +#!/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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Ref: https://github.com/fullstorydev/grpcurl + +source tfs_runtime_env_vars.sh + +GRPC_ENDPOINT="$SLICESERVICE_SERVICE_HOST:$SLICESERVICE_SERVICE_PORT_GRPC" +GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT" + +GRPC_SERVICES=`$GRP_CURL_CMD list` +echo "gRPC Services found in $GRPC_ENDPOINT:" +printf "\n" + +for GRPC_SERVICE in $GRPC_SERVICES; do + echo "gRPC Service: $GRPC_SERVICE" + $GRP_CURL_CMD describe $GRPC_SERVICE + printf "\n" +done + +echo "Done!" diff --git a/src/common/tools/client/RetryDecorator.py b/src/common/tools/client/RetryDecorator.py index fc45d95c8dccbbca32ace5fbba5fb4aefc7a4d79..4750ff73ae4342ce2eb2a31941ff48b46e5be281 100644 --- a/src/common/tools/client/RetryDecorator.py +++ b/src/common/tools/client/RetryDecorator.py @@ -51,24 +51,32 @@ LOGGER = logging.getLogger(__name__) def delay_linear(initial=0, increment=0, maximum=None): def compute(num_try): delay = initial + (num_try - 1) * increment - if maximum is not None: delay = max(delay, maximum) + if maximum is not None: + delay = max(delay, maximum) return delay return compute def delay_exponential(initial=1, increment=1, maximum=None): def compute(num_try): delay = initial * pow(increment, (num_try - 1)) - if maximum is not None: delay = max(delay, maximum) + if maximum is not None: + delay = max(delay, maximum) return delay return compute -def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0), - prepare_method_name=None, prepare_method_args=[], prepare_method_kwargs={}): +# pylint: disable=dangerous-default-value +def retry( + max_retries=0, delay_function=delay_linear(initial=0, increment=0), + prepare_method_name=None, prepare_method_args=list(), prepare_method_kwargs=dict() +): def _reconnect(func): def wrapper(self, *args, **kwargs): if prepare_method_name is not None: prepare_method = getattr(self, prepare_method_name, None) - if prepare_method is None: raise Exception('Prepare Method ({}) not found'.format(prepare_method_name)) + if prepare_method is None: + MSG = 'Prepare Method ({:s}) not found' + # pylint: disable=broad-exception-raised + raise Exception(MSG.format(prepare_method_name)) num_try, given_up = 0, False while not given_up: try: @@ -78,14 +86,29 @@ def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0), num_try += 1 given_up = num_try > max_retries - if given_up: raise Exception('Giving up... {:d} tries failed'.format(max_retries)) from e + if given_up: + MSG = '[{:s}:{:s}] Giving up... {:d} tries failed' + msg = MSG.format(func.__module__, func.__name__, max_retries) + # pylint: disable=broad-exception-raised + raise Exception(msg) from e if delay_function is not None: delay = delay_function(num_try) time.sleep(delay) - LOGGER.info('Retry {:d}/{:d} after {:f} seconds...'.format(num_try, max_retries, delay)) + MSG = '[{:s}:{:s}] Retry {:d}/{:d} after {:f} seconds...' + LOGGER.info(MSG.format( + func.__module__, func.__name__, num_try, max_retries, delay + )) else: - LOGGER.info('Retry {:d}/{:d} immediate...'.format(num_try, max_retries)) + MSG = '[{:s}:{:s}] Retry {:d}/{:d} immediate...' + LOGGER.info(MSG.format( + func.__module__, func.__name__, num_try, max_retries + )) - if prepare_method_name is not None: prepare_method(*prepare_method_args, **prepare_method_kwargs) + if prepare_method_name is not None: + MSG = '[{:s}:{:s}] Running prepare method...' + LOGGER.debug(MSG.format( + prepare_method.__module__, prepare_method.__name__ + )) + prepare_method(*prepare_method_args, **prepare_method_kwargs) return wrapper return _reconnect diff --git a/src/common/tools/service/GenericGrpcService.py b/src/common/tools/service/GenericGrpcService.py index f29582fff87f4ca89ee44c78adbec33f321a9a39..453309127ccf49272d004740c1e3be52cba26779 100644 --- a/src/common/tools/service/GenericGrpcService.py +++ b/src/common/tools/service/GenericGrpcService.py @@ -12,18 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional, Union import grpc, logging from concurrent import futures +from typing import Any, List, Optional, Union from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH from grpc_health.v1.health_pb2 import HealthCheckResponse from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server +from grpc_reflection.v1alpha import reflection from common.Settings import get_grpc_bind_address, get_grpc_grace_period, get_grpc_max_workers class GenericGrpcService: def __init__( - self, bind_port : Union[str, int], bind_address : Optional[str] = None, max_workers : Optional[int] = None, - grace_period : Optional[int] = None, enable_health_servicer : bool = True, cls_name : str = __name__ + self, bind_port : Union[str, int], bind_address : Optional[str] = None, + max_workers : Optional[int] = None, grace_period : Optional[int] = None, + enable_health_servicer : bool = True, enable_reflection : bool = True, + cls_name : str = __name__ ) -> None: self.logger = logging.getLogger(cls_name) self.bind_port = bind_port @@ -31,6 +34,8 @@ class GenericGrpcService: self.max_workers = get_grpc_max_workers() if max_workers is None else max_workers self.grace_period = get_grpc_grace_period() if grace_period is None else grace_period self.enable_health_servicer = enable_health_servicer + self.enable_reflection = enable_reflection + self.reflection_service_names : List[str] = [reflection.SERVICE_NAME] self.endpoint = None self.health_servicer = None self.pool = None @@ -39,6 +44,11 @@ class GenericGrpcService: def install_servicers(self): pass + def add_reflection_service_name(self, service_descriptor : Any, service_name : str): + self.reflection_service_names.append( + service_descriptor.services_by_name[service_name].full_name + ) + def start(self): self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) self.logger.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format( @@ -54,6 +64,9 @@ class GenericGrpcService: experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) add_HealthServicer_to_server(self.health_servicer, self.server) + if self.enable_reflection: + reflection.enable_server_reflection(self.reflection_service_names, self.server) + self.bind_port = self.server.add_insecure_port(self.endpoint) self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) self.logger.info('Listening on {:s}...'.format(str(self.endpoint))) diff --git a/src/common/tools/service/GenericGrpcServiceAsync.py b/src/common/tools/service/GenericGrpcServiceAsync.py index 1d652deb79e1389e2403d1d13debcba7dbc43ecc..551a3d568612f59c2bc26f692ab8d1d27dc4f4b3 100644 --- a/src/common/tools/service/GenericGrpcServiceAsync.py +++ b/src/common/tools/service/GenericGrpcServiceAsync.py @@ -12,19 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional, Union -import grpc -import logging +import grpc, logging from concurrent import futures +from typing import Any, List, Optional, Union from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH from grpc_health.v1.health_pb2 import HealthCheckResponse from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server +from grpc_reflection.v1alpha import reflection from common.Settings import get_grpc_bind_address, get_grpc_grace_period, get_grpc_max_workers class GenericGrpcServiceAsync: def __init__( - self, bind_port: Union[str, int], bind_address: Optional[str] = None, max_workers: Optional[int] = None, - grace_period: Optional[int] = None, enable_health_servicer: bool = True, cls_name: str = __name__ + self, bind_port : Union[str, int], bind_address : Optional[str] = None, + max_workers : Optional[int] = None, grace_period : Optional[int] = None, + enable_health_servicer : bool = True, enable_reflection : bool = True, + cls_name : str = __name__ ) -> None: self.logger = logging.getLogger(cls_name) self.bind_port = bind_port @@ -32,6 +34,8 @@ class GenericGrpcServiceAsync: self.max_workers = get_grpc_max_workers() if max_workers is None else max_workers self.grace_period = get_grpc_grace_period() if grace_period is None else grace_period self.enable_health_servicer = enable_health_servicer + self.enable_reflection = enable_reflection + self.reflection_service_names : List[str] = [reflection.SERVICE_NAME] self.endpoint = None self.health_servicer = None self.pool = None @@ -40,7 +44,12 @@ class GenericGrpcServiceAsync: async def install_servicers(self): pass - async def start(self): + def add_reflection_service_name(self, service_descriptor : Any, service_name : str): + self.reflection_service_names.append( + service_descriptor.services_by_name[service_name].full_name + ) + + def start(self): self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) self.logger.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format( str(self.endpoint), str(self.max_workers))) @@ -55,6 +64,9 @@ class GenericGrpcServiceAsync: experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) add_HealthServicer_to_server(self.health_servicer, self.server) + if self.enable_reflection: + reflection.enable_server_reflection(self.reflection_service_names, self.server) + self.bind_port = self.server.add_insecure_port(self.endpoint) self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) self.logger.info('Listening on {:s}...'.format(str(self.endpoint))) diff --git a/src/context/service/ContextService.py b/src/context/service/ContextService.py index a385f4481ec022b475649b749f5206512fe216b2..d633dea15a1e00316c9e8eac9d31ca69829f180f 100644 --- a/src/context/service/ContextService.py +++ b/src/context/service/ContextService.py @@ -16,7 +16,9 @@ import logging, sqlalchemy from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from common.message_broker.MessageBroker import MessageBroker +from common.proto.context_pb2 import DESCRIPTOR as CONTEXT_DESCRIPTOR from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server +from common.proto.context_policy_pb2 import DESCRIPTOR as CONTEXT_POLICY_DESCRIPTOR from common.proto.context_policy_pb2_grpc import add_ContextPolicyServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from .ContextServiceServicerImpl import ContextServiceServicerImpl @@ -36,3 +38,6 @@ class ContextService(GenericGrpcService): def install_servicers(self): add_ContextServiceServicer_to_server(self.context_servicer, self.server) add_ContextPolicyServiceServicer_to_server(self.context_servicer, self.server) + + self.add_reflection_service_name(CONTEXT_DESCRIPTOR, 'ContextService') + self.add_reflection_service_name(CONTEXT_POLICY_DESCRIPTOR, 'ContextPolicyService') diff --git a/src/context/service/database/Connection.py b/src/context/service/database/Connection.py index de45151a5ca95e974e940503aaade83a47faf46c..529c02d6e29b6434b3da0ec03593634b3ab87f08 100644 --- a/src/context/service/database/Connection.py +++ b/src/context/service/database/Connection.py @@ -74,7 +74,7 @@ def connection_set(db_engine : Engine, messagebroker : MessageBroker, request : _,service_uuid = service_get_uuid(request.service_id, allow_random=False) settings = grpc_message_to_json_string(request.settings), - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) connection_data = [{ 'connection_uuid': connection_uuid, diff --git a/src/context/service/database/Context.py b/src/context/service/database/Context.py index f0cd36f83fb3588976a3fcf515e2e97bd9613f4c..f3ef214c3715ac8c6110e3d5a18c2fb744d2d6db 100644 --- a/src/context/service/database/Context.py +++ b/src/context/service/database/Context.py @@ -82,7 +82,8 @@ def context_set(db_engine : Engine, messagebroker : MessageBroker, request : Con if len(request.slice_ids) > 0: # pragma: no cover LOGGER.warning('Items in field "slice_ids" ignored. This field is used for retrieval purposes only.') - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) + context_data = [{ 'context_uuid': context_uuid, 'context_name': context_name, diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py index 930b5299f9c77243e5d26c453d051e3ecb455e27..7515f8d68227bd26f5d5384756186394492e5e53 100644 --- a/src/context/service/database/Device.py +++ b/src/context/service/database/Device.py @@ -92,7 +92,7 @@ def device_set(db_engine : Engine, messagebroker : MessageBroker, request : Devi oper_status = grpc_to_enum__device_operational_status(request.device_operational_status) device_drivers = [grpc_to_enum__device_driver(d) for d in request.device_drivers] - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) topology_uuids : Set[str] = set() related_topologies : List[Dict] = list() diff --git a/src/context/service/database/Link.py b/src/context/service/database/Link.py index deef3769cb64e34ae6c300f562c31983a8807286..6244a8517f66280893acb10944a235666beb80d4 100644 --- a/src/context/service/database/Link.py +++ b/src/context/service/database/Link.py @@ -22,11 +22,12 @@ from common.proto.context_pb2 import Empty, EventTypeEnum, Link, LinkId, LinkIdL from common.message_broker.MessageBroker import MessageBroker from common.method_wrappers.ServiceExceptions import NotFoundException from common.tools.object_factory.Link import json_link_id -from context.service.database.uuids.Topology import topology_get_uuid +from .models.enums.LinkType import grpc_to_enum__link_type_enum from .models.LinkModel import LinkModel, LinkEndPointModel from .models.TopologyModel import TopologyLinkModel, TopologyModel from .uuids.EndPoint import endpoint_get_uuid from .uuids.Link import link_get_uuid +from .uuids.Topology import topology_get_uuid from .Events import notify_event_context, notify_event_link, notify_event_topology LOGGER = logging.getLogger(__name__) @@ -68,7 +69,9 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link) link_name = raw_link_uuid if len(raw_link_name) == 0 else raw_link_name link_uuid = link_get_uuid(request.link_id, link_name=link_name, allow_random=True) - now = datetime.datetime.utcnow() + link_type = grpc_to_enum__link_type_enum(request.link_type) + + now = datetime.datetime.now(datetime.timezone.utc) topology_uuids : Set[str] = set() related_topologies : List[Dict] = list() @@ -117,6 +120,7 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link) link_data = [{ 'link_uuid' : link_uuid, 'link_name' : link_name, + 'link_type' : link_type, 'total_capacity_gbps' : total_capacity_gbps, 'used_capacity_gbps' : used_capacity_gbps, 'created_at' : now, @@ -129,6 +133,7 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link) index_elements=[LinkModel.link_uuid], set_=dict( link_name = stmt.excluded.link_name, + link_type = stmt.excluded.link_type, total_capacity_gbps = stmt.excluded.total_capacity_gbps, used_capacity_gbps = stmt.excluded.used_capacity_gbps, updated_at = stmt.excluded.updated_at, diff --git a/src/context/service/database/OpticalLink.py b/src/context/service/database/OpticalLink.py index 53fd7bdb5a5964376c6ffb94c6b130b6744f7215..1f45daf43bb805e750b1742e6e4ea7e18039cc43 100644 --- a/src/context/service/database/OpticalLink.py +++ b/src/context/service/database/OpticalLink.py @@ -64,7 +64,7 @@ def optical_link_set(db_engine : Engine, messagebroker : MessageBroker, request link_name = raw_link_uuid if len(raw_link_name) == 0 else raw_link_name link_uuid = link_get_uuid(request.link_id, link_name=link_name, allow_random=True) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) # By default, always add link to default Context/Topology topology_uuids : Set[str] = set() diff --git a/src/context/service/database/PolicyRule.py b/src/context/service/database/PolicyRule.py index 3d59c59b3ade828450924404d081e237b7a37c1f..ad38838fc127aaee1927f9e44ac0791cef105300 100644 --- a/src/context/service/database/PolicyRule.py +++ b/src/context/service/database/PolicyRule.py @@ -84,7 +84,7 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : 'actionList': json_policyrule_basic.get('actionList', []), }, sort_keys=True) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) policyrule_data = [{ 'policyrule_uuid' : policyrule_uuid, diff --git a/src/context/service/database/Service.py b/src/context/service/database/Service.py index c789b291bd15bda1a49d8dd68e78d1875adccfb7..62f07e4fbe4f90af7834358cc79d4c8cb82934f4 100644 --- a/src/context/service/database/Service.py +++ b/src/context/service/database/Service.py @@ -91,7 +91,7 @@ def service_set(db_engine : Engine, messagebroker : MessageBroker, request : Ser service_status = grpc_to_enum__service_status(request.service_status.service_status) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) service_endpoints_data : List[Dict] = list() for i,endpoint_id in enumerate(request.service_endpoint_ids): @@ -180,7 +180,8 @@ def service_unset(db_engine : Engine, messagebroker : MessageBroker, request : S ['should be == request.service_id.context_id.context_uuid.uuid({:s})'.format(raw_context_uuid)]) service_endpoint_uuids.add(endpoint_get_uuid(endpoint_id, allow_random=False)[2]) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) + constraints = compose_constraints_data(request.service_constraints, now, service_uuid=service_uuid) config_rules = compose_config_rules_data(request.service_config.config_rules, now, service_uuid=service_uuid) diff --git a/src/context/service/database/Slice.py b/src/context/service/database/Slice.py index 18620e6fc76bbbbf6f445767d92a108f84c20a06..84e210e025e750613387a18c4c7eef4618cdfcdb 100644 --- a/src/context/service/database/Slice.py +++ b/src/context/service/database/Slice.py @@ -89,7 +89,7 @@ def slice_set(db_engine : Engine, messagebroker : MessageBroker, request : Slice slice_status = grpc_to_enum__slice_status(request.slice_status.slice_status) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) slice_endpoints_data : List[Dict] = list() for i,endpoint_id in enumerate(request.slice_endpoint_ids): @@ -222,7 +222,8 @@ def slice_unset(db_engine : Engine, messagebroker : MessageBroker, request : Sli for subslice_id in request.slice_subslice_ids } - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) + constraints = compose_constraints_data(request.slice_constraints, now, slice_uuid=slice_uuid) config_rules = compose_config_rules_data(request.slice_config.config_rules, now, slice_uuid=slice_uuid) diff --git a/src/context/service/database/Topology.py b/src/context/service/database/Topology.py index ba2649c69abb025988e576f4978479bc05a5d657..1ee5d16422e94d2b9a2ed4dede461a14e97434ec 100644 --- a/src/context/service/database/Topology.py +++ b/src/context/service/database/Topology.py @@ -134,7 +134,8 @@ def topology_set(db_engine : Engine, messagebroker : MessageBroker, request : To MSG += 'Items in field "link_ids" ignored. This field is used for retrieval purposes only.' LOGGER.warning(MSG) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) + topology_data = [{ 'context_uuid' : context_uuid, 'topology_uuid': topology_uuid, diff --git a/src/context/service/database/models/LinkModel.py b/src/context/service/database/models/LinkModel.py index 423e39832201cc19d98a106b136fb545f4e24b7d..1bfa532d843bce4e078ef087fa4659b6fec75ceb 100644 --- a/src/context/service/database/models/LinkModel.py +++ b/src/context/service/database/models/LinkModel.py @@ -13,17 +13,22 @@ # limitations under the License. import operator -from sqlalchemy import CheckConstraint, Column, DateTime, Float, ForeignKey, Integer, String +from sqlalchemy import ( + CheckConstraint, Column, DateTime, Enum, Float, ForeignKey, Integer, String +) from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from typing import Dict +from common.proto.context_pb2 import LinkTypeEnum from ._Base import _Base +from .enums.LinkType import ORM_LinkTypeEnum class LinkModel(_Base): __tablename__ = 'link' link_uuid = Column(UUID(as_uuid=False), primary_key=True) link_name = Column(String, nullable=False) + link_type = Column(Enum(ORM_LinkTypeEnum), nullable=False) total_capacity_gbps = Column(Float, nullable=True) used_capacity_gbps = Column(Float, nullable=True) created_at = Column(DateTime, nullable=False) @@ -44,11 +49,14 @@ class LinkModel(_Base): result = { 'link_id' : self.dump_id(), 'name' : self.link_name, + 'link_type' : self.link_type.value, 'link_endpoint_ids': [ link_endpoint.endpoint.dump_id() for link_endpoint in sorted(self.link_endpoints, key=operator.attrgetter('position')) ], } + if self.link_type is None: + self.link_type = LinkTypeEnum.LINKTYPE_UNKNOWN if self.total_capacity_gbps is not None: attributes : Dict = result.setdefault('attributes', dict()) attributes.setdefault('total_capacity_gbps', self.total_capacity_gbps) diff --git a/src/context/service/database/models/enums/LinkType.py b/src/context/service/database/models/enums/LinkType.py new file mode 100644 index 0000000000000000000000000000000000000000..68624af845ea813aa5ca886de97861852a294516 --- /dev/null +++ b/src/context/service/database/models/enums/LinkType.py @@ -0,0 +1,33 @@ +# 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 enum, functools +from common.proto.context_pb2 import LinkTypeEnum +from ._GrpcToEnum import grpc_to_enum + +# IMPORTANT: Entries of enum class ORM_LinkTypeEnum should be named as in +# the proto files removing the prefixes. For example, proto item +# LinkTypeEnum.DEVICEDRIVER_COPPER should be included as COPPER. +# If item name does not match, automatic mapping of proto enums +# to database enums will fail. +class ORM_LinkTypeEnum(enum.Enum): + UNKNOWN = LinkTypeEnum.LINKTYPE_UNKNOWN + COPPER = LinkTypeEnum.LINKTYPE_COPPER + FIBER = LinkTypeEnum.LINKTYPE_FIBER + RADIO = LinkTypeEnum.LINKTYPE_RADIO + VIRTUAL = LinkTypeEnum.LINKTYPE_VIRTUAL + +grpc_to_enum__link_type_enum = functools.partial( + grpc_to_enum, LinkTypeEnum, ORM_LinkTypeEnum +) diff --git a/src/device/requirements.in b/src/device/requirements.in index c89303df34d5562fdc2a7e83be76973578660ba5..ca2cdea47bb1ec1045a8bb8c35d64999b8f77f85 100644 --- a/src/device/requirements.in +++ b/src/device/requirements.in @@ -24,13 +24,13 @@ Flask-HTTPAuth==4.5.0 Flask-RESTful==0.3.9 ipaddress Jinja2==3.0.3 -libyang==2.8.0 +libyang==2.8.4 macaddress ncclient==0.6.15 numpy<2.0.0 p4runtime==1.3.0 pandas==1.5.* -paramiko==2.9.2 +paramiko==2.11.* pyang==2.6.* git+https://github.com/robshakir/pyangbind.git python-json-logger==2.0.2 diff --git a/src/device/service/DeviceService.py b/src/device/service/DeviceService.py index a94259471e76e40ddc5c6a1f2c109e8ada5075ae..a5a48e1bf80bce67fccd32316fa92935428d5b65 100644 --- a/src/device/service/DeviceService.py +++ b/src/device/service/DeviceService.py @@ -12,10 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc +from common.proto.device_pb2 import DESCRIPTOR as DEVICE_DESCRIPTOR from common.proto.device_pb2_grpc import add_DeviceServiceServicer_to_server +from common.proto.optical_device_pb2 import DESCRIPTOR as OPTICAL_DEVICE_DESCRIPTOR from common.proto.optical_device_pb2_grpc import add_OpenConfigServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from device.Config import LOAD_ALL_DEVICE_DRIVERS @@ -41,8 +42,11 @@ class DeviceService(GenericGrpcService): def install_servicers(self): self.monitoring_loops.start() add_DeviceServiceServicer_to_server(self.device_servicer, self.server) + self.add_reflection_service_name(DEVICE_DESCRIPTOR, 'DeviceService') + if LOAD_ALL_DEVICE_DRIVERS: add_OpenConfigServiceServicer_to_server(self.openconfig_device_servicer,self.server) + self.add_reflection_service_name(OPTICAL_DEVICE_DESCRIPTOR, 'OpenConfigService') def stop(self): super().stop() diff --git a/src/device/service/driver_api/_Driver.py b/src/device/service/driver_api/_Driver.py index 2580c3e785450f7be1972679872c3d16db39c714..e838e5b3d3cfca353fd4994fd60ad387b5f6766d 100644 --- a/src/device/service/driver_api/_Driver.py +++ b/src/device/service/driver_api/_Driver.py @@ -25,12 +25,15 @@ RESOURCE_ROUTING_POLICIES = '__routing_policies__' RESOURCE_SERVICES = '__services__' RESOURCE_ACL = '__acl__' RESOURCE_INVENTORY = '__inventory__' +RESOURCE_RULES = "__rules__" class _Driver: def __init__(self, name : str, address: str, port: int, **settings) -> None: """ Initialize Driver. Parameters: + name : str + Device driver name address : str The address of the device port : int diff --git a/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py index 00409dfbdf0f1932da4cedef9c02dccbb5be5ad0..03a55f472d2d4d4cd6726795fe6000c4fb68f95b 100644 --- a/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py +++ b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py @@ -40,7 +40,6 @@ class GnmiSessionHandler: self._use_tls = settings.get('use_tls', False) self._channel : Optional[grpc.Channel] = None self._stub : Optional[gNMIStub] = None - self._yang_handler = None self._monit_thread = None self._yang_handler = YangHandler() self._subscriptions = Subscriptions() diff --git a/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py b/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py new file mode 100644 index 0000000000000000000000000000000000000000..f16be652b753ca24fb7c16b361d43781328d97d4 --- /dev/null +++ b/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py @@ -0,0 +1,162 @@ +# 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 json, libyang, logging, os +from typing import Dict + +logging.basicConfig(level=logging.DEBUG) +LOGGER = logging.getLogger(__name__) + +YANG_BASE_PATH = '/home/tfs/tfs-ctrl/src/device/service/drivers/gnmi_openconfig/git/openconfig/public' +YANG_SEARCH_PATHS = ':'.join([ + os.path.join(YANG_BASE_PATH, 'release'), + os.path.join(YANG_BASE_PATH, 'third_party'), +]) + +YANG_MODULES = [ + 'iana-if-type', + 'openconfig-bgp-types', + 'openconfig-vlan-types', + + 'openconfig-interfaces', + 'openconfig-if-8021x', + 'openconfig-if-aggregate', + 'openconfig-if-ethernet-ext', + 'openconfig-if-ethernet', + 'openconfig-if-ip-ext', + 'openconfig-if-ip', + 'openconfig-if-poe', + 'openconfig-if-sdn-ext', + 'openconfig-if-tunnel', + + 'openconfig-vlan', + + 'openconfig-types', + 'openconfig-policy-types', + 'openconfig-mpls-types', + 'openconfig-network-instance-types', + 'openconfig-network-instance', + + 'openconfig-platform', + 'openconfig-platform-controller-card', + 'openconfig-platform-cpu', + 'openconfig-platform-ext', + 'openconfig-platform-fabric', + 'openconfig-platform-fan', + 'openconfig-platform-integrated-circuit', + 'openconfig-platform-linecard', + 'openconfig-platform-pipeline-counters', + 'openconfig-platform-port', + 'openconfig-platform-psu', + 'openconfig-platform-software', + 'openconfig-platform-transceiver', + 'openconfig-platform-types', +] + +class YangHandler: + def __init__(self) -> None: + self._yang_context = libyang.Context(YANG_SEARCH_PATHS) + self._loaded_modules = set() + for yang_module_name in YANG_MODULES: + LOGGER.info('Loading module: {:s}'.format(str(yang_module_name))) + self._yang_context.load_module(yang_module_name).feature_enable_all() + self._loaded_modules.add(yang_module_name) + self._data_path_instances = dict() + + def get_data_paths(self) -> Dict[str, libyang.DNode]: + return self._data_path_instances + + def get_data_path(self, path : str) -> libyang.DNode: + data_path_instance = self._data_path_instances.get(path) + if data_path_instance is None: + data_path_instance = self._yang_context.create_data_path(path) + self._data_path_instances[path] = data_path_instance + return data_path_instance + + def destroy(self) -> None: + self._yang_context.destroy() + +def main(): + yang_handler = YangHandler() + + LOGGER.info('YangHandler Data (before):') + for path, dnode in yang_handler.get_data_paths().items(): + LOGGER.info('|-> {:s}: {:s}'.format(str(path), json.dumps(dnode.print_dict()))) + + if_name = 'eth1' + sif_index = 0 + enabled = True + address_ip = '172.16.0.1' + address_ip2 = '192.168.0.1' + address_prefix = 24 + mtu = 1500 + + yang_ifs : libyang.DContainer = yang_handler.get_data_path('/openconfig-interfaces:interfaces') + yang_if_path = 'interface[name="{:s}"]'.format(if_name) + yang_if : libyang.DContainer = yang_ifs.create_path(yang_if_path) + yang_if.create_path('config/name', if_name) + yang_if.create_path('config/enabled', enabled) + yang_if.create_path('config/mtu', mtu ) + + yang_sifs : libyang.DContainer = yang_if.create_path('subinterfaces') + yang_sif_path = 'subinterface[index="{:d}"]'.format(sif_index) + yang_sif : libyang.DContainer = yang_sifs.create_path(yang_sif_path) + yang_sif.create_path('config/index', sif_index) + yang_sif.create_path('config/enabled', enabled ) + + yang_ipv4 : libyang.DContainer = yang_sif.create_path('openconfig-if-ip:ipv4') + yang_ipv4.create_path('config/enabled', enabled) + + yang_ipv4_addrs : libyang.DContainer = yang_ipv4.create_path('addresses') + yang_ipv4_addr_path = 'address[ip="{:s}"]'.format(address_ip) + yang_ipv4_addr : libyang.DContainer = yang_ipv4_addrs.create_path(yang_ipv4_addr_path) + yang_ipv4_addr.create_path('config/ip', address_ip ) + yang_ipv4_addr.create_path('config/prefix-length', address_prefix) + + yang_ipv4_addr_path2 = 'address[ip="{:s}"]'.format(address_ip2) + yang_ipv4_addr2 : libyang.DContainer = yang_ipv4_addrs.create_path(yang_ipv4_addr_path2) + yang_ipv4_addr2.create_path('config/ip', address_ip2 ) + yang_ipv4_addr2.create_path('config/prefix-length', address_prefix) + + str_data = yang_if.print_mem('json') + json_data = json.loads(str_data) + json_data = json_data['openconfig-interfaces:interface'][0] + str_data = json.dumps(json_data, indent=4) + LOGGER.info('Resulting Request (before unlink): {:s}'.format(str_data)) + + yang_ipv4_addr2.unlink() + + root_node : libyang.DContainer = yang_handler.get_data_path('/openconfig-interfaces:interfaces') + LOGGER.info('root_node={:s}'.format(str(root_node.print_mem('json')))) + + for s in root_node.siblings(): + LOGGER.info('sibling: {:s}'.format(str(s))) + + PATH_TMPL = '/openconfig-interfaces:interfaces/interface[name="{:s}"]/subinterfaces/subinterface[index="{:d}"]' + yang_sif = root_node.find_path(PATH_TMPL.format(if_name, sif_index)) + if yang_sif is not None: + LOGGER.info('yang_sif={:s}'.format(str(yang_sif.print_mem('json')))) + yang_sif.unlink() + yang_sif.free() + + str_data = yang_if.print_mem('json') + json_data = json.loads(str_data) + json_data = json_data['openconfig-interfaces:interface'][0] + str_data = json.dumps(json_data, indent=4) + LOGGER.info('Resulting Request (after unlink): {:s}'.format(str_data)) + + yang_handler.destroy() + +if __name__ == '__main__': + main() diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py index a52c84691c00b0c09336e2400dbeb94a9ca310ed..ed833b647d9c856cd7e54c5258b14924d187eb9f 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py @@ -34,6 +34,21 @@ class InterfaceHandler(_Handler): PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]' str_path = PATH_TMPL.format(if_name, sif_index) str_data = json.dumps({}) + + root_node : libyang.DContainer = yang_handler.get_data_path( + '/openconfig-interfaces:interfaces' + ) + yang_sif = root_node.find_path('/'.join([ + '', # add slash at the beginning + 'openconfig-interfaces:interfaces', + 'interface[name="{:s}"]'.format(if_name), + 'subinterfaces', + 'subinterface[index="{:d}"]'.format(sif_index), + ])) + if yang_sif is not None: + yang_sif.unlink() + yang_sif.free() + return str_path, str_data enabled = get_bool(resource_value, 'enabled', True) # True/False diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py index 2a4c19baa7ccdcc177e2724609a87636d1398a8a..f6f61a32403f154578da0247d0e1db24a727b017 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py @@ -36,15 +36,13 @@ class NetworkInstanceInterfaceHandler(_Handler): if IS_CEOS: ni_if_id = if_name + PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]' + str_path = PATH_TMPL.format(ni_name, ni_if_id) + if delete: - PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]' - str_path = PATH_TMPL.format(ni_name, ni_if_id) str_data = json.dumps({}) return str_path, str_data - str_path = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'.format( - ni_name, ni_if_id - ) #str_data = json.dumps({ # 'id': if_id, # 'config': {'id': if_id, 'interface': if_name, 'subinterface': sif_index}, diff --git a/src/device/service/drivers/p4/p4_common.py b/src/device/service/drivers/p4/p4_common.py index ec851493777243829737136722198173580fbadd..b55296a65922de93370a66301254cacf9ca7220a 100644 --- a/src/device/service/drivers/p4/p4_common.py +++ b/src/device/service/drivers/p4/p4_common.py @@ -27,10 +27,12 @@ import math import re import socket import ipaddress +from typing import Any, Dict, List, Optional, Tuple from ctypes import c_uint16, sizeof import macaddress -from common.type_checkers.Checkers import chk_type +from common.type_checkers.Checkers import \ + chk_attribute, chk_string, chk_type, chk_issubclass try: from .p4_exception import UserBadValueError except ImportError: @@ -38,6 +40,7 @@ except ImportError: P4_ATTR_DEV_ID = "id" P4_ATTR_DEV_NAME = "name" +P4_ATTR_DEV_ENDPOINTS = "endpoints" P4_ATTR_DEV_VENDOR = "vendor" P4_ATTR_DEV_HW_VER = "hw_ver" P4_ATTR_DEV_SW_VER = "sw_ver" @@ -50,6 +53,7 @@ P4_VAL_DEF_HW_VER = "BMv2 simple_switch" P4_VAL_DEF_SW_VER = "Stratum" P4_VAL_DEF_TIMEOUT = 60 +RESOURCE_ENDPOINTS_ROOT_PATH = "/endpoints" # Logger instance LOGGER = logging.getLogger(__name__) @@ -422,6 +426,28 @@ def parse_action_parameters_from_json(resource): return action_params +def parse_replicas_from_json(resource): + """ + Parse the session replicas within a JSON-based object. + + :param resource: JSON-based object + :return: map of replicas + """ + if not resource or ("replicas" not in resource): + LOGGER.warning( + "JSON entry misses 'replicas' list of attributes") + return None + chk_type("replicas", resource["replicas"], list) + + replicas = {} + for rep in resource["replicas"]: + chk_type("egress-port", rep["egress-port"], int) + chk_type("instance", rep["instance"], int) + replicas[rep["egress-port"]] = rep["instance"] + + return replicas + + def parse_integer_list_from_json(resource, resource_list, resource_item): """ Parse the list of integers within a JSON-based object. @@ -443,3 +469,77 @@ def parse_integer_list_from_json(resource, resource_list, resource_item): integers_list.append(item[resource_item]) return integers_list + +def process_optional_string_field( + #TODO: Consider adding this in common methdos as it is taken by the Emulated driver + endpoint_data : Dict[str, Any], field_name : str, endpoint_resource_value : Dict[str, Any] +) -> None: + field_value = chk_attribute(field_name, endpoint_data, 'endpoint_data', default=None) + if field_value is None: return + chk_string('endpoint_data.{:s}'.format(field_name), field_value) + if len(field_value) > 0: endpoint_resource_value[field_name] = field_value + +def compose_resource_endpoints(endpoints_list : List[Tuple[str, Any]]): + #TODO: Consider adding this in common methods; currently taken by the Emulated driver + endpoint_resources = [] + for i, endpoint in enumerate(endpoints_list): + LOGGER.debug("P4 endpoint {}: {}".format(i, endpoint)) + endpoint_resource = compose_resource_endpoint(endpoint) + if endpoint_resource is None: continue + endpoint_resources.append(endpoint_resource) + return endpoint_resources + +def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[str, Dict]]: + #TODO: Consider adding this in common methods; currently taken by the Emulated driver + try: + endpoint_uuid = chk_attribute('uuid', endpoint_data, 'endpoint_data') + chk_string('endpoint_data.uuid', endpoint_uuid, min_length=1) + endpoint_resource_path = RESOURCE_ENDPOINTS_ROOT_PATH + endpoint_resource_key = '{:s}/endpoint[{:s}]'.format(endpoint_resource_path, endpoint_uuid) + endpoint_resource_value = {'uuid': endpoint_uuid} + + # Check endpoint's optional string fields + process_optional_string_field(endpoint_data, 'name', endpoint_resource_value) + process_optional_string_field(endpoint_data, 'type', endpoint_resource_value) + process_optional_string_field(endpoint_data, 'context_uuid', endpoint_resource_value) + process_optional_string_field(endpoint_data, 'topology_uuid', endpoint_resource_value) + + return endpoint_resource_key, endpoint_resource_value + except: # pylint: disable=bare-except + LOGGER.error('Problem composing endpoint({:s})'.format(str(endpoint_data))) + return None + +def compose_resource_rules(rules_list : List[Tuple[str, Any]]): + rule_resources = [] + for i, rule in enumerate(rules_list): + rule_resource = compose_resource_rule(rule_data=rule, rule_cnt=i) + if rule_resource is None: continue + rule_resources.append(rule_resource) + return rule_resources + +def compose_resource_rule(rule_data : Dict[str, Any], rule_cnt : int) -> Optional[Tuple[str, Dict]]: + try: + LOGGER.info("Rule: {}".format(rule_data)) + + rule_resource_key = chk_attribute('resource_key', rule_data, 'rule_data') + chk_string('rule_data.resource_key', rule_resource_key, min_length=1) + + rule_resource_value = chk_attribute('resource_value', rule_data, 'rule_data') + chk_issubclass('rule_data.resource_value', rule_resource_value, dict) + + rule_key_unique = "" + + if "table" == rule_resource_key: + table_name = parse_resource_string_from_json(rule_resource_value, "table-name") + assert table_name, "Invalid table name in rule" + rule_key_unique = '/{0}s/{0}/{1}[{2}]'.format(rule_resource_key, table_name, rule_cnt) + else: + msg = f"Parsed an invalid key {rule_resource_key}" + LOGGER.error(msg) + raise Exception(msg) + + assert rule_key_unique, "Invalid unique resource key" + return rule_key_unique, rule_resource_value + except: # pylint: disable=bare-except + LOGGER.error('Problem composing rule({:s})'.format(str(rule_data))) + return None diff --git a/src/device/service/drivers/p4/p4_context.py b/src/device/service/drivers/p4/p4_context.py index ca8f0c19ef6cecdc361664323bbe2cd8beed64e3..ce8e308e8b2f55aa37c7cf06b6a56fdf7dc3bd7f 100644 --- a/src/device/service/drivers/p4/p4_context.py +++ b/src/device/service/drivers/p4/p4_context.py @@ -34,6 +34,7 @@ class P4Type(enum.Enum): meter = 6 direct_meter = 7 controller_packet_metadata = 8 + digest = 9 P4Type.table.p4info_name = "tables" @@ -44,6 +45,7 @@ P4Type.direct_counter.p4info_name = "direct_counters" P4Type.meter.p4info_name = "meters" P4Type.direct_meter.p4info_name = "direct_meters" P4Type.controller_packet_metadata.p4info_name = "controller_packet_metadata" +P4Type.digest.p4info_name = "digests" for object_type in P4Type: object_type.pretty_name = object_type.name.replace('_', ' ') @@ -58,11 +60,12 @@ class P4RuntimeEntity(enum.Enum): table_entry = 1 action_profile_member = 2 action_profile_group = 3 - meter_entry = 4 - direct_meter_entry = 5 - counter_entry = 6 - direct_counter_entry = 7 + counter_entry = 4 + direct_counter_entry = 5 + meter_entry = 6 + direct_meter_entry = 7 packet_replication_engine_entry = 8 + digest_entry = 9 class Context: diff --git a/src/device/service/drivers/p4/p4_driver.py b/src/device/service/drivers/p4/p4_driver.py index d31fa46738fad9f9404c8ba21dfbc49b08fde074..c89a42baddaf45737ebfcf26a665f0a6beb8544f 100644 --- a/src/device/service/drivers/p4/p4_driver.py +++ b/src/device/service/drivers/p4/p4_driver.py @@ -23,15 +23,19 @@ import threading from typing import Any, Iterator, List, Optional, Tuple, Union from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method from common.type_checkers.Checkers import chk_type, chk_length, chk_string +from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_RULES from .p4_common import matches_ipv4, matches_ipv6, valid_port,\ - P4_ATTR_DEV_ID, P4_ATTR_DEV_NAME, P4_ATTR_DEV_VENDOR,\ - P4_ATTR_DEV_HW_VER, P4_ATTR_DEV_SW_VER,\ + compose_resource_endpoints, parse_resource_string_from_json,\ + P4_ATTR_DEV_ID, P4_ATTR_DEV_NAME, P4_ATTR_DEV_ENDPOINTS,\ + P4_ATTR_DEV_VENDOR, P4_ATTR_DEV_HW_VER, P4_ATTR_DEV_SW_VER,\ P4_ATTR_DEV_P4BIN, P4_ATTR_DEV_P4INFO, P4_ATTR_DEV_TIMEOUT,\ P4_VAL_DEF_VENDOR, P4_VAL_DEF_HW_VER, P4_VAL_DEF_SW_VER,\ P4_VAL_DEF_TIMEOUT -from .p4_manager import P4Manager, KEY_TABLE, KEY_ACTION, \ - KEY_ACTION_PROFILE, KEY_COUNTER, KEY_DIR_COUNTER, KEY_METER, KEY_DIR_METER,\ - KEY_CTL_PKT_METADATA +from .p4_manager import P4Manager, \ + KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE, \ + KEY_COUNTER, KEY_DIR_COUNTER, KEY_METER, KEY_DIR_METER,\ + KEY_CTL_PKT_METADATA, KEY_DIGEST, KEY_CLONE_SESSION,\ + KEY_ENDPOINT from .p4_client import WriteOperation try: @@ -59,6 +63,8 @@ class P4Driver(_Driver): P4 device datapath ID (Mandatory) name : str P4 device name (Optional) + endpoints : list + List of P4 device endpoints, i.e., ports (Optional) vendor : str P4 device vendor (Optional) hw_ver : str @@ -70,17 +76,22 @@ class P4Driver(_Driver): p4info : str Path to P4 info file (Optional, but must be combined with p4bin) timeout : int - Device timeout in seconds (Optional) + P4 device timeout in seconds (Optional) + rules : list + List of rules to configure the P4 device's pipeline """ def __init__(self, address: str, port: int, **settings) -> None: - super().__init__(settings.pop('name', DRIVER_NAME), address, port, **settings) + super().__init__(name=DRIVER_NAME, address=address, port=port, setting=settings) self.__manager = None self.__address = address self.__port = int(port) - self.__endpoint = None + self.__grpc_endpoint = None self.__settings = settings self.__id = None + self.__name = None + self.__endpoints = [] + self.__rules = {} self.__vendor = P4_VAL_DEF_VENDOR self.__hw_version = P4_VAL_DEF_HW_VER self.__sw_version = P4_VAL_DEF_SW_VER @@ -97,7 +108,7 @@ class P4Driver(_Driver): self.__address, self.__port) for key, value in settings.items(): - LOGGER.info("\t%8s = %s", key, value) + LOGGER.info("\t%9s = %s", key, value) def Connect(self) -> bool: """ @@ -105,14 +116,14 @@ class P4Driver(_Driver): :return: boolean connection status. """ - LOGGER.info("Connecting to P4 device %s ...", self.__endpoint) + LOGGER.info("Connecting to P4 device %s ...", self.__grpc_endpoint) with self.__lock: # Skip if already connected if self.__started.is_set(): return True - # Dynamically devise an election ID + # TODO: Dynamically devise an election ID election_id = (1, 0) # Spawn a P4 manager for this device @@ -140,7 +151,7 @@ class P4Driver(_Driver): :return: boolean disconnection status. """ - LOGGER.info("Disconnecting from P4 device %s ...", self.__endpoint) + LOGGER.info("Disconnecting from P4 device %s ...", self.__grpc_endpoint) # If not started, assume it is already disconnected if not self.__started.is_set(): @@ -167,13 +178,15 @@ class P4Driver(_Driver): :return: list of initial configuration items. """ - initial_conf = [] + + resource_keys = [RESOURCE_ENDPOINTS] if self.__endpoints else [] with self.__lock: - if not initial_conf: - LOGGER.warning("No initial configuration for P4 device %s ...", - self.__endpoint) - return [] + if not resource_keys: + LOGGER.warning("No initial configuration for P4 device {} ...".format(self.__grpc_endpoint)) + return [] + LOGGER.info("Initial configuration for P4 device {}:".format(self.__grpc_endpoint)) + return self.GetConfig(resource_keys) @metered_subclass_method(METRICS_POOL) def GetConfig(self, resource_keys: List[str] = [])\ @@ -186,7 +199,7 @@ class P4Driver(_Driver): None/Exception. """ LOGGER.info( - "Getting configuration from P4 device %s ...", self.__endpoint) + "Getting configuration from P4 device %s ...", self.__grpc_endpoint) # No resource keys means fetch all configuration if len(resource_keys) == 0: @@ -195,7 +208,7 @@ class P4Driver(_Driver): "implies getting all resource keys!") resource_keys = [ obj_name for obj_name, _ in self.__manager.p4_objects.items() - ] + ] + [RESOURCE_ENDPOINTS] + [RESOURCE_RULES] # Verify the input type chk_type("resources", resource_keys, list) @@ -214,7 +227,7 @@ class P4Driver(_Driver): changes requested. """ LOGGER.info( - "Setting configuration to P4 device %s ...", self.__endpoint) + "Setting configuration to P4 device %s ...", self.__grpc_endpoint) if not resources or len(resources) == 0: LOGGER.warning( @@ -238,7 +251,7 @@ class P4Driver(_Driver): deletions requested. """ LOGGER.info( - "Deleting configuration from P4 device %s ...", self.__endpoint) + "Deleting configuration from P4 device %s ...", self.__grpc_endpoint) if not resources or len(resources) == 0: LOGGER.warning( @@ -308,6 +321,14 @@ class P4Driver(_Driver): """ return self.__manager + def is_started(self): + """ + Check if an instance of the P4 manager is started. + + :return: boolean P4 manager instance status + """ + return self.__started.is_set() + def __parse_and_validate_settings(self): """ Verify that the driver inputs comply to what is expected. @@ -319,7 +340,7 @@ class P4Driver(_Driver): f"{self.__address} not a valid IPv4 or IPv6 address" assert valid_port(self.__port), \ f"{self.__port} not a valid transport port" - self.__endpoint = f"{self.__address}:{self.__port}" + self.__grpc_endpoint = f"{self.__address}:{self.__port}" # Device ID try: @@ -337,6 +358,16 @@ class P4Driver(_Driver): "No device name is provided. Setting default name: %s", self.__name) + # Device endpoints + if P4_ATTR_DEV_ENDPOINTS in self.__settings: + endpoints = self.__settings.get(P4_ATTR_DEV_ENDPOINTS, []) + endpoint_resources = compose_resource_endpoints(endpoints) + if endpoint_resources: + LOGGER.info("Setting endpoints: {}".format(endpoint_resources)) + self.SetConfig(endpoint_resources) + else: + LOGGER.warning("No device endpoints are provided.") + # Device vendor if P4_ATTR_DEV_VENDOR in self.__settings: self.__vendor = self.__settings.get(P4_ATTR_DEV_VENDOR) @@ -365,7 +396,7 @@ class P4Driver(_Driver): if P4_ATTR_DEV_P4BIN in self.__settings: self.__p4bin_path = self.__settings.get(P4_ATTR_DEV_P4BIN) assert os.path.exists(self.__p4bin_path),\ - "Invalid path to p4bin file" + "Invalid path to p4bin file: {}".format(self.__p4bin_path) assert P4_ATTR_DEV_P4INFO in self.__settings,\ "p4info and p4bin settings must be provided together" @@ -373,7 +404,7 @@ class P4Driver(_Driver): if P4_ATTR_DEV_P4INFO in self.__settings: self.__p4info_path = self.__settings.get(P4_ATTR_DEV_P4INFO) assert os.path.exists(self.__p4info_path),\ - "Invalid path to p4info file" + "Invalid path to p4info file: {}".format(self.__p4info_path) assert P4_ATTR_DEV_P4BIN in self.__settings,\ "p4info and p4bin settings must be provided together" @@ -404,7 +435,7 @@ class P4Driver(_Driver): """ resources = [] - LOGGER.debug("GetConfig() -> Keys: %s", resource_keys) + LOGGER.info("GetConfig() -> Keys: {}".format(resource_keys)) for resource_key in resource_keys: entries = [] @@ -423,8 +454,7 @@ class P4Driver(_Driver): entries.append(c_entries) elif KEY_DIR_COUNTER == resource_key: for d_cnt_name in self.__manager.get_direct_counter_names(): - dc_entries = \ - self.__manager.direct_counter_entries_to_json( + dc_entries = self.__manager.direct_counter_entries_to_json( d_cnt_name) if dc_entries: entries.append(dc_entries) @@ -436,28 +466,35 @@ class P4Driver(_Driver): entries.append(m_entries) elif KEY_DIR_METER == resource_key: for d_meter_name in self.__manager.get_direct_meter_names(): - dm_entries = \ - self.__manager.direct_meter_entries_to_json( + dm_entries = self.__manager.direct_meter_entries_to_json( d_meter_name) if dm_entries: entries.append(dm_entries) elif KEY_ACTION_PROFILE == resource_key: for ap_name in self.__manager.get_action_profile_names(): - ap_entries = \ - self.__manager.action_prof_member_entries_to_json( + ap_entries = self.__manager.action_prof_member_entries_to_json( ap_name) if ap_entries: entries.append(ap_entries) elif KEY_ACTION == resource_key: - #To be implemented or deprecated - pass - elif '__endpoints__' == resource_key: - #Not Supported for P4 devices + # To be implemented or deprecated pass elif KEY_CTL_PKT_METADATA == resource_key: + #TODO: Handle controller packet metadata msg = f"{resource_key.capitalize()} is not a " \ f"retrievable resource" - raise Exception(msg) + LOGGER.warning("%s", msg) + elif KEY_DIGEST == resource_key: + #TODO: Handle digests + msg = f"{resource_key.capitalize()} is not a " \ + f"retrievable resource" + LOGGER.warning("%s", msg) + elif RESOURCE_ENDPOINTS == resource_key: + resources += self.__endpoints + continue + elif RESOURCE_RULES == resource_key: + resources = self.__rules_into_resources() + continue else: msg = f"GetConfig failed due to invalid " \ f"resource key: {resource_key}" @@ -465,8 +502,10 @@ class P4Driver(_Driver): resources.append( (resource_key, entries if entries else None) ) - except Exception as ex: # pylint: disable=broad-except - resources.append((resource_key, ex)) + except Exception as e: # pylint: disable=broad-except + resources.append((resource_key, e)) + + LOGGER.info("GetConfig() -> Results: %s", resources) return resources @@ -480,6 +519,8 @@ class P4Driver(_Driver): """ results = [] + LOGGER.info("SetConfig -> Resources {}".format(resources)) + for i, resource in enumerate(resources): str_resource_name = f"resources[#{i}]" resource_key = "" @@ -499,11 +540,15 @@ class P4Driver(_Driver): continue try: - resource_value = json.loads(resource_value) - except Exception: # pylint: disable=broad-except - pass + # Rules are JSON-based, endpoints are not + if "endpoint" not in resource_key: + resource_value = json.loads(resource_value) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception("Exception validating resource value {}".format(resource_value)) + results.append(e) + continue - LOGGER.debug( + LOGGER.info( "SetConfig() -> Key: %s - Value: %s", resource_key, resource_value) @@ -512,13 +557,22 @@ class P4Driver(_Driver): # to be inserted already exists, thus simply needs an update. operation = WriteOperation.insert + # Dataplane and cache rule insertion process try: - self.__apply_operation(resource_key, resource_value, operation) - results.append(True) - except Exception as ex: # pylint: disable=broad-except - results.append(ex) + r2, r3 = False, True + r1 = self.__cache_rule_insert(resource_key, resource_value, operation) + # Cache insertion succeeded, proceed to dataplane + if r1: + r2 = self.__apply_operation(resource_key, resource_value, operation) + # Dataplane insertion did not succeed --> Revert caching + if not r2 and r1: + r3 = self.__cache_rule_remove(resource_key) + results.append(r1 & r2 & r3) + except Exception as e: # pylint: disable=broad-except + results.append(e) + continue - print(results) + LOGGER.info("SetConfig() -> Results: {}".format(results)) return results @@ -552,21 +606,31 @@ class P4Driver(_Driver): try: resource_value = json.loads(resource_value) - except Exception: # pylint: disable=broad-except - pass + except Exception as e: # pylint: disable=broad-except + results.append(e) + continue - LOGGER.debug("DeleteConfig() -> Key: %s - Value: %s", + LOGGER.info("DeleteConfig() -> Key: %s - Value: %s", resource_key, resource_value) operation = WriteOperation.delete + # Dataplane and cache rule removal process try: - self.__apply_operation(resource_key, resource_value, operation) - results.append(True) - except Exception as ex: # pylint: disable=broad-except - results.append(ex) + r2, r3 = False, True + r1 = self.__cache_rule_remove(resource_key) + # Cache removal succeeded, proceed to dataplane + if r1: + r2 = self.__apply_operation(resource_key, resource_value, operation) + # Dataplane removal did not succeed --> Revert caching + if not r2 and r1: + r3 = self.__cache_rule_insert(resource_key, resource_value, WriteOperation.insert) + results.append(r1 & r2 & r3) + except Exception as e: # pylint: disable=broad-except + results.append(e) + continue - print(results) + LOGGER.info("DeleteConfig() -> Results: {}".format(results)) return results @@ -583,35 +647,85 @@ class P4Driver(_Driver): """ # Apply settings to the various tables - if KEY_TABLE == resource_key: + if KEY_TABLE in resource_key: self.__manager.table_entry_operation_from_json( resource_value, operation) - elif KEY_COUNTER == resource_key: + elif KEY_COUNTER in resource_key: self.__manager.counter_entry_operation_from_json( resource_value, operation) - elif KEY_DIR_COUNTER == resource_key: + elif KEY_DIR_COUNTER in resource_key: self.__manager.direct_counter_entry_operation_from_json( resource_value, operation) - elif KEY_METER == resource_key: + elif KEY_METER in resource_key: self.__manager.meter_entry_operation_from_json( resource_value, operation) - elif KEY_DIR_METER == resource_key: + elif KEY_DIR_METER in resource_key: self.__manager.direct_meter_entry_operation_from_json( resource_value, operation) - elif KEY_ACTION_PROFILE == resource_key: + elif KEY_ACTION_PROFILE in resource_key: self.__manager.action_prof_member_entry_operation_from_json( resource_value, operation) self.__manager.action_prof_group_entry_operation_from_json( resource_value, operation) - elif KEY_CTL_PKT_METADATA == resource_key: + elif KEY_CLONE_SESSION in resource_key: + self.__manager.clone_session_entry_operation_from_json( + resource_value, operation) + elif KEY_CTL_PKT_METADATA in resource_key: msg = f"{resource_key.capitalize()} is not a " \ f"configurable resource" raise Exception(msg) + elif KEY_DIGEST in resource_key: + msg = f"{resource_key.capitalize()} is not a " \ + f"configurable resource" + raise Exception(msg) + elif KEY_ENDPOINT in resource_key: + self.__endpoints.append((resource_key, resource_value)) else: msg = f"{operation} on invalid key {resource_key}" LOGGER.error(msg) raise Exception(msg) - LOGGER.debug("%s operation: %s", resource_key.capitalize(), operation) + return True + + def __cache_rule_insert(self, resource_key, resource_value, operation): + """ + Insert a new rule into the rule cache or update an existing one. + + :param resource_key: P4 resource key + :param resource_value: P4 resource value in JSON format + :param operation: write operation (i.e., insert, update) to apply + :return: True if new rule is inserted or existing is updated, otherwise False + """ + if (resource_key in self.__rules.keys()) and (operation == WriteOperation.insert): + LOGGER.error("Attempting to insert an existing rule key: {}".format(resource_key)) + return False + elif (resource_key not in self.__rules.keys()) and (operation == WriteOperation.update): + LOGGER.error("Attempting to update a non-existing rule key: {}".format(resource_key)) + return False + elif (resource_key in self.__rules.keys()) and (operation == WriteOperation.update): + LOGGER.warning("Updating an existing rule key: {}".format(resource_key)) + self.__rules[resource_key] = resource_value + return True + + def __cache_rule_remove(self, resource_key): + """ + Remove an existing rule from the rule cache. + :param resource_key: P4 resource key + :return: True if existing rule is removed, otherwise False + """ + if resource_key not in self.__rules.keys(): + LOGGER.error("Attempting to remove a non-existing rule key: {}".format(resource_key)) + return False + self.__rules.pop(resource_key) return True + + def __rules_into_resources(self): + """ + Transform rules from the driver's rule map into + resources exposed through the SBI API. + """ + resource_list = [] + for rule_key, rule_val in self.__rules.items(): + resource_list.append((rule_key, rule_val)) + return resource_list diff --git a/src/device/service/drivers/p4/p4_manager.py b/src/device/service/drivers/p4/p4_manager.py index f6684412a4d650ecb909632b9ddcbc3d17a55a5c..210422ed8de2559b56fa22da4e36f154b7d03b99 100644 --- a/src/device/service/drivers/p4/p4_manager.py +++ b/src/device/service/drivers/p4/p4_manager.py @@ -35,7 +35,8 @@ try: from .p4_common import encode,\ parse_resource_string_from_json, parse_resource_integer_from_json,\ parse_resource_bytes_from_json, parse_match_operations_from_json,\ - parse_action_parameters_from_json, parse_integer_list_from_json + parse_action_parameters_from_json, parse_integer_list_from_json,\ + parse_replicas_from_json from .p4_exception import UserError, InvalidP4InfoError except ImportError: from p4_client import P4RuntimeClient, P4RuntimeException,\ @@ -58,6 +59,7 @@ CONTEXT = Context() CLIENTS = {} # Constant P4 entities +KEYS_P4 = [] KEY_TABLE = "table" KEY_ACTION = "action" KEY_ACTION_PROFILE = "action_profile" @@ -66,6 +68,11 @@ KEY_DIR_COUNTER = "direct_counter" KEY_METER = "meter" KEY_DIR_METER = "direct_meter" KEY_CTL_PKT_METADATA = "controller_packet_metadata" +KEY_DIGEST = "digest" + +# Extra resource keys +KEY_CLONE_SESSION = "clone_session" +KEY_ENDPOINT = "endpoint" def get_context(): @@ -83,19 +90,20 @@ def get_table_type(table): :param table: P4 table :return: P4 table type """ - for m_f in table.match_fields: - if m_f.match_type == p4info_pb2.MatchField.EXACT: - return p4info_pb2.MatchField.EXACT - if m_f.match_type == p4info_pb2.MatchField.LPM: - return p4info_pb2.MatchField.LPM - if m_f.match_type == p4info_pb2.MatchField.TERNARY: - return p4info_pb2.MatchField.TERNARY - if m_f.match_type == p4info_pb2.MatchField.RANGE: - return p4info_pb2.MatchField.RANGE - if m_f.match_type == p4info_pb2.MatchField.OPTIONAL: - return p4info_pb2.MatchField.OPTIONAL - return None + is_ternary = False + for m_f in table.match_fields: + # LPM and range are special forms of ternary + if m_f.match_type in [ + p4info_pb2.MatchField.TERNARY, + p4info_pb2.MatchField.LPM, + p4info_pb2.MatchField.RANGE + ]: + is_ternary = True + + if is_ternary: + return p4info_pb2.MatchField.TERNARY + return p4info_pb2.MatchField.EXACT def match_type_to_str(match_type): """ @@ -132,12 +140,12 @@ class P4Manager: self.__id = device_id self.__ip_address = ip_address self.__port = int(port) - self.__endpoint = f"{self.__ip_address}:{self.__port}" + self.__grpc_endpoint = f"{self.__ip_address}:{self.__port}" self.key_id = ip_address+str(port) CLIENTS[self.key_id] = P4RuntimeClient( - self.__id, self.__endpoint, election_id, role_name, ssl_options) + self.__id, self.__grpc_endpoint, election_id, role_name, ssl_options) self.__p4info = None - + self.local_client = CLIENTS[self.key_id] # Internal memory for whitebox management @@ -146,14 +154,14 @@ class P4Manager: # | -> P4 entities self.table_entries = {} + self.action_profile_members = {} + self.action_profile_groups = {} self.counter_entries = {} self.direct_counter_entries = {} self.meter_entries = {} self.direct_meter_entries = {} - self.multicast_groups = {} self.clone_session_entries = {} - self.action_profile_members = {} - self.action_profile_groups = {} + self.multicast_groups = {} def start(self, p4bin_path, p4info_path): """ @@ -234,7 +242,7 @@ class P4Manager: self.__id = None self.__ip_address = None self.__port = None - self.__endpoint = None + self.__grpc_endpoint = None self.__clear_state() def __clear_state(self): @@ -244,14 +252,14 @@ class P4Manager: :return: void """ self.table_entries.clear() + self.action_profile_members.clear() + self.action_profile_groups.clear() self.counter_entries.clear() self.direct_counter_entries.clear() self.meter_entries.clear() self.direct_meter_entries.clear() - self.multicast_groups.clear() self.clone_session_entries.clear() - self.action_profile_members.clear() - self.action_profile_groups.clear() + self.multicast_groups.clear() self.p4_objects.clear() def __init_objects(self): @@ -264,7 +272,7 @@ class P4Manager: global KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE, \ KEY_COUNTER, KEY_DIR_COUNTER, \ KEY_METER, KEY_DIR_METER, \ - KEY_CTL_PKT_METADATA + KEY_CTL_PKT_METADATA, KEY_DIGEST, KEYS_P4 KEY_TABLE = P4Type.table.name KEY_ACTION = P4Type.action.name @@ -274,12 +282,15 @@ class P4Manager: KEY_METER = P4Type.meter.name KEY_DIR_METER = P4Type.direct_meter.name KEY_CTL_PKT_METADATA = P4Type.controller_packet_metadata.name - assert (k for k in [ + KEY_DIGEST = P4Type.digest.name + + KEYS_P4 = [ KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE, KEY_COUNTER, KEY_DIR_COUNTER, KEY_METER, KEY_DIR_METER, - KEY_CTL_PKT_METADATA - ]) + KEY_CTL_PKT_METADATA, KEY_DIGEST + ] + assert (k for k in KEYS_P4) if not self.p4_objects: LOGGER.warning( @@ -292,6 +303,11 @@ class P4Manager: for table in self.p4_objects[KEY_TABLE]: self.table_entries[table.name] = [] + if KEY_ACTION_PROFILE in self.p4_objects: + for act_prof in self.p4_objects[KEY_ACTION_PROFILE]: + self.action_profile_members[act_prof.name] = [] + self.action_profile_groups[act_prof.name] = [] + if KEY_COUNTER in self.p4_objects: for cnt in self.p4_objects[KEY_COUNTER]: self.counter_entries[cnt.name] = [] @@ -308,11 +324,6 @@ class P4Manager: for d_meter in self.p4_objects[KEY_DIR_METER]: self.direct_meter_entries[d_meter.name] = [] - if KEY_ACTION_PROFILE in self.p4_objects: - for act_prof in self.p4_objects[KEY_ACTION_PROFILE]: - self.action_profile_members[act_prof.name] = [] - self.action_profile_groups[act_prof.name] = [] - def __discover_objects(self): """ Discover and store all P4 objects. @@ -509,6 +520,20 @@ class P4Manager: return pkt_meta return None + def get_digest(self, digest_name): + """ + Get a digest object by name. + + :param digest_name: name of a digest object + :return: digest object or None + """ + if KEY_DIGEST not in self.p4_objects: + return None + for dg in self.p4_objects[KEY_DIGEST]: + if dg == digest_name.name: + return digest_name + return None + def get_resource_keys(self): """ Retrieve the available P4 resource keys. @@ -561,15 +586,15 @@ class P4Manager: self.table_entries[table_name] = [] try: - for count, table_entry in enumerate( - TableEntry(self.local_client, table_name)(action=action_name).read()): - LOGGER.debug( - "Table %s - Entry %d\n%s", table_name, count, table_entry) + entries = TableEntry(self.local_client, table_name).read() + assert self.local_client + for table_entry in entries: self.table_entries[table_name].append(table_entry) return self.table_entries[table_name] except P4RuntimeException as ex: - LOGGER.error(ex) - return [] + LOGGER.error("Failed to get table %s entries: %s", + table_name, str(ex)) + return [] def table_entries_to_json(self, table_name): """ @@ -634,10 +659,14 @@ class P4Manager: :return: number of P4 table entries or negative integer upon missing table """ - entries = self.get_table_entries(table_name, action_name) - if entries is None: - return -1 - return len(entries) + count = 0 + try: + entries = TableEntry(self.local_client, table_name).read() + count = sum(1 for _ in entries) + except Exception as e: # pylint: disable=broad-except + LOGGER.error("Failed to read entries of table: %s", table_name) + + return count def count_table_entries_all(self): """ @@ -675,7 +704,7 @@ class P4Manager: metadata = parse_resource_bytes_from_json(json_resource, "metadata") if operation in [WriteOperation.insert, WriteOperation.update]: - LOGGER.debug("Table entry to insert/update: %s", json_resource) + LOGGER.info("Table entry to insert/update: %s", json_resource) return self.insert_table_entry( table_name=table_name, match_map=match_map, @@ -685,7 +714,7 @@ class P4Manager: metadata=metadata if metadata else None ) if operation == WriteOperation.delete: - LOGGER.debug("Table entry to delete: %s", json_resource) + LOGGER.info("Table entry to delete: %s", json_resource) return self.delete_table_entry( table_name=table_name, match_map=match_map, @@ -700,7 +729,7 @@ class P4Manager: cnt_pkt=-1, cnt_byte=-1): """ Insert an entry into an exact match table. - + :param table_name: P4 table name :param match_map: Map of match operations :param action_name: Action name @@ -712,45 +741,45 @@ class P4Manager: """ assert match_map, "Table entry without match operations is not accepted" assert action_name, "Table entry without action is not accepted" - + table_entry = TableEntry(self.local_client, table_name)(action=action_name) - + for match_k, match_v in match_map.items(): table_entry.match[match_k] = match_v - + for action_k, action_v in action_params.items(): table_entry.action[action_k] = action_v - + if metadata: table_entry.metadata = metadata - + if cnt_pkt > 0: table_entry.counter_data.packet_count = cnt_pkt - + if cnt_byte > 0: table_entry.counter_data.byte_count = cnt_byte - + ex_msg = "" try: table_entry.insert() LOGGER.info("Inserted exact table entry: %s", table_entry) except (P4RuntimeException, P4RuntimeWriteException) as ex: - raise P4RuntimeException from ex - + ex_msg = str(ex) + LOGGER.warning(ex) + # Table entry exists, needs to be modified if "ALREADY_EXISTS" in ex_msg: table_entry.modify() LOGGER.info("Updated exact table entry: %s", table_entry) - + return table_entry - - + def insert_table_entry_ternary(self, table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt=-1, cnt_byte=-1): """ Insert an entry into a ternary match table. - + :param table_name: P4 table name :param match_map: Map of match operations :param action_name: Action name @@ -763,47 +792,47 @@ class P4Manager: """ assert match_map, "Table entry without match operations is not accepted" assert action_name, "Table entry without action is not accepted" - + table_entry = TableEntry(self.local_client, table_name)(action=action_name) - + for match_k, match_v in match_map.items(): table_entry.match[match_k] = match_v - + for action_k, action_v in action_params.items(): table_entry.action[action_k] = action_v - + table_entry.priority = priority - + if metadata: table_entry.metadata = metadata - + if cnt_pkt > 0: table_entry.counter_data.packet_count = cnt_pkt - + if cnt_byte > 0: table_entry.counter_data.byte_count = cnt_byte - + ex_msg = "" try: table_entry.insert() LOGGER.info("Inserted ternary table entry: %s", table_entry) except (P4RuntimeException, P4RuntimeWriteException) as ex: - raise P4RuntimeException from ex - + ex_msg = str(ex) + LOGGER.error(ex) + # Table entry exists, needs to be modified if "ALREADY_EXISTS" in ex_msg: table_entry.modify() LOGGER.info("Updated ternary table entry: %s", table_entry) - + return table_entry - - + def insert_table_entry_range(self, table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt=-1, cnt_byte=-1): # pylint: disable=unused-argument """ Insert an entry into a range match table. - + :param table_name: P4 table name :param match_map: Map of match operations :param action_name: Action name @@ -816,17 +845,16 @@ class P4Manager: """ assert match_map, "Table entry without match operations is not accepted" assert action_name, "Table entry without action is not accepted" - + raise NotImplementedError( "Range-based table insertion not implemented yet") - - + def insert_table_entry_optional(self, table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt=-1, cnt_byte=-1): # pylint: disable=unused-argument """ Insert an entry into an optional match table. - + :param table_name: P4 table name :param match_map: Map of match operations :param action_name: Action name @@ -839,7 +867,7 @@ class P4Manager: """ assert match_map, "Table entry without match operations is not accepted" assert action_name, "Table entry without action is not accepted" - + raise NotImplementedError( "Optional-based table insertion not implemented yet") @@ -869,32 +897,36 @@ class P4Manager: assert table, \ "P4 pipeline does not implement table " + table_name - if not get_table_type(table): + table_type = get_table_type(table) + + if not table_type: msg = f"Table {table_name} is undefined, cannot insert entry" LOGGER.error(msg) raise UserError(msg) + LOGGER.debug("Table {}: {}".format(table_name, match_type_to_str(table_type))) + # Exact match is supported - if get_table_type(table) == p4info_pb2.MatchField.EXACT: + if table_type == p4info_pb2.MatchField.EXACT: return self.insert_table_entry_exact( table_name, match_map, action_name, action_params, metadata, cnt_pkt, cnt_byte) # Ternary and LPM matches are supported - if get_table_type(table) in \ + if table_type in \ [p4info_pb2.MatchField.TERNARY, p4info_pb2.MatchField.LPM]: return self.insert_table_entry_ternary( table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt, cnt_byte) # TODO: Cover RANGE match # pylint: disable=W0511 - if get_table_type(table) == p4info_pb2.MatchField.RANGE: + if table_type == p4info_pb2.MatchField.RANGE: return self.insert_table_entry_range( table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt, cnt_byte) # TODO: Cover OPTIONAL match # pylint: disable=W0511 - if get_table_type(table) == p4info_pb2.MatchField.OPTIONAL: + if table_type == p4info_pb2.MatchField.OPTIONAL: return self.insert_table_entry_optional( table_name, match_map, action_name, action_params, metadata, priority, cnt_pkt, cnt_byte) @@ -917,7 +949,9 @@ class P4Manager: assert table, \ "P4 pipeline does not implement table " + table_name - if not get_table_type(table): + table_type = get_table_type(table) + + if not table_type: msg = f"Table {table_name} is undefined, cannot delete entry" LOGGER.error(msg) raise UserError(msg) @@ -930,7 +964,7 @@ class P4Manager: for action_k, action_v in action_params.items(): table_entry.action[action_k] = action_v - if get_table_type(table) in \ + if table_type in \ [p4info_pb2.MatchField.TERNARY, p4info_pb2.MatchField.LPM]: if priority == 0: msg = f"Table {table_name} is ternary, priority must be != 0" @@ -938,15 +972,25 @@ class P4Manager: raise UserError(msg) # TODO: Ensure correctness of RANGE & OPTIONAL # pylint: disable=W0511 - if get_table_type(table) in \ + if table_type in \ [p4info_pb2.MatchField.RANGE, p4info_pb2.MatchField.OPTIONAL]: raise NotImplementedError( "Range and optional-based table deletion not implemented yet") table_entry.priority = priority - table_entry.delete() - LOGGER.info("Deleted entry %s from table: %s", table_entry, table_name) + ex_msg = "" + try: + table_entry.delete() + LOGGER.info("Deleted entry %s from table: %s", table_entry, table_name) + except (P4RuntimeException, P4RuntimeWriteException) as ex: + ex_msg = str(ex) + LOGGER.warning(ex) + + # Table entry exists, needs to be modified + if "NOT_FOUND" in ex_msg: + # TODO: No way to discriminate between a modified entry and an actual table miss + LOGGER.warning("Table entry was initially modified, thus cannot be removed: %s", table_entry) return table_entry @@ -1172,7 +1216,8 @@ class P4Manager: self.counter_entries[cnt_name].append(cnt_entry) return self.counter_entries[cnt_name] except P4RuntimeException as ex: - LOGGER.error(ex) + LOGGER.error("Failed to get counter %s entries: %s", + cnt_name, str(ex)) return [] def counter_entries_to_json(self, cnt_name): @@ -1620,7 +1665,8 @@ class P4Manager: self.meter_entries[meter_name].append(meter_entry) return self.meter_entries[meter_name] except P4RuntimeException as ex: - LOGGER.error(ex) + LOGGER.error("Failed to get meter %s entries: %s", + meter_name, str(ex)) return [] def meter_entries_to_json(self, meter_name): @@ -1852,7 +1898,8 @@ class P4Manager: self.direct_meter_entries[d_meter_name].append(d_meter_entry) return self.direct_meter_entries[d_meter_name] except P4RuntimeException as ex: - LOGGER.error(ex) + LOGGER.error("Failed to get direct meter %s entries: %s", + d_meter_name, str(ex)) return [] def direct_meter_entries_to_json(self, d_meter_name): @@ -2094,7 +2141,8 @@ class P4Manager: self.action_profile_members[ap_name].append(ap_entry) return self.action_profile_members[ap_name] except P4RuntimeException as ex: - LOGGER.error(ex) + LOGGER.error("Failed to get action profile member %s entries: %s", + ap_name, str(ex)) return [] def action_prof_member_entries_to_json(self, ap_name): @@ -2357,7 +2405,8 @@ class P4Manager: self.action_profile_groups[ap_name].append(ap_entry) return self.action_profile_groups[ap_name] except P4RuntimeException as ex: - LOGGER.error(ex) + LOGGER.error("Failed to get action profile group %s entries: %s", + ap_name, str(ex)) return [] def count_action_prof_group_entries(self, ap_name): @@ -2880,14 +2929,13 @@ class P4Manager: json_resource, "session-id") if operation in [WriteOperation.insert, WriteOperation.update]: - ports = parse_integer_list_from_json( - json_resource, "ports", "port") + replicas = parse_replicas_from_json(json_resource) LOGGER.debug( "Clone session entry to insert/update: %s", json_resource) return self.insert_clone_session_entry( session_id=session_id, - ports=ports + replicas=replicas ) if operation == WriteOperation.delete: LOGGER.debug( @@ -2897,22 +2945,24 @@ class P4Manager: ) return None - def insert_clone_session_entry(self, session_id, ports): + def insert_clone_session_entry(self, session_id, replicas): """ Insert a new clone session. :param session_id: id of a clone session - :param ports: list of egress ports to clone session + :param replicas: list of egress ports to clone session :return: inserted clone session """ assert session_id > 0, \ "Clone session " + session_id + " must be > 0" - assert ports, \ - "No clone session ports are provided" + assert replicas, \ + "No clone session replicas are provided" + assert isinstance(replicas, dict), \ + "Clone session replicas must be a dictionary" session = CloneSessionEntry(self.local_client, session_id) - for p in ports: - session.add(p, 1) + for eg_port,instance in replicas.items(): + session.add(eg_port, instance) ex_msg = "" try: @@ -2943,12 +2993,15 @@ class P4Manager: "Clone session " + session_id + " must be > 0" session = CloneSessionEntry(self.local_client, session_id) - session.delete() + + try: + session.delete() + LOGGER.info("Deleted clone session %d", session_id) + except (P4RuntimeException, P4RuntimeWriteException) as ex: + LOGGER.error(ex) if session_id in self.clone_session_entries: del self.clone_session_entries[session_id] - LOGGER.info( - "Deleted clone session %d", session_id) return session @@ -3786,6 +3839,7 @@ class _P4EntityBase(_EntityBase): def __init__(self, p4_client, p4_type, entity_type, p4runtime_cls, name=None, modify_only=False): super().__init__(p4_client, entity_type, p4runtime_cls, modify_only) + assert self.local_client, "No local P4 client instance" self._p4_type = p4_type if name is None: raise UserError( @@ -3815,7 +3869,7 @@ class ActionProfileMember(_P4EntityBase): """ def __init__(self, p4_client, action_profile_name=None): - super().__init__( p4_client, + super().__init__(p4_client, P4Type.action_profile, P4RuntimeEntity.action_profile_member, p4runtime_pb2.ActionProfileMember, action_profile_name) self.member_id = 0 @@ -3981,7 +4035,7 @@ class ActionProfileGroup(_P4EntityBase): """ def __init__(self, p4_client, action_profile_name=None): - super().__init__( p4_client, + super().__init__(p4_client, P4Type.action_profile, P4RuntimeEntity.action_profile_group, p4runtime_pb2.ActionProfileGroup, action_profile_name) self.group_id = 0 @@ -5055,7 +5109,7 @@ class CounterEntry(_CounterEntryBase): """ def __init__(self, p4_client, counter_name=None): - super().__init__( p4_client, + super().__init__(p4_client, P4Type.counter, P4RuntimeEntity.counter_entry, p4runtime_pb2.CounterEntry, counter_name, modify_only=True) @@ -5115,11 +5169,11 @@ To write to the counter, use <self>.modify class DirectCounterEntry(_CounterEntryBase): """ Direct P4 counter entry. - """ + """ local_client = None def __init__(self, p4_client, direct_counter_name=None): - super().__init__( p4_client, + super().__init__(p4_client, P4Type.direct_counter, P4RuntimeEntity.direct_counter_entry, p4runtime_pb2.DirectCounterEntry, direct_counter_name, modify_only=True) @@ -5213,7 +5267,7 @@ class _MeterEntryBase(_P4EntityBase): """ def __init__(self, p4_client, *args, **kwargs): - super().__init__(*args, **kwargs) + super().__init__(p4_client, *args, **kwargs) self._meter_type = self._info.spec.unit self.index = -1 self.cir = -1 @@ -5910,7 +5964,7 @@ class IdleTimeoutNotification(): """ P4 idle timeout notification. """ - + local_client = None def __init__(self, p4_client): diff --git a/src/e2e_orchestrator/service/E2EOrchestratorService.py b/src/e2e_orchestrator/service/E2EOrchestratorService.py index 9fa7bf4bd82564c4158b5af77c0d69b0b9014289..3abef2777ba22cc63df3db1eb86ee411a4ea74c7 100644 --- a/src/e2e_orchestrator/service/E2EOrchestratorService.py +++ b/src/e2e_orchestrator/service/E2EOrchestratorService.py @@ -12,19 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from common.Constants import ServiceNameEnum -from common.proto.e2eorchestrator_pb2_grpc import add_E2EOrchestratorServiceServicer_to_server from common.Settings import get_service_port_grpc +from common.proto.e2eorchestrator_pb2 import DESCRIPTOR as E2EORCHESTRATOR_DESCRIPTOR +from common.proto.e2eorchestrator_pb2_grpc import add_E2EOrchestratorServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from .E2EOrchestratorServiceServicerImpl import E2EOrchestratorServiceServicerImpl -LOGGER = logging.getLogger(__name__) - - class E2EOrchestratorService(GenericGrpcService): - def __init__(self, cls_name: str = __name__): + def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.E2EORCHESTRATOR) super().__init__(port, cls_name=cls_name) self.e2eorchestrator_servicer = E2EOrchestratorServiceServicerImpl() @@ -33,3 +29,5 @@ class E2EOrchestratorService(GenericGrpcService): add_E2EOrchestratorServiceServicer_to_server( self.e2eorchestrator_servicer, self.server ) + + self.add_reflection_service_name(E2EORCHESTRATOR_DESCRIPTOR, 'E2EOrchestratorService') diff --git a/src/forecaster/service/ForecasterService.py b/src/forecaster/service/ForecasterService.py index 5f540cdc5bc628ae1a35e5f5ebf47ead276a413c..fedb5242d616eb8eef0a9b4e3fd5308925437acd 100644 --- a/src/forecaster/service/ForecasterService.py +++ b/src/forecaster/service/ForecasterService.py @@ -14,6 +14,7 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc +from common.proto.forecaster_pb2 import DESCRIPTOR as FORECASTER_DESCRIPTOR from common.proto.forecaster_pb2_grpc import add_ForecasterServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from .ForecasterServiceServicerImpl import ForecasterServiceServicerImpl @@ -26,3 +27,5 @@ class ForecasterService(GenericGrpcService): def install_servicers(self): add_ForecasterServiceServicer_to_server(self.forecaster_servicer, self.server) + + self.add_reflection_service_name(FORECASTER_DESCRIPTOR, 'ForecasterService') diff --git a/src/nbi/README.md b/src/nbi/README.md index 32902a0b33dba2f9ce3df4a60833608bac6e129d..f997ce21c9b809a1749f046672e895d3ad466824 100644 --- a/src/nbi/README.md +++ b/src/nbi/README.md @@ -31,5 +31,5 @@ sudo ldconfig ### Install Python bindings ```bash -pip install libyang==2.8.0 +pip install libyang==2.8.4 ``` diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in index 0d780483626979cc993a984d3da709762c749d56..d56ee821b19894e435368cd6250b25d3bdc33c10 100644 --- a/src/nbi/requirements.in +++ b/src/nbi/requirements.in @@ -18,7 +18,7 @@ Flask==2.1.3 Flask-HTTPAuth==4.5.0 Flask-RESTful==0.3.9 jsonschema==4.4.0 -libyang==2.8.0 +libyang==2.8.4 netaddr==0.9.0 pyang==2.6.0 git+https://github.com/robshakir/pyangbind.git diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py index eaa21352527a95591829e6bad87de8ecef1df521..ab608f2d746a2faffc819f25cc026ce9b949aff7 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py @@ -177,6 +177,11 @@ class Topology(_Resource): def delete(self, context_uuid : str, topology_uuid : str): return format_grpc_to_json(self.context_client.RemoveTopology(grpc_topology_id(context_uuid, topology_uuid))) +class TopologyDetails(_Resource): + def get(self, context_uuid : str, topology_uuid : str): + topology_id = grpc_topology_id(context_uuid, topology_uuid) + return format_grpc_to_json(self.context_client.GetTopologyDetails(topology_id)) + class ServiceIds(_Resource): def get(self, context_uuid : str): return format_grpc_to_json(self.context_client.ListServiceIds(grpc_context_id(context_uuid))) @@ -301,16 +306,20 @@ class Link(_Resource): def put(self, link_uuid : str): link_json = request.get_json() link = grpc_link(link_json) - virtual_types = {LinkTypeEnum.LINKTYPE_VIRTUAL_COPPER, LinkTypeEnum.LINKTYPE_VIRTUAL_OPTICAL} if link_uuid != link.link_id.link_uuid.uuid: raise BadRequest('Mismatching link_uuid') - elif link.link_type in virtual_types: - link = grpc_link(link_json) - return format_grpc_to_json(self.vntmanager_client.SetVirtualLink(link)) - return format_grpc_to_json(self.context_client.SetLink(grpc_link(link))) + if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL: + return format_grpc_to_json(self.vntmanager_client.SetVirtualLink(link)) + else: + return format_grpc_to_json(self.context_client.SetLink(link)) def delete(self, link_uuid : str): - return format_grpc_to_json(self.context_client.RemoveLink(grpc_link_id(link_uuid))) + link_id = grpc_link_id(link_uuid) + link = self.context_client.GetLink(link_id) + if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL: + return format_grpc_to_json(self.vntmanager_client.RemoveVirtualLink(link_id)) + else: + return format_grpc_to_json(self.context_client.RemoveLink(link_id)) class ConnectionIds(_Resource): def get(self, context_uuid : str, service_uuid : str): diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index 304a326481f4713f4b2e4f860fd2d42c25ae656b..6605557ca1b1aa7d6eb8db55287beb19e3db62a5 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -22,7 +22,7 @@ from .Resources import ( PolicyRule, PolicyRuleIds, PolicyRules, Service, ServiceIds, Services, Slice, SliceIds, Slices, - Topologies, Topology, TopologyIds + Topologies, Topology, TopologyDetails, TopologyIds ) URL_PREFIX = '/tfs-api' @@ -30,38 +30,39 @@ URL_PREFIX = '/tfs-api' # Use 'path' type since some identifiers might contain char '/' and Flask is unable to recognize them in 'string' type. RESOURCES = [ # (endpoint_name, resource_class, resource_url) - ('api.context_ids', ContextIds, '/context_ids'), - ('api.contexts', Contexts, '/contexts'), - ('api.dummy_contexts', DummyContexts, '/dummy_contexts'), - ('api.context', Context, '/context/<path:context_uuid>'), + ('api.context_ids', ContextIds, '/context_ids'), + ('api.contexts', Contexts, '/contexts'), + ('api.dummy_contexts', DummyContexts, '/dummy_contexts'), + ('api.context', Context, '/context/<path:context_uuid>'), - ('api.topology_ids', TopologyIds, '/context/<path:context_uuid>/topology_ids'), - ('api.topologies', Topologies, '/context/<path:context_uuid>/topologies'), - ('api.topology', Topology, '/context/<path:context_uuid>/topology/<path:topology_uuid>'), + ('api.topology_ids', TopologyIds, '/context/<path:context_uuid>/topology_ids'), + ('api.topologies', Topologies, '/context/<path:context_uuid>/topologies'), + ('api.topology', Topology, '/context/<path:context_uuid>/topology/<path:topology_uuid>'), + ('api.topology_details', TopologyDetails, '/context/<path:context_uuid>/topology_details/<path:topology_uuid>'), - ('api.service_ids', ServiceIds, '/context/<path:context_uuid>/service_ids'), - ('api.services', Services, '/context/<path:context_uuid>/services'), - ('api.service', Service, '/context/<path:context_uuid>/service/<path:service_uuid>'), + ('api.service_ids', ServiceIds, '/context/<path:context_uuid>/service_ids'), + ('api.services', Services, '/context/<path:context_uuid>/services'), + ('api.service', Service, '/context/<path:context_uuid>/service/<path:service_uuid>'), - ('api.slice_ids', SliceIds, '/context/<path:context_uuid>/slice_ids'), - ('api.slices', Slices, '/context/<path:context_uuid>/slices'), - ('api.slice', Slice, '/context/<path:context_uuid>/slice/<path:slice_uuid>'), + ('api.slice_ids', SliceIds, '/context/<path:context_uuid>/slice_ids'), + ('api.slices', Slices, '/context/<path:context_uuid>/slices'), + ('api.slice', Slice, '/context/<path:context_uuid>/slice/<path:slice_uuid>'), - ('api.device_ids', DeviceIds, '/device_ids'), - ('api.devices', Devices, '/devices'), - ('api.device', Device, '/device/<path:device_uuid>'), + ('api.device_ids', DeviceIds, '/device_ids'), + ('api.devices', Devices, '/devices'), + ('api.device', Device, '/device/<path:device_uuid>'), - ('api.link_ids', LinkIds, '/link_ids'), - ('api.links', Links, '/links'), - ('api.link', Link, '/link/<path:link_uuid>'), + ('api.link_ids', LinkIds, '/link_ids'), + ('api.links', Links, '/links'), + ('api.link', Link, '/link/<path:link_uuid>'), - ('api.connection_ids', ConnectionIds, '/context/<path:context_uuid>/service/<path:service_uuid>/connection_ids'), - ('api.connections', Connections, '/context/<path:context_uuid>/service/<path:service_uuid>/connections'), - ('api.connection', Connection, '/connection/<path:connection_uuid>'), + ('api.connection_ids', ConnectionIds, '/context/<path:context_uuid>/service/<path:service_uuid>/connection_ids'), + ('api.connections', Connections, '/context/<path:context_uuid>/service/<path:service_uuid>/connections'), + ('api.connection', Connection, '/connection/<path:connection_uuid>'), - ('api.policyrule_ids', PolicyRuleIds, '/policyrule_ids'), - ('api.policyrules', PolicyRules, '/policyrules'), - ('api.policyrule', PolicyRule, '/policyrule/<path:policyrule_uuid>'), + ('api.policyrule_ids', PolicyRuleIds, '/policyrule_ids'), + ('api.policyrules', PolicyRules, '/policyrules'), + ('api.policyrule', PolicyRule, '/policyrule/<path:policyrule_uuid>'), ] def register_tfs_api(rest_server : RestServer): diff --git a/src/pathcomp/frontend/service/PathCompService.py b/src/pathcomp/frontend/service/PathCompService.py index c19e59e77b9b5f75f66eec07990691a76cdc36b7..6e413c14eb293f3073bfb1d80963dab58ba04308 100644 --- a/src/pathcomp/frontend/service/PathCompService.py +++ b/src/pathcomp/frontend/service/PathCompService.py @@ -14,8 +14,9 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from common.tools.service.GenericGrpcService import GenericGrpcService +from common.proto.pathcomp_pb2 import DESCRIPTOR as PATHCOMP_DESCRIPTOR from common.proto.pathcomp_pb2_grpc import add_PathCompServiceServicer_to_server +from common.tools.service.GenericGrpcService import GenericGrpcService from .PathCompServiceServicerImpl import PathCompServiceServicerImpl class PathCompService(GenericGrpcService): @@ -26,3 +27,5 @@ class PathCompService(GenericGrpcService): def install_servicers(self): add_PathCompServiceServicer_to_server(self.pathcomp_servicer, self.server) + + self.add_reflection_service_name(PATHCOMP_DESCRIPTOR, 'PathCompService') diff --git a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py index 42635bf4ad5cfd1a1a4cb174b73d26c51576af9a..b08830332f7fc6f526a19516b120e94a1a98b232 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py @@ -22,6 +22,8 @@ from common.tools.grpc.Tools import grpc_message_to_json_string DEVICE_TYPE_TO_DEEPNESS = { DeviceTypeEnum.EMULATED_DATACENTER.value : 90, DeviceTypeEnum.DATACENTER.value : 90, + DeviceTypeEnum.EMULATED_CLIENT.value : 90, + DeviceTypeEnum.CLIENT.value : 90, DeviceTypeEnum.TERAFLOWSDN_CONTROLLER.value : 80, DeviceTypeEnum.EMULATED_IP_SDN_CONTROLLER.value : 80, @@ -50,6 +52,8 @@ DEVICE_TYPE_TO_DEEPNESS = { DeviceTypeEnum.OPTICAL_TRANSPONDER.value : 10, DeviceTypeEnum.EMULATED_OPTICAL_ROADM.value : 10, DeviceTypeEnum.OPTICAL_ROADM.value : 10, + DeviceTypeEnum.QKD_NODE.value : 10, + DeviceTypeEnum.OPEN_ROADM.value : 10, DeviceTypeEnum.EMULATED_OPTICAL_SPLITTER.value : 0, DeviceTypeEnum.NETWORK.value : 0, # network out of our control; always delegate diff --git a/src/service/service/ServiceService.py b/src/service/service/ServiceService.py index b99826e5b0f6ab8b228c32f4c7811181c83c7198..e088a99ebcc2e1b8258500df33ed8e319202d41c 100644 --- a/src/service/service/ServiceService.py +++ b/src/service/service/ServiceService.py @@ -14,6 +14,7 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc +from common.proto.service_pb2 import DESCRIPTOR as SERVICE_DESCRIPTOR from common.proto.service_pb2_grpc import add_ServiceServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from .ServiceServiceServicerImpl import ServiceServiceServicerImpl @@ -27,3 +28,5 @@ class ServiceService(GenericGrpcService): def install_servicers(self): add_ServiceServiceServicer_to_server(self.service_servicer, self.server) + + self.add_reflection_service_name(SERVICE_DESCRIPTOR, 'ServiceService') diff --git a/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py index b315c7f4d44c7f806a68b8466c393c1668d1d3bb..cdc58049d8c22dbd0ed4b338aa5c0f0e61e9842e 100644 --- a/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py +++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py @@ -72,6 +72,15 @@ class StaticRouteGenerator: added_connection_hops.add(connection_hop) connection_hop_list = filtered_connection_hop_list + # In some cases connection_hop_list first and last items might be internal endpoints of + # devices instead of link endpoints. Filter those endpoints not reaching a new device. + if len(connection_hop_list) > 2 and connection_hop_list[0][0] == connection_hop_list[1][0]: + # same device on first 2 endpoints + connection_hop_list = connection_hop_list[1:] + if len(connection_hop_list) > 2 and connection_hop_list[-1][0] == connection_hop_list[-2][0]: + # same device on last 2 endpoints + connection_hop_list = connection_hop_list[:-1] + num_connection_hops = len(connection_hop_list) if num_connection_hops % 2 != 0: raise Exception('Number of connection hops must be even') if num_connection_hops < 4: raise Exception('Number of connection hops must be >= 4') diff --git a/src/slice/service/SliceService.py b/src/slice/service/SliceService.py index dc2584f82d0704080f16e83aa958ba0db6f08fe2..ac4e809762c1ffb6097506f34d519056f2bd3426 100644 --- a/src/slice/service/SliceService.py +++ b/src/slice/service/SliceService.py @@ -14,9 +14,10 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc +from common.proto.slice_pb2 import DESCRIPTOR as SLICE_DESCRIPTOR from common.proto.slice_pb2_grpc import add_SliceServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService -from slice.service.SliceServiceServicerImpl import SliceServiceServicerImpl +from .SliceServiceServicerImpl import SliceServiceServicerImpl class SliceService(GenericGrpcService): def __init__(self, cls_name: str = __name__) -> None: @@ -26,3 +27,5 @@ class SliceService(GenericGrpcService): def install_servicers(self): add_SliceServiceServicer_to_server(self.slice_servicer, self.server) + + self.add_reflection_service_name(SLICE_DESCRIPTOR, 'SliceService') diff --git a/src/tests/eucnc24/.gitlab-ci.yml b/src/tests/eucnc24/.gitlab-ci.yml index 8c5e9f20ba2e891cd39c89beee200b22088b6438..02c4cced3981f4c12042e636652dca95c384a169 100644 --- a/src/tests/eucnc24/.gitlab-ci.yml +++ b/src/tests/eucnc24/.gitlab-ci.yml @@ -70,6 +70,11 @@ end2end_test eucnc24: - sleep 3 - docker ps -a + # Dump configuration of the routers (before any configuration) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --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 @@ -126,12 +131,30 @@ end2end_test eucnc24: --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) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + # Run end-to-end test: test connectivity with ping - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.10' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.1' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.1' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.10' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.3.10' + - export TEST1_10=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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 - > @@ -140,6 +163,11 @@ end2end_test eucnc24: --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) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + # Run end-to-end test: configure service IETF - > docker run -t --rm --name ${TEST_NAME} --network=host @@ -147,12 +175,30 @@ end2end_test eucnc24: --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) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + # Run end-to-end test: test connectivity with ping - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.10' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.1' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.1' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.10' - - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.3.10' + - export TEST1_10=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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=$(sudo containerlab exec --name eucnc24 --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 IETF - > @@ -161,6 +207,11 @@ end2end_test eucnc24: --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) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + # Run end-to-end test: cleanup scenario - > docker run -t --rm --name ${TEST_NAME} --network=host @@ -169,6 +220,11 @@ end2end_test eucnc24: $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh after_script: + # Dump configuration of the routers (on after_script) + - sudo containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + - sudo containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\"" + # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server diff --git a/src/tests/eucnc24/README.md b/src/tests/eucnc24/README.md index f8c2f9d49793b8e0751ea4ea09bf893e7ceae0b6..3cc7974568028faa2bfbad70942ff2cc82bbafa0 100644 --- a/src/tests/eucnc24/README.md +++ b/src/tests/eucnc24/README.md @@ -8,7 +8,7 @@ ## TeraFlowSDN Deployment ```bash cd ~/tfs-ctrl -source dataplane-in-a-box/deploy_specs.sh +source ~/tfs-ctrl/src/tests/eucnc24/deploy_specs.sh ./deploy/all.sh ``` @@ -16,67 +16,55 @@ source dataplane-in-a-box/deploy_specs.sh ## Download and install ContainerLab ```bash -sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.48.6 +sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.59.0 ``` ## Download Arista cEOS image and create Docker image ```bash -cd ~/tfs-ctrl/dataplane-in-a-box -docker import arista/cEOS64-lab-4.31.2F.tar ceos:4.31.2F +cd ~/tfs-ctrl/src/tests/eucnc24/ +docker import arista/cEOS64-lab-4.32.2F.tar ceos:4.32.2F ``` ## Deploy scenario ```bash -cd ~/tfs-ctrl/dataplane-in-a-box -sudo containerlab deploy --topo arista.clab.yml +cd ~/tfs-ctrl/src/tests/eucnc24/ +sudo containerlab deploy --topo eucnc24.clab.yml ``` ## Inspect scenario ```bash -cd ~/tfs-ctrl/dataplane-in-a-box -sudo containerlab inspect --topo arista.clab.yml +cd ~/tfs-ctrl/src/tests/eucnc24/ +sudo containerlab inspect --topo eucnc24.clab.yml ``` ## Destroy scenario ```bash -cd ~/tfs-ctrl/dataplane-in-a-box -sudo containerlab destroy --topo arista.clab.yml -sudo rm -rf clab-arista/ .arista.clab.yml.bak +cd ~/tfs-ctrl/src/tests/eucnc24/ +sudo containerlab destroy --topo eucnc24.clab.yml +sudo rm -rf clab-eucnc24/ .eucnc24.clab.yml.bak ``` -## Access cEOS Bash +## Access cEOS Bash/CLI ```bash -docker exec -it clab-arista-r1 bash -``` - -## Access cEOS CLI -```bash -docker exec -it clab-arista-r1 Cli -docker exec -it clab-arista-r2 Cli +docker exec -it clab-eucnc24-r1 bash +docker exec -it clab-eucnc24-r2 bash +docker exec -it clab-eucnc24-r3 bash +docker exec -it clab-eucnc24-r1 Cli +docker exec -it clab-eucnc24-r2 Cli +docker exec -it clab-eucnc24-r3 Cli ``` ## Configure ContainerLab clients ```bash -docker exec -it clab-arista-client1 bash - ip address add 192.168.1.10/24 dev eth1 - ip route add 192.168.2.0/24 via 192.168.1.1 - ip route add 192.168.3.0/24 via 192.168.1.1 - ping 192.168.2.10 - ping 192.168.3.10 - -docker exec -it clab-arista-client2 bash - ip address add 192.168.2.10/24 dev eth1 - ip route add 192.168.1.0/24 via 192.168.2.1 - ip route add 192.168.3.0/24 via 192.168.2.1 - ping 192.168.1.10 - ping 192.168.3.10 - -docker exec -it clab-arista-client3 bash - ip address add 192.168.3.10/24 dev eth1 - ip route add 192.168.2.0/24 via 192.168.3.1 - ip route add 192.168.3.0/24 via 192.168.3.1 - ping 192.168.2.10 - ping 192.168.3.10 +docker exec -it clab-eucnc24-dc1 bash + ip address add 172.16.1.10/24 dev eth1 + ip route add 172.16.2.0/24 via 172.16.1.1 + ping 172.16.2.10 + +docker exec -it clab-eucnc24-dc2 bash + ip address add 172.16.2.10/24 dev eth1 + ip route add 172.16.1.0/24 via 172.16.2.1 + ping 172.16.1.10 ``` ## Install gNMIc @@ -86,38 +74,38 @@ sudo bash -c "$(curl -sL https://get-gnmic.kmrd.dev)" ## gNMI Capabilities request ```bash -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure capabilities +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure capabilities ``` ## gNMI Get request ```bash -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > wan1.json -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > wan1-ifaces.json +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > r1.json +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > r1-ifaces.json ``` ## gNMI Set request ```bash -#gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11 -#gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11 +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname ``` ## Subscribe request ```bash -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/ +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/ # In another terminal, you can generate traffic opening SSH connection -ssh admin@clab-arista-wan1 +ssh admin@clab-eucnc24-r1 ``` # Check configurations done: ```bash -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > wan1-nis.json -gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > wan1-ifs.json +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > r1-nis.json +gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > r1-ifs.json ``` # Delete elements: ```bash ---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' ---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' ---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' ``` diff --git a/src/tests/eucnc24/clab/eucnc24.clab.yml b/src/tests/eucnc24/clab/eucnc24.clab.yml index 807a1847c2c2f7580a699aada2d21c0d2577942d..aaf971e360b4770913b9aade3c21b348d700fa86 100644 --- a/src/tests/eucnc24/clab/eucnc24.clab.yml +++ b/src/tests/eucnc24/clab/eucnc24.clab.yml @@ -26,10 +26,11 @@ topology: kind: arista_ceos #image: ceos:4.30.4M #image: ceos:4.31.2F - #image: ceos:4.31.5M + #image: ceos:4.31.5M # tested, works #image: ceos:4.32.0F - image: ceos:4.32.2F + image: ceos:4.32.2F # tested, works #image: ceos:4.32.2.1F + #image: ceos:4.33.1F # does not work, libyang.util.LibyangError: failed to parse data tree: No module named "openconfig-platform-healthz" in the context. linux: kind: linux image: ghcr.io/hellt/network-multitool:latest @@ -38,30 +39,33 @@ topology: r1: kind: arista_ceos mgmt-ipv4: 172.20.20.101 + startup-config: r1-startup.cfg r2: kind: arista_ceos mgmt-ipv4: 172.20.20.102 + startup-config: r2-startup.cfg r3: kind: arista_ceos mgmt-ipv4: 172.20.20.103 + startup-config: r3-startup.cfg dc1: kind: linux - mgmt-ipv4: 172.20.20.211 + mgmt-ipv4: 172.20.20.201 exec: - ip link set address 00:c1:ab:00:01:01 dev eth1 - - ip address add 192.168.1.10/24 dev eth1 - - ip route add 192.168.2.0/24 via 192.168.1.1 + - ip address add 172.16.1.10/24 dev eth1 + - ip route add 172.16.2.0/24 via 172.16.1.1 dc2: kind: linux - mgmt-ipv4: 172.20.20.221 + mgmt-ipv4: 172.20.20.202 exec: - ip link set address 00:c1:ab:00:02:01 dev eth1 - - ip address add 192.168.2.10/24 dev eth1 - - ip route add 192.168.1.0/24 via 192.168.2.1 + - ip address add 172.16.2.10/24 dev eth1 + - ip route add 172.16.1.0/24 via 172.16.2.1 links: - endpoints: ["r1:eth2", "r2:eth1"] diff --git a/src/tests/eucnc24/clab/r1-startup.cfg b/src/tests/eucnc24/clab/r1-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..b7feebe067b9c77572d63b719a588a4a2aa44cb9 --- /dev/null +++ b/src/tests/eucnc24/clab/r1-startup.cfg @@ -0,0 +1,48 @@ +! device: r1 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r1 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet2 +! +interface Ethernet10 +! +interface Management0 + ip address 172.20.20.101/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/eucnc24/clab/r2-startup.cfg b/src/tests/eucnc24/clab/r2-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..e1ab661a0ab455ab22f025ec6b2f96cf42a9f2dd --- /dev/null +++ b/src/tests/eucnc24/clab/r2-startup.cfg @@ -0,0 +1,48 @@ +! device: r2 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r2 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet1 +! +interface Ethernet3 +! +interface Management0 + ip address 172.20.20.102/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/eucnc24/clab/r3-startup.cfg b/src/tests/eucnc24/clab/r3-startup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..63c0625931e5a4645c8ae8741a2b5bd5fe8a28d6 --- /dev/null +++ b/src/tests/eucnc24/clab/r3-startup.cfg @@ -0,0 +1,48 @@ +! device: r3 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build)) +! +no aaa root +! +username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70 +! +management api http-commands + no shutdown +! +no service interface inactive port-id allocation disabled +! +transceiver qsfp default-mode 4x10G +! +service routing protocols model multi-agent +! +hostname r3 +! +spanning-tree mode mstp +! +system l1 + unsupported speed action error + unsupported error-correction action error +! +management api gnmi + transport grpc default +! +management api netconf + transport ssh default +! +interface Ethernet2 +! +interface Ethernet10 +! +interface Management0 + ip address 172.20.20.103/24 +! +ip routing +! +ip route 0.0.0.0/0 172.20.20.1 +! +router multicast + ipv4 + software-forwarding kernel + ! + ipv6 + software-forwarding kernel +! +end diff --git a/src/tests/eucnc24/data/ietf-l3vpn-service.json b/src/tests/eucnc24/data/ietf-l3vpn-service.json index a6297b28f0fea94dcc8a457ad2b45d38e77aa4ea..a0f28ee063c97aaabdd3fdda679e8ebbcd8089dc 100644 --- a/src/tests/eucnc24/data/ietf-l3vpn-service.json +++ b/src/tests/eucnc24/data/ietf-l3vpn-service.json @@ -11,7 +11,7 @@ "site-network-accesses": { "site-network-access": [ { - "site-network-access-id": "int", + "site-network-access-id": "eth1", "site-network-access-type": "ietf-l3vpn-svc:multipoint", "device-reference": "dc1", "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:spoke-role"}, @@ -19,8 +19,8 @@ "ipv4": { "address-allocation-type": "ietf-l3vpn-svc:static-address", "addresses": { - "provider-address": "192.168.1.1", - "customer-address": "192.168.1.10", + "provider-address": "172.16.1.1", + "customer-address": "172.16.1.10", "prefix-length": 24 } } @@ -48,7 +48,7 @@ "site-network-accesses": { "site-network-access": [ { - "site-network-access-id": "int", + "site-network-access-id": "eth1", "site-network-access-type": "ietf-l3vpn-svc:multipoint", "device-reference": "dc2", "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:hub-role"}, @@ -56,8 +56,8 @@ "ipv4": { "address-allocation-type": "ietf-l3vpn-svc:static-address", "addresses": { - "provider-address": "192.168.2.1", - "customer-address": "192.168.2.10", + "provider-address": "172.16.2.1", + "customer-address": "172.16.2.10", "prefix-length": 24 } } diff --git a/src/tests/eucnc24/data/tfs-service.json b/src/tests/eucnc24/data/tfs-service.json index 397fc84789111932da047acd22c7bc787888657f..e4bb7c2d255d2f119cd5c9646d01450ac4bffd9c 100644 --- a/src/tests/eucnc24/data/tfs-service.json +++ b/src/tests/eucnc24/data/tfs-service.json @@ -14,11 +14,11 @@ "service_config": {"config_rules": [ {"action": "CONFIGACTION_SET", "custom": { "resource_key": "/device[dc1]/endpoint[eth1]/settings", - "resource_value": {"address_ip": "192.168.1.10", "address_prefix": 24, "index": 0} + "resource_value": {"address_ip": "172.16.1.10", "address_prefix": 24, "index": 0} }}, {"action": "CONFIGACTION_SET", "custom": { "resource_key": "/device[dc2]/endpoint[eth1]/settings", - "resource_value": {"address_ip": "192.168.2.10", "address_prefix": 24, "index": 0} + "resource_value": {"address_ip": "172.16.2.10", "address_prefix": 24, "index": 0} }} ]} } diff --git a/src/tests/p4-fwd-l1/tests/Objects.py b/src/tests/p4-fwd-l1/tests/Objects.py index ba260e936805e57fb8f07761b1e5fc79cffbaf8f..83d1e23b438693f3dbe6b657d0332a4f0a9d1680 100644 --- a/src/tests/p4-fwd-l1/tests/Objects.py +++ b/src/tests/p4-fwd-l1/tests/Objects.py @@ -13,18 +13,12 @@ # limitations under the License. import os -from typing import Dict, List, Tuple from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME from common.tools.object_factory.Context import json_context, json_context_id from common.tools.object_factory.Device import ( - json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled, - json_device_connect_rules, json_device_id, json_device_p4_disabled, - json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled) -from common.tools.object_factory.Service import ( - get_service_uuid, json_service_l3nm_planned,json_service_p4_planned) -from common.tools.object_factory.ConfigRule import ( - json_config_rule_set, json_config_rule_delete) -from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_ids, json_endpoints, json_endpoint_id + json_device_connect_rules, json_device_id, json_device_p4_disabled) +from common.tools.object_factory.Service import get_service_uuid, json_service_p4_planned +from common.tools.object_factory.EndPoint import json_endpoint_ids, json_endpoints from common.tools.object_factory.EndPoint import json_endpoint_descriptor from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id from common.tools.object_factory.Topology import json_topology, json_topology_id diff --git a/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py b/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py index fe622c908b44ed28a5c91ca8b35b8524511de388..341799c0224794bd32e0a81a02c593bd1173eca1 100644 --- a/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py +++ b/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py @@ -14,14 +14,9 @@ import copy, logging, pytest 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 context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ConfigActionEnum, Context, ContextId, Device, Empty, Link, Topology, DeviceOperationalStatusEnum +from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology, DeviceOperationalStatusEnum from device.client.DeviceClient import DeviceClient from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES diff --git a/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py b/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py index 67934ff8a78f79252ef4b6994c3b628a8275c503..0b44f794d7201f49034c536c8988798ac9b44bc7 100644 --- a/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py +++ b/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py @@ -12,18 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import copy, logging, pytest +import logging, pytest 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 -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 context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ConfigActionEnum, ContextId, Device, DeviceId, Empty, Link, LinkId, TopologyId, DeviceOperationalStatusEnum +from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId from device.client.DeviceClient import DeviceClient -from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES +from .Objects import CONTEXTS, DEVICES, LINKS, TOPOLOGIES LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-fwd-l1/tests/test_functional_create_service.py b/src/tests/p4-fwd-l1/tests/test_functional_create_service.py index 9f82da129e159f02d40ee57b890409b0a5685b75..ee714c4774e417a9afb84554d4dc99fe57d96863 100644 --- a/src/tests/p4-fwd-l1/tests/test_functional_create_service.py +++ b/src/tests/p4-fwd-l1/tests/test_functional_create_service.py @@ -14,24 +14,16 @@ import copy, logging, pytest 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.Service import json_service_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 context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology, Service, ServiceId +from common.proto.context_pb2 import Service from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from tests.p4.tests.Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES, SERVICES -from common.proto.context_pb2 import ConfigActionEnum, Device, DeviceId,\ - DeviceOperationalStatusEnum +from tests.p4.tests.Objects import SERVICES LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) + @pytest.fixture(scope='session') def context_client(): _client = ContextClient(get_setting('CONTEXTSERVICE_SERVICE_HOST'), get_setting('CONTEXTSERVICE_SERVICE_PORT_GRPC')) diff --git a/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py b/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py index 98b6a01c1be2a00003b3be267839a4513967d4f7..439a88efd3f72dbd1389d9d47494fa891ff2b2d2 100644 --- a/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py +++ b/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py @@ -14,18 +14,12 @@ import copy, logging, pytest 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 -from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Service import json_service_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 context.client.EventsCollector import EventsCollector -from common.proto.context_pb2 import ConfigActionEnum, ContextId, Device, DeviceId, Empty, LinkId, TopologyId, Service, ServiceId, DeviceOperationalStatusEnum +from common.proto.context_pb2 import ServiceId from device.client.DeviceClient import DeviceClient from service.client.ServiceClient import ServiceClient -from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES, SERVICES +from .Objects import CONTEXT_ID, SERVICES LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/tests/p4-int-routing-acl/README.md b/src/tests/p4-int-routing-acl/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fa935e1b2eae2decb0e852ebd72b752c3d67ca28 --- /dev/null +++ b/src/tests/p4-int-routing-acl/README.md @@ -0,0 +1,129 @@ +# Tests for P4 routing, ACL, and In-Band Network Telemetry functions + +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 routing, access control list (ACL), and In-Band Network Telemetry (INT). + +## 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. + +### TFS re-deploy + +```shell +cd ~/tfs-ctrl/ +source my_deploy.sh && source tfs_runtime_env_vars.sh +./deploy/all.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 + +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. + +## 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 + +The following tests are implemented. +For each of these tests, an auxiliary bash script allows to run it with less typing. + +| Test | Bash Runner | Purpose | +| ------------------------------------ | ---------------------------------- | ---------------------------------- | +| - | setup.sh | Copy P4 artifacts into the SBI pod | +| test_functional_bootstrap.py | run_test_01_bootstrap.sh | Connect TFS to the P4 switch | +| test_functional_rules_provision.py | run_test_02_rules_provision.sh | Install rules on the P4 switch | +| test_functional_rules_deprovision.py | run_test_03_rules_deprovision.sh | Uninstall rules from the P4 switch | +| test_functional_cleanup.py | run_test_04_cleanup.sh | Disconnect TFS from the P4 switch | + +Each of the tests above is described in detail below. + +### Step 1: 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-int-routing-acl/setup.sh +``` + +### Step 2: Bootstrap topology + +The bootstrap script registers the context, topology, links, and devices to TFS. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh +``` + +### Step 3: Provision rules via the SBI API + +Implement routing, ACL, and INT functions by installing P4 rules to the Stratum switch via the TFS SBI API. + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh +``` + +### Step 4: Deprovision rules via the SBI API + +Deprovision the 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-int-routing-acl/run_test_03_rules_deprovision.sh +``` + +### Step 4: Deprovision topology + +Delete all the objects (context, topology, links, devices) from TFS: + +```shell +cd ~/tfs-ctrl/ +bash src/tests/p4-int-routing-acl/run_test_04_cleanup.sh +``` diff --git a/src/tests/p4-int-routing-acl/__init__.py b/src/tests/p4-int-routing-acl/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2 --- /dev/null +++ b/src/tests/p4-int-routing-acl/__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-int-routing-acl/descriptors/rules-insert-acl.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-acl.json new file mode 100644 index 0000000000000000000000000000000000000000..97a548983f29c7af8c1da21fda5ab09b45a940aa --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-acl.json @@ -0,0 +1,39 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.acl.acl[1]", + "resource_value": { + "table-name": "FabricIngress.acl.acl", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "l4_dport", + "match-value": "8080" + } + ], + "action-name": "FabricIngress.acl.drop", + "action-params": [], + "priority": 1 + } + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json new file mode 100644 index 0000000000000000000000000000000000000000..3fc9a71732aef424b85c9b91b255083b3e1badbb --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json @@ -0,0 +1,136 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[1]", + "resource_value": { + "table-name": "FabricIngress.int_watchlist.watchlist", + "match-fields": [ + { + "match-field": "ipv4_valid", + "match-value": "1" + } + ], + "action-name": "FabricIngress.int_watchlist.mark_to_report", + "action-params": [], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[1]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "510" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "3" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[1]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "510" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[1]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "510" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "2" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[2]", + "resource_value": { + "table-name": "FabricIngress.int_watchlist.watchlist", + "match-fields": [ + { + "match-field": "ipv4_valid", + "match-value": "1" + }, + { + "match-field": "ipv4_dst", + "match-value": "10.10.10.41&&&0xFFFFFFFF" + } + ], + "action-name": "FabricIngress.int_watchlist.no_report_collector", + "action-params": [], + "priority": 10 + } + } + } + ] + } + } + ] +} diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json new file mode 100644 index 0000000000000000000000000000000000000000..e6b5a8ea8590586b2aeee46eb9b736b1e27ba35e --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json @@ -0,0 +1,269 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[1]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "4" + }, + { + "match-field": "mirror_type", + "match-value": "0" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[2]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[3]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "1" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[4]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "5" + }, + { + "match-field": "mirror_type", + "match-value": "0" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[5]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "2" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[6]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "3" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + } + ] + } + } + ] +} diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json new file mode 100644 index 0000000000000000000000000000000000000000..f8d2c71830d3ef55ea8ffd97e3557fc9d8cc6315 --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json @@ -0,0 +1,212 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[2]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "3" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[2]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "3" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[2]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "3" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[1]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:fb:cf:96" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "3" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[1]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "3" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "3" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[1]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "10.10.10.41/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "3" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[2]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "3" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "3" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:93:8c:c0" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:fb:cf:96" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/clone_sessions/clone_session[1]", + "resource_value": { + "session-id": 506, + "replicas": [ + { + "egress-port": 510, + "instance": 0 + } + ] + } + } + } + ] + } + } + ] +} diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json new file mode 100644 index 0000000000000000000000000000000000000000..0fe8b5036f8446f65e8fca85ddeea97cd6ed8cd0 --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json @@ -0,0 +1,197 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[4]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "2" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[4]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "2" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[4]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "2" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[3]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:e2:af:28" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "2" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[5]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "2" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "2" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[3]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "172.16.10.9/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "2" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[6]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "2" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "2" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:9b:cb:a1" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:e2:af:28" + } + ] + } + } + } + ] + } + } + ] +} diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json new file mode 100644 index 0000000000000000000000000000000000000000..c48d9d31e2b36dd1710ab53d51280759e82cca1c --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json @@ -0,0 +1,197 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[3]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[3]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[3]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "1" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[2]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:58:92:ba" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "1" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[3]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "1" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[2]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "10.158.72.25/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[4]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "1" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "1" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:e2:af:28" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:58:92:ba" + } + ] + } + } + } + ] + } + } + ] +} diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-remove.json b/src/tests/p4-int-routing-acl/descriptors/rules-remove.json new file mode 100644 index 0000000000000000000000000000000000000000..68132e9e6ec09435cfcbaae16a9c2287e9c649b5 --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/rules-remove.json @@ -0,0 +1,965 @@ +{ + "devices": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "name": "p4-sw1", + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[1]", + "resource_value": { + "table-name": "FabricIngress.int_watchlist.watchlist", + "match-fields": [ + { + "match-field": "ipv4_valid", + "match-value": "1" + } + ], + "action-name": "FabricIngress.int_watchlist.mark_to_report", + "action-params": [], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[1]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "510" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "3" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[1]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "510" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[1]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "510" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "2" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[1]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "4" + }, + { + "match-field": "mirror_type", + "match-value": "0" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[2]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[3]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "1" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[4]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "5" + }, + { + "match-field": "mirror_type", + "match-value": "0" + }, + { + "match-field": "int_report_type", + "match-value": "4" + } + ], + "action-name": "FabricEgress.int_egress.do_drop_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[5]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "2" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.int_egress.report[6]", + "resource_value": { + "table-name": "FabricEgress.int_egress.report", + "match-fields": [ + { + "match-field": "bmd_type", + "match-value": "2" + }, + { + "match-field": "mirror_type", + "match-value": "1" + }, + { + "match-field": "int_report_type", + "match-value": "3" + } + ], + "action-name": "FabricEgress.int_egress.do_local_report_encap", + "action-params": [ + { + "action-param": "src_ip", + "action-value": "10.10.10.120" + }, + { + "action-param": "mon_ip", + "action-value": "10.10.10.41" + }, + { + "action-param": "mon_port", + "action-value": "32766" + }, + { + "action-param": "switch_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[2]", + "resource_value": { + "table-name": "FabricIngress.int_watchlist.watchlist", + "match-fields": [ + { + "match-field": "ipv4_valid", + "match-value": "1" + }, + { + "match-field": "ipv4_dst", + "match-value": "10.10.10.41&&&0xFFFFFFFF" + } + ], + "action-name": "FabricIngress.int_watchlist.no_report_collector", + "action-params": [], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[2]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "3" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[2]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "3" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[2]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "3" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[1]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:fb:cf:96" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "3" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[1]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "3" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "3" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[1]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "10.10.10.41/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "3" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[2]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "3" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "3" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:93:8c:c0" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:fb:cf:96" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/clone_sessions/clone_session[1]", + "resource_value": { + "session-id": 506, + "replicas": [ + { + "egress-port": 510, + "instance": 0 + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[3]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[3]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[3]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "1" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[2]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:58:92:ba" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "1" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[3]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "1" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[2]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "10.158.72.25/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "1" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[4]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "1" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "1" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:e2:af:28" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:58:92:ba" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[4]", + "resource_value": { + "table-name": "FabricIngress.filtering.ingress_port_vlan", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "2" + }, + { + "match-field": "vlan_is_valid", + "match-value": "0" + } + ], + "action-name": "FabricIngress.filtering.permit_with_internal_vlan", + "action-params": [ + { + "action-param": "vlan_id", + "action-value": "4094" + }, + { + "action-param": "port_type", + "action-value": "1" + } + ], + "priority": 10 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[4]", + "resource_value": { + "table-name": "FabricIngress.filtering.fwd_classifier", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "2" + }, + { + "match-field": "ip_eth_type", + "match-value": "0x0800" + } + ], + "action-name": "FabricIngress.filtering.set_forwarding_type", + "action-params": [ + { + "action-param": "fwd_type", + "action-value": "0" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[4]", + "resource_value": { + "table-name": "FabricEgress.egress_next.egress_vlan", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eg_port", + "match-value": "2" + } + ], + "action-name": "FabricEgress.egress_next.pop_vlan", + "action-params": [] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.bridging[3]", + "resource_value": { + "table-name": "FabricIngress.forwarding.bridging", + "match-fields": [ + { + "match-field": "vlan_id", + "match-value": "4094" + }, + { + "match-field": "eth_dst", + "match-value": "fa:16:3e:e2:af:28" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_bridging", + "action-params": [ + { + "action-param": "next_id", + "action-value": "2" + } + ], + "priority": 1 + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[5]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "2" + } + ], + "action-name": "FabricIngress.next.output_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "2" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[3]", + "resource_value": { + "table-name": "FabricIngress.forwarding.routing_v4", + "match-fields": [ + { + "match-field": "ipv4_dst", + "match-value": "172.16.10.9/32" + } + ], + "action-name": "FabricIngress.forwarding.set_next_id_routing_v4", + "action-params": [ + { + "action-param": "next_id", + "action-value": "2" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.next.simple[6]", + "resource_value": { + "table-name": "FabricIngress.next.simple", + "match-fields": [ + { + "match-field": "next_id", + "match-value": "2" + } + ], + "action-name": "FabricIngress.next.routing_simple", + "action-params": [ + { + "action-param": "port_num", + "action-value": "2" + }, + { + "action-param": "smac", + "action-value": "fa:16:3e:9b:cb:a1" + }, + { + "action-param": "dmac", + "action-value": "fa:16:3e:e2:af:28" + } + ] + } + } + }, + { + "action": "CONFIGACTION_DELETE", + "custom": { + "resource_key": "/tables/table/FabricIngress.acl.acl[1]", + "resource_value": { + "table-name": "FabricIngress.acl.acl", + "match-fields": [ + { + "match-field": "ig_port", + "match-value": "1" + }, + { + "match-field": "l4_dport", + "match-value": "8080" + } + ], + "action-name": "FabricIngress.acl.drop", + "action-params": [], + "priority": 1 + } + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/tests/p4-int-routing-acl/descriptors/topology.json b/src/tests/p4-int-routing-acl/descriptors/topology.json new file mode 100644 index 0000000000000000000000000000000000000000..3b1f6e410cc5a2adc1c99b6208523fd9a9971fe7 --- /dev/null +++ b/src/tests/p4-int-routing-acl/descriptors/topology.json @@ -0,0 +1,288 @@ +{ + "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": "edge-net" + } + }, + "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", + "type": "copper" + } + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "corporate-net" + } + }, + "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", + "type": "copper" + } + ] + } + } + } + ] + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "device_type": "p4-switch", + "device_drivers": [ + "DEVICEDRIVER_P4" + ], + "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED", + "name": "p4-sw1", + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "10.10.10.120" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "50001" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": { + "id": 1, + "name": "p4-sw1", + "vendor": "Open Networking Foundation", + "hw_ver": "BMv2 simple_switch", + "sw_ver": "Stratum", + "p4bin": "/root/p4/bmv2.json", + "p4info": "/root/p4/p4info.txt", + "timeout": 60, + "endpoints": [ + { + "uuid": "1", + "type": "port" + }, + { + "uuid": "2", + "type": "port" + } + ] + } + } + } + ] + } + } + ], + "links": [ + { + "link_id": { + "link_uuid": { + "uuid": "p4-sw1/1==edge-net/eth1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "edge-net" + } + }, + "endpoint_uuid": { + "uuid": "eth1" + } + } + ] + }, + { + "link_id": { + "link_uuid": { + "uuid": "edge-net/eth1==p4-sw1/1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "edge-net" + } + }, + "endpoint_uuid": { + "uuid": "eth1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "endpoint_uuid": { + "uuid": "1" + } + } + ] + }, + { + "link_id": { + "link_uuid": { + "uuid": "p4-sw1/2==corporate-net/eth1" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "corporate-net" + } + }, + "endpoint_uuid": { + "uuid": "eth1" + } + } + ] + }, + { + "link_id": { + "link_uuid": { + "uuid": "corporate-net/eth1==p4-sw1/2" + } + }, + "link_endpoint_ids": [ + { + "device_id": { + "device_uuid": { + "uuid": "corporate-net" + } + }, + "endpoint_uuid": { + "uuid": "eth1" + } + }, + { + "device_id": { + "device_uuid": { + "uuid": "p4-sw1" + } + }, + "endpoint_uuid": { + "uuid": "2" + } + } + ] + } + ] +} diff --git a/src/tests/p4-int-routing-acl/p4src/README.md b/src/tests/p4-int-routing-acl/p4src/README.md new file mode 100644 index 0000000000000000000000000000000000000000..07e34066fbc19fb3f1778a64c65723513b8081df --- /dev/null +++ b/src/tests/p4-int-routing-acl/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-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-int-routing-acl/p4src/_pp.p4 b/src/tests/p4-int-routing-acl/p4src/_pp.p4 new file mode 100644 index 0000000000000000000000000000000000000000..1b2b718a1e96f807e1da6139ababf9e71a881cd0 --- /dev/null +++ b/src/tests/p4-int-routing-acl/p4src/_pp.p4 @@ -0,0 +1,2037 @@ +error { + PacketRejectedByParser +} +#include <core.p4> +#define V1MODEL_VERSION 20180101 +#include <v1model.p4> + +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; +} + +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; + int_bridged_metadata_t int_bmd; + bit<1> _pad0; + 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; + 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 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<fake_ethernet_t>(); + 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<packet_out_header_t>(); + 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<fake_ethernet_t>(); + 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<bit<16>>()) { + 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<bit<16>>()) { + 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<bit<4>>()) { + 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<gtpu_t>(); + 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<bit<8>>(); + 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); + } + direct_counter(CounterType.packets_and_bytes) simple_counter; + action output_simple(FabricPortId_t port_num) { + output(port_num); + simple_counter.count(); + } + action routing_simple(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) { + routing(port_num, smac, dmac); + simple_counter.count(); + } + table simple { + key = { + fabric_md.next_id: exact @name("next_id") ; + } + actions = { + output_simple; + routing_simple; + @defaultonly nop; + } + const default_action = nop(); + counters = simple_counter; + size = 1024; + } + @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 { + simple.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 (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 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; + 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<bit<32>>(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; + 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; + 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) { + 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; + 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); + 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-int-routing-acl/p4src/bmv2.json b/src/tests/p4-int-routing-acl/p4src/bmv2.json new file mode 100644 index 0000000000000000000000000000000000000000..80136b953ec822618243c8d325fbfbca201ab7cc --- /dev/null +++ b/src/tests/p4-int-routing-acl/p4src/bmv2.json @@ -0,0 +1,21728 @@ +{ + "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", 48, false], + ["tmp_19", 48, false], + ["tmp_20", 16, false], + ["tmp_21", 32, false], + ["tmp_22", 32, false], + ["tmp_23", 8, false], + ["tmp_24", 16, false], + ["tmp_25", 16, false], + ["tmp_26", 32, false], + ["qos_packet_color", 2, false], + ["tmp_27", 32, false], + ["tmp_28", 32, false], + ["tmp_29", 32, false], + ["tmp_30", 32, false], + ["tmp_31", 32, false], + ["tmp_32", 32, false], + ["tmp_33", 32, false], + ["tmp_34", 32, false], + ["tmp_35", 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_int_md_hop_latency39", 32, false], + ["userMetadata._egress_int_md_timestamp40", 48, false], + ["userMetadata._egress_int_md_vlan_stripped41", 1, false], + ["userMetadata._egress_int_md_queue_report42", 1, false], + ["userMetadata._egress_int_ipv4_len43", 16, false], + ["userMetadata._egress_is_int_recirc44", 1, false], + ["userMetadata._egress_pkt_length45", 16, false], + ["userMetadata._recirc_preserved_report_type46", 3, false], + ["userMetadata._recirc_preserved_egress_port47", 9, false], + ["userMetadata._recirc_preserved_drop_reason48", 8, false], + ["userMetadata._recirc_preserved_ingress_port49", 9, false], + ["_padding_1", 5, 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], + ["_int_bmd_report_type13", 3, false], + ["_int_bmd_mirror_session_id14", 10, false], + ["_int_bmd_drop_reason15", 8, false], + ["_int_bmd_queue_id16", 5, false], + ["_int_bmd_egress_port17", 9, false], + ["_int_bmd_wip_type18", 8, false], + ["__pad019", 1, false], + ["__pad220", 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_ipv437", + "id" : 63, + "header_type" : "ipv4_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_ipv638", + "id" : 64, + "header_type" : "ipv6_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_udp39", + "id" : 65, + "header_type" : "udp_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_ingress_bridged4", + "id" : 66, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_bridged36", + "id" : 67, + "header_type" : "bridged_metadata_t", + "metadata" : false, + "pi_omit" : true + }, + { + "name" : "_egress_int_report_md38", + "id" : 68, + "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_type46"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"] + } + ] + }, + { + "id" : 2, + "name" : "field_list231", + "elements" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port49"] + } + ] + }, + { + "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_length45"] + }, + { + "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_port49"] + }, + { + "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_reason15"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "op" : "set" + }, + { + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_wip_type18"] + }, + { + "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_type18"] + }, + { + "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_type18"] + }, + { + "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/tfs-setup/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/tfs-setup/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" + } + ], + "counter_arrays" : [ + { + "name" : "FabricIngress.stats.flow_counter", + "id" : 0, + "is_direct" : true, + "binding" : "FabricIngress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 19, + "column" : 50, + "source_fragment" : "acl_counter" + } + }, + { + "name" : "FabricIngress.next.simple_counter", + "id" : 11, + "is_direct" : true, + "binding" : "FabricIngress.next.simple", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 76, + "column" : 50, + "source_fragment" : "simple_counter" + } + }, + { + "name" : "FabricIngress.next.hashed_counter", + "id" : 12, + "is_direct" : true, + "binding" : "FabricIngress.next.hashed", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 115, + "column" : 50, + "source_fragment" : "hashed_counter" + } + }, + { + "name" : "FabricIngress.next.multicast_counter", + "id" : 13, + "is_direct" : true, + "binding" : "FabricIngress.next.multicast", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 14, + "is_direct" : true, + "binding" : "FabricIngress.slice_tc_classifier.classifier", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 20, + "column" : 40, + "source_fragment" : "classifier_stats" + } + }, + { + "name" : "FabricIngress.qos.queues_stats", + "id" : 15, + "is_direct" : true, + "binding" : "FabricIngress.qos.queues", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 106, + "column" : 40, + "source_fragment" : "queues_stats" + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist_counter", + "id" : 16, + "is_direct" : true, + "binding" : "FabricIngress.int_watchlist.watchlist", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 17, + "is_direct" : true, + "binding" : "FabricIngress.int_ingress.drop_report", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 64, + "column" : 50, + "source_fragment" : "drop_report_counter" + } + }, + { + "name" : "FabricEgress.stats.flow_counter", + "id" : 18, + "is_direct" : true, + "binding" : "FabricEgress.stats.flows", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 19, + "is_direct" : true, + "binding" : "FabricEgress.egress_next.egress_vlan", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 241, + "column" : 50, + "source_fragment" : "egress_vlan_counter" + } + }, + { + "name" : "FabricEgress.int_egress.report_counter", + "id" : 20, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.report", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 21, + "is_direct" : true, + "binding" : "FabricEgress.int_egress.int_metadata", + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_15"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_16"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_17"] + } + ] + }, + { + "name" : "calc_0", + "id" : 1, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_18"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_19"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_20"] + } + ] + }, + { + "name" : "calc_1", + "id" : 2, + "algo" : "crc32", + "input" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + } + ] + }, + { + "name" : "calc_2", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_3", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_4", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_5", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_6", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : "NoAction", + "id" : 6, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.stats.count", + "id" : 7, + "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/tfs-setup/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" : 8, + "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/tfs-setup/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_port47"] + }, + { + "type" : "field", + "value" : ["_ingress_packet_out0", "egress_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 20, + "column" : 8, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "FabricIngress.filtering.deny", + "id" : 9, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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_reason15"] + }, + { + "type" : "hexstr", + "value" : "0x37" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 250, + "column" : 41, + "source_fragment" : "55, ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.permit", + "id" : 10, + "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/tfs-setup/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" : 11, + "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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4", + "line" : 33, + "column" : 31, + "source_fragment" : "= port_type; ..." + } + } + ] + }, + { + "name" : "FabricIngress.filtering.set_forwarding_type", + "id" : 12, + "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/tfs-setup/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" : 13, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 14, + "runtime_data" : [ + { + "name" : "drop_reason", + "bitwidth" : 8 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason15"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "local", + "value" : 0 + }, + "right" : { + "type" : "hexstr", + "value" : "0xff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 17, + "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/tfs-setup/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" : 18, + "runtime_data" : [ + { + "name" : "next_id", + "bitwidth" : 32 + } + ], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 19, + "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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.nop_routing_v4", + "id" : 20, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v4", + "id" : 21, + "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/tfs-setup/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/tfs-setup/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" : 22, + "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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 23, + "column" : 26, + "source_fragment" : "= next_id; ..." + } + } + ] + }, + { + "name" : "FabricIngress.forwarding.drop_routing_v6", + "id" : 23, + "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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4", + "line" : 152, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.pre_next.set_mpls_label", + "id" : 24, + "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/tfs-setup/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" : 25, + "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/tfs-setup/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" : 26, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 27, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.copy_to_cpu", + "id" : 27, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 28, + "runtime_data" : [], + "primitives" : [ + { + "op" : "clone_ingress_pkt_to_egress", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x000001ff" + }, + { + "type" : "hexstr", + "value" : "0x2" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 42, + "column" : 17, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.drop", + "id" : 29, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_reason15"] + }, + { + "type" : "hexstr", + "value" : "0x50" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 252, + "column" : 27, + "source_fragment" : "80, ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.set_output_port", + "id" : 30, + "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/tfs-setup/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_port47"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4", + "line" : 66, + "column" : 17, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.acl.nop_acl", + "id" : 31, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricIngress.next.output_simple", + "id" : 32, + "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/tfs-setup/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_port47"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_simple", + "id" : 33, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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_port47"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.output_hashed", + "id" : 34, + "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/tfs-setup/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_port47"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.routing_hashed", + "id" : 35, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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_port47"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 18, + "column" : 34, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.next.set_mcast_group_id", + "id" : 36, + "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/tfs-setup/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/tfs-setup/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" : 37, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "mcast_grp"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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" : 38, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 25, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.no_classification", + "id" : 39, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_slice_id26"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 31, + "column" : 29, + "source_fragment" : "= true; ..." + } + } + ] + }, + { + "name" : "FabricIngress.slice_tc_classifier.trust_dscp", + "id" : 40, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 40, + "column" : 29, + "source_fragment" : "= false; ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.use_upf", + "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_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/tfs-setup/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" : 42, + "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/tfs-setup/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" : 43, + "runtime_data" : [ + { + "name" : "qid", + "bitwidth" : 5 + } + ], + "primitives" : [] + }, + { + "name" : "FabricIngress.qos.meter_drop", + "id" : 44, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason15"] + }, + { + "type" : "hexstr", + "value" : "0xa0" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 269, + "column" : 36, + "source_fragment" : "160, ..." + } + } + ] + }, + { + "name" : "FabricIngress.qos.set_default_tc", + "id" : 45, + "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/tfs-setup/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.int_watchlist.mark_to_report", + "id" : 46, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type13"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type46"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 223, + "column" : 45, + "source_fragment" : "1; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report", + "id" : 47, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type46"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_watchlist.no_report_collector", + "id" : 48, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_report_type13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 219, + "column" : 50, + "source_fragment" : "0; ..." + } + } + ] + }, + { + "name" : "FabricIngress.int_ingress.report_drop", + "id" : 49, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_bmd_type0"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "fabric_v1model64", + "id" : 50, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 64, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model61", + "id" : 51, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 61, + "column" : 8, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model70", + "id" : 52, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_ig_port3"] + }, + { + "type" : "hexstr", + "value" : "0x01fe" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 36, + "column" : 42, + "source_fragment" : "510; ..." + } + } + ] + }, + { + "name" : "lookup_md_init21", + "id" : 53, + "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/tfs-setup/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" : 54, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 19, + "column" : 23, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "lookup_md_init38", + "id" : 55, + "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/tfs-setup/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/tfs-setup/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" : 56, + "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/tfs-setup/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/tfs-setup/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" : 57, + "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/tfs-setup/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/tfs-setup/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" : 58, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 59, + "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/tfs-setup/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/tfs-setup/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" : 60, + "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/tfs-setup/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/tfs-setup/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" : 61, + "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/tfs-setup/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/tfs-setup/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" : 62, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 63, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4", + "line" : 31, + "column" : 25, + "source_fragment" : "= 0; ..." + } + } + ] + }, + { + "name" : "filtering100", + "id" : 64, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_14"] + }, + { + "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/tfs-setup/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_14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : "hasher39", + "id" : 65, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_15"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_16"] + }, + { + "type" : "field", + "value" : ["_ingress_ipv47", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_17"] + }, + { + "type" : "field", + "value" : ["_ingress_gtpu12", "teid"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 39, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher50", + "id" : 66, + "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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 50, + "column" : 32, + "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..." + } + } + ] + }, + { + "name" : "hasher66", + "id" : 67, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_base_inner_hash1"] + }, + { + "type" : "hexstr", + "value" : "0x00000000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_18"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "dst_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_19"] + }, + { + "type" : "field", + "value" : ["_ingress_ethernet3", "src_addr"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_20"] + }, + { + "type" : "field", + "value" : ["_ingress_eth_type5", "value"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_0" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 67, + "column" : 12, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "hasher17", + "id" : 68, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_21"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_22"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_23"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_24"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 91, + "column" : 34, + "source_fragment" : "fabric_md" + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_25"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_1" + }, + { + "type" : "hexstr", + "value" : "0xffffffff" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4", + "line" : 17, + "column" : 8, + "source_fragment" : "hash( ..." + } + } + ] + }, + { + "name" : "slicing174", + "id" : 69, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_26"] + }, + { + "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/tfs-setup/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_26"] + }, + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 70, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "qos_packet_color"] + }, + { + "type" : "hexstr", + "value" : "0x02" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4", + "line" : 25, + "column" : 10, + "source_fragment" : "2 ..." + } + } + ] + }, + { + "name" : "int112", + "id" : 71, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_ingress_bridged4", "_int_bmd_egress_port17"] + }, + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_id16"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 72, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 110, + "column" : 12, + "source_fragment" : "mark_to_drop(standard_md)" + } + } + ] + }, + { + "name" : "fabric_v1model106", + "id" : 73, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign_header", + "parameters" : [ + { + "type" : "header", + "value" : "_egress_bridged36" + }, + { + "type" : "header", + "value" : "_ingress_bridged4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 106, + "column" : 8, + "source_fragment" : "fabric_md.egress.bridged = fabric_md" + } + } + ] + }, + { + "name" : "nop", + "id" : 74, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 75, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 76, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 77, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 78, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "nop", + "id" : 79, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.stats.count", + "id" : 80, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.pkt_io_egress.set_switch_info", + "id" : 81, + "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/tfs-setup/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" : 82, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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" : 83, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_mpls6" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 112, + "column" : 31, + "source_fragment" : "0x8847; ..." + } + } + ] + }, + { + "name" : "FabricEgress.egress_next.push_vlan", + "id" : 84, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 85, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_vlan_tag4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 86, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason48"] + }, + { + "type" : "hexstr", + "value" : "0x82" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 257, + "column" : 35, + "source_fragment" : "130, ..." + } + } + ] + }, + { + "name" : "FabricEgress.dscp_rewriter.rewrite", + "id" : 87, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.dscp_rewriter.clear", + "id" : 88, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "dscp_rewriter_tmp_dscp"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 198, + "column" : 8, + "source_fragment" : "tmp_dscp = 0" + } + } + ] + }, + { + "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop", + "id" : 89, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_md38" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_md38", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 90, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_md38" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "ip_eth_type"] + }, + { + "type" : "hexstr", + "value" : "0x0800" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 114, + "column" : 31, + "source_fragment" : "0x0800; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "report_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 221, + "column" : 45, + "source_fragment" : "4; ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "mirror_type"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_md38", "bmd_type"] + }, + { + "type" : "hexstr", + "value" : "0x04" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 169, + "column" : 23, + "source_fragment" : "4, ..." + } + }, + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_int_report_md38", "encap_presence"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_encap_presence7"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "flow_hash"] + }, + { + "type" : "field", + "value" : ["_egress_bridged36", "_base_inner_hash1"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 91, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_md38", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md38", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_md38", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 92, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "parser_emulator_hdr_report_ethernet" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_md38", "bmd_type"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"] + }, + { + "type" : "field", + "value" : ["_egress_int_report_md38", "ig_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "ig_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "eg_port"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "queue_id"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_md38", "queue_occupancy"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_md38", "eg_tstamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 93, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.reset_quota", + "id" : 94, + "runtime_data" : [], + "primitives" : [] + }, + { + "name" : "FabricEgress.int_egress.set_config", + "id" : 95, + "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/tfs-setup/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/tfs-setup/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" : 96, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_27"] + }, + { + "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/tfs-setup/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_27"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_28"] + }, + { + "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/tfs-setup/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_28"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 97, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_29"] + }, + { + "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/tfs-setup/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_29"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_30"] + }, + { + "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/tfs-setup/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_30"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 98, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_31"] + }, + { + "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/tfs-setup/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_31"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_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/tfs-setup/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_32"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_reason15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 99, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_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/tfs-setup/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_33"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_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/tfs-setup/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_34"] + }, + { + "type" : "field", + "value" : ["scalars", "int_egress_reg"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_reason15"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 100, + "runtime_data" : [ + { + "name" : "report_type", + "bitwidth" : 3 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id14"] + }, + { + "type" : "hexstr", + "value" : "0x01fa" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 101, + "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/tfs-setup/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/tfs-setup/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" : 102, + "runtime_data" : [], + "primitives" : [ + { + "op" : "exit", + "parameters" : [], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 136, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "fabric_v1model133", + "id" : 103, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_cpu_port37"] + }, + { + "type" : "hexstr", + "value" : "0x0000" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 104, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 105, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_drop_reason15"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"] + }, + { + "type" : "field", + "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_recirc44"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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" : 106, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x3" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 107, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 108, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 109, + "runtime_data" : [], + "primitives" : [ + { + "op" : "remove_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_ipv47" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 110, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_recirc44"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "b2d", + "left" : null, + "right" : { + "type" : "bool", + "value" : true + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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" : 111, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x4" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 112, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 113, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4", + "line" : 173, + "column" : 27, + "source_fragment" : "= hdr; ..." + } + } + ] + }, + { + "name" : "packetio51", + "id" : 114, + "runtime_data" : [], + "primitives" : [ + { + "op" : "add_header", + "parameters" : [ + { + "type" : "header", + "value" : "_ingress_packet_in1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_port49"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4", + "line" : 54, + "column" : 12, + "source_fragment" : "exit" + } + } + ] + }, + { + "name" : "packetio60", + "id" : 115, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._egress_pkt_length45"] + }, + { + "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/tfs-setup/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" : 116, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["_egress_bridged36", "_int_bmd_report_type13"] + }, + { + "type" : "hexstr", + "value" : "0x00" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 285, + "column" : 21, + "source_fragment" : "= 1; ..." + } + } + ] + }, + { + "name" : "next325", + "id" : 117, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason48"] + }, + { + "type" : "hexstr", + "value" : "0x83" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 258, + "column" : 32, + "source_fragment" : "131, ..." + } + } + ] + }, + { + "name" : "next323", + "id" : 118, + "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/tfs-setup/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" : 119, + "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/tfs-setup/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" : 120, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason48"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "next343", + "id" : 121, + "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/tfs-setup/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" : 122, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "userMetadata._drop_ctl2"] + }, + { + "type" : "hexstr", + "value" : "0x01" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_reason48"] + }, + { + "type" : "hexstr", + "value" : "0x1a" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4", + "line" : 247, + "column" : 30, + "source_fragment" : "26, ..." + } + } + ] + }, + { + "name" : "int128", + "id" : 123, + "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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_md38" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_latency39"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_timestamp40"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_stripped41"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_report42"] + } + } + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_length45"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 124, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["scalars", "tmp_35"] + }, + { + "type" : "expression", + "value" : { + "type" : "expression", + "value" : { + "op" : "&", + "left" : { + "type" : "field", + "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id14"] + }, + "right" : { + "type" : "hexstr", + "value" : "0xffffffff" + } + } + } + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_35"] + }, + { + "type" : "hexstr", + "value" : "0x1" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4", + "line" : 383, + "column" : 16, + "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..." + } + } + ] + }, + { + "name" : "int373", + "id" : 125, + "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/tfs-setup/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" : 126, + "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/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4", + "line" : 217, + "column" : 16, + "source_fragment" : "hdr.ipv4.dscp = tmp_dscp" + } + } + ] + }, + { + "name" : "slicing189", + "id" : 127, + "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/tfs-setup/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_md38" + }, + { + "type" : "header", + "value" : "int_egress_fabric_md_int_report_md" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_latency39"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "hop_latency"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_timestamp40"] + }, + { + "type" : "field", + "value" : ["int_egress_fabric_md_int_md", "timestamp"] + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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" : 128, + "runtime_data" : [], + "primitives" : [ + { + "op" : "recirculate", + "parameters" : [ + { + "type" : "hexstr", + "value" : "0x5" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4", + "line" : 170, + "column" : 12, + "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)" + } + } + ] + }, + { + "name" : "fabric_v1model174", + "id" : 129, + "runtime_data" : [], + "primitives" : [ + { + "op" : "mark_to_drop", + "parameters" : [ + { + "type" : "header", + "value" : "standard_metadata" + } + ], + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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" : [51], + "actions" : ["fabric_v1model61"], + "base_default_next" : "node_3", + "next_tables" : { + "fabric_v1model61" : "node_3" + }, + "default_entry" : { + "action_id" : 51, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model64", + "id" : 1, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [50], + "actions" : ["fabric_v1model64"], + "base_default_next" : "node_5", + "next_tables" : { + "fabric_v1model64" : "node_5" + }, + "default_entry" : { + "action_id" : 50, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model70", + "id" : 2, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [52], + "actions" : ["fabric_v1model70"], + "base_default_next" : "tbl_lookup_md_init15", + "next_tables" : { + "fabric_v1model70" : "tbl_lookup_md_init15" + }, + "default_entry" : { + "action_id" : 52, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init15", + "id" : 3, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [54], + "actions" : ["lookup_md_init15"], + "base_default_next" : "node_8", + "next_tables" : { + "lookup_md_init15" : "node_8" + }, + "default_entry" : { + "action_id" : 54, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init21", + "id" : 4, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [53], + "actions" : ["lookup_md_init21"], + "base_default_next" : "tbl_lookup_md_init24", + "next_tables" : { + "lookup_md_init21" : "tbl_lookup_md_init24" + }, + "default_entry" : { + "action_id" : 53, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init24", + "id" : 5, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [63], + "actions" : ["lookup_md_init24"], + "base_default_next" : "node_11", + "next_tables" : { + "lookup_md_init24" : "node_11" + }, + "default_entry" : { + "action_id" : 63, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init33", + "id" : 6, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [58], + "actions" : ["lookup_md_init33"], + "base_default_next" : "node_13", + "next_tables" : { + "lookup_md_init33" : "node_13" + }, + "default_entry" : { + "action_id" : 58, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init38", + "id" : 7, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [55], + "actions" : ["lookup_md_init38"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init38" : "node_27" + }, + "default_entry" : { + "action_id" : 55, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init41", + "id" : 8, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [56], + "actions" : ["lookup_md_init41"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init41" : "node_27" + }, + "default_entry" : { + "action_id" : 56, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init44", + "id" : 9, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [57], + "actions" : ["lookup_md_init44"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init44" : "node_27" + }, + "default_entry" : { + "action_id" : 57, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init48", + "id" : 10, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [62], + "actions" : ["lookup_md_init48"], + "base_default_next" : "node_21", + "next_tables" : { + "lookup_md_init48" : "node_21" + }, + "default_entry" : { + "action_id" : 62, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init53", + "id" : 11, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [59], + "actions" : ["lookup_md_init53"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init53" : "node_27" + }, + "default_entry" : { + "action_id" : 59, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init56", + "id" : 12, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [60], + "actions" : ["lookup_md_init56"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init56" : "node_27" + }, + "default_entry" : { + "action_id" : 60, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_lookup_md_init59", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [61], + "actions" : ["lookup_md_init59"], + "base_default_next" : "node_27", + "next_tables" : { + "lookup_md_init59" : "node_27" + }, + "default_entry" : { + "action_id" : 61, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_pkt_io_do_packet_out", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [8], + "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" : 8, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_watchlist.watchlist", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [46, 48, 47], + "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" : 47, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.stats.flows", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [7], + "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" : 7, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.slice_tc_classifier.classifier", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [38, 40, 39], + "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" : 39, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.ingress_port_vlan", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [9, 10, 11], + "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" : 9, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.filtering.fwd_classifier", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [12], + "actions" : ["FabricIngress.filtering.set_forwarding_type"], + "base_default_next" : "tbl_filtering100", + "next_tables" : { + "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100" + }, + "default_entry" : { + "action_id" : 12, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_filtering100", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [64], + "actions" : ["filtering100"], + "base_default_next" : "node_35", + "next_tables" : { + "filtering100" : "node_35" + }, + "default_entry" : { + "action_id" : 64, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.bridging", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [17, 13], + "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" : 13, + "action_const" : true, + "action_data" : ["0x59"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.mpls", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [18, 14], + "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" : 14, + "action_const" : true, + "action_data" : ["0x81"], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.forwarding.routing_v4", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [19, 20, 21, 15], + "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" : 15, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "FabricIngress.forwarding.routing_v6", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [22, 23, 16], + "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" : 16, + "action_const" : false, + "action_data" : ["0x1d"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_hasher17", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [68], + "actions" : ["hasher17"], + "base_default_next" : "node_45", + "next_tables" : { + "hasher17" : "node_45" + }, + "default_entry" : { + "action_id" : 68, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher39", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [65], + "actions" : ["hasher39"], + "base_default_next" : "node_50", + "next_tables" : { + "hasher39" : "node_50" + }, + "default_entry" : { + "action_id" : 65, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher50", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [66], + "actions" : ["hasher50"], + "base_default_next" : "node_50", + "next_tables" : { + "hasher50" : "node_50" + }, + "default_entry" : { + "action_id" : 66, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_hasher66", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [67], + "actions" : ["hasher66"], + "base_default_next" : "node_50", + "next_tables" : { + "hasher66" : "node_50" + }, + "default_entry" : { + "action_id" : 67, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.pre_next.next_mpls", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [24, 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" : 30, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [25, 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" : 31, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [26, 28, 27, 29, 30, 31], + "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_54", + "next_tables" : { + "FabricIngress.acl.set_next_id_acl" : "node_54", + "FabricIngress.acl.punt_to_cpu" : "node_54", + "FabricIngress.acl.copy_to_cpu" : "node_54", + "FabricIngress.acl.drop" : "node_54", + "FabricIngress.acl.set_output_port" : "node_54", + "FabricIngress.acl.nop_acl" : "node_54" + }, + "default_entry" : { + "action_id" : 31, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.simple", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4", + "line" : 88, + "column" : 10, + "source_fragment" : "simple" + }, + "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" : [32, 33, 2], + "actions" : ["FabricIngress.next.output_simple", "FabricIngress.next.routing_simple", "nop"], + "base_default_next" : "FabricIngress.next.hashed", + "next_tables" : { + "FabricIngress.next.output_simple" : "FabricIngress.next.hashed", + "FabricIngress.next.routing_simple" : "FabricIngress.next.hashed", + "nop" : "FabricIngress.next.hashed" + }, + "default_entry" : { + "action_id" : 2, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.next.hashed", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [34, 35, 3], + "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" : 34, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [36, 37], + "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" : 37, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.set_slice_tc", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [41, 42, 6], + "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" : 6, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 41, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 42, + "action_data" : [] + }, + "priority" : 2 + } + ] + }, + { + "name" : "FabricIngress.qos.default_tc", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [45, 4], + "actions" : ["FabricIngress.qos.set_default_tc", "nop"], + "base_default_next" : "node_60", + "next_tables" : { + "FabricIngress.qos.set_default_tc" : "node_60", + "nop" : "node_60" + }, + "default_entry" : { + "action_id" : 4, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing174", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [69], + "actions" : ["slicing174"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing174" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 69, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing177", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [70], + "actions" : ["slicing177"], + "base_default_next" : "FabricIngress.qos.queues", + "next_tables" : { + "slicing177" : "FabricIngress.qos.queues" + }, + "default_entry" : { + "action_id" : 70, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.qos.queues", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [43, 44], + "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" : 43, + "action_const" : true, + "action_data" : ["0x0"], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int112", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [71], + "actions" : ["int112"], + "base_default_next" : "FabricIngress.int_ingress.drop_report", + "next_tables" : { + "int112" : "FabricIngress.int_ingress.drop_report" + }, + "default_entry" : { + "action_id" : 71, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricIngress.int_ingress.drop_report", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"], + "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" : [49, 5], + "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" : 5, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 49, + "action_data" : [] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 49, + "action_data" : [] + }, + "priority" : 2 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 49, + "action_data" : [] + }, + "priority" : 3 + } + ] + }, + { + "name" : "tbl_fabric_v1model106", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [73], + "actions" : ["fabric_v1model106"], + "base_default_next" : "node_67", + "next_tables" : { + "fabric_v1model106" : "node_67" + }, + "default_entry" : { + "action_id" : 73, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model110", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [72], + "actions" : ["fabric_v1model110"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model110" : null + }, + "default_entry" : { + "action_id" : 72, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [ + { + "name" : "FabricIngress.next.hashed_profile", + "id" : 0, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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/tfs-setup/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_36", + "true_next" : "tbl_hasher17" + }, + { + "name" : "node_36", + "id" : 13, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_38" + }, + { + "name" : "node_38", + "id" : 14, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_40" + }, + { + "name" : "node_40", + "id" : 15, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_42" + }, + { + "name" : "node_42", + "id" : 16, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_45", + "id" : 17, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_47" + }, + { + "name" : "node_47", + "id" : 18, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_50", + "id" : 19, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_54", + "id" : 20, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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.simple", + "true_next" : "FabricIngress.qos.set_slice_tc" + }, + { + "name" : "node_60", + "id" : 21, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_67", + "id" : 22, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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" : 44, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [103], + "actions" : ["fabric_v1model133"], + "base_default_next" : "node_72", + "next_tables" : { + "fabric_v1model133" : "node_72" + }, + "default_entry" : { + "action_id" : 103, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model136", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [102], + "actions" : ["fabric_v1model136"], + "base_default_next" : "node_74", + "next_tables" : { + "fabric_v1model136" : "node_74" + }, + "default_entry" : { + "action_id" : 102, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [105], + "actions" : ["int_tna_parser_emulator14"], + "base_default_next" : "node_76", + "next_tables" : { + "int_tna_parser_emulator14" : "node_76" + }, + "default_entry" : { + "action_id" : 105, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [104], + "actions" : ["int_tna_parser_emulator148"], + "base_default_next" : "node_78", + "next_tables" : { + "int_tna_parser_emulator148" : "node_78" + }, + "default_entry" : { + "action_id" : 104, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [89], + "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" : 89, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166", + "id" : 49, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [106], + "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" : 106, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror", + "id" : 50, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [91], + "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" : 91, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169", + "id" : 51, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [107], + "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" : 107, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173", + "id" : 52, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [108], + "actions" : ["int_tna_parser_emulator173"], + "base_default_next" : "node_84", + "next_tables" : { + "int_tna_parser_emulator173" : "node_84" + }, + "default_entry" : { + "action_id" : 108, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator14_0", + "id" : 53, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [110], + "actions" : ["int_tna_parser_emulator14_0"], + "base_default_next" : "node_86", + "next_tables" : { + "int_tna_parser_emulator14_0" : "node_86" + }, + "default_entry" : { + "action_id" : 110, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator148_0", + "id" : 54, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [109], + "actions" : ["int_tna_parser_emulator148_0"], + "base_default_next" : "node_88", + "next_tables" : { + "int_tna_parser_emulator148_0" : "node_88" + }, + "default_entry" : { + "action_id" : 109, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_ingress_drop_0", + "id" : 55, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [90], + "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" : 90, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator166_0", + "id" : 56, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [111], + "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" : 111, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_parser_emulator_parse_int_report_mirror_0", + "id" : 57, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [92], + "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" : 92, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator169_0", + "id" : 58, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [112], + "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" : 112, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int_tna_parser_emulator173_0", + "id" : 59, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [113], + "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" : 113, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.pkt_io_egress.switch_info", + "id" : 60, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [81, 74], + "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"], + "base_default_next" : "node_95", + "next_tables" : { + "FabricEgress.pkt_io_egress.set_switch_info" : "node_95", + "nop" : "node_95" + }, + "default_entry" : { + "action_id" : 74, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "tbl_packetio51", + "id" : 61, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [114], + "actions" : ["packetio51"], + "base_default_next" : "node_97", + "next_tables" : { + "packetio51" : "node_97" + }, + "default_entry" : { + "action_id" : 114, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_packetio60", + "id" : 62, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [115], + "actions" : ["packetio60"], + "base_default_next" : "node_99", + "next_tables" : { + "packetio60" : "node_99" + }, + "default_entry" : { + "action_id" : 115, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.stats.flows", + "id" : 63, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [80], + "actions" : ["FabricEgress.stats.count"], + "base_default_next" : "node_101", + "next_tables" : { + "FabricEgress.stats.count" : "node_101" + }, + "default_entry" : { + "action_id" : 80, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next283", + "id" : 64, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [116], + "actions" : ["next283"], + "base_default_next" : "node_103", + "next_tables" : { + "next283" : "node_103" + }, + "default_entry" : { + "action_id" : 116, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_pop_mpls_if_present", + "id" : 65, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [82], + "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"], + "base_default_next" : "node_107", + "next_tables" : { + "FabricEgress.egress_next.pop_mpls_if_present" : "node_107" + }, + "default_entry" : { + "action_id" : 82, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_egress_next_set_mpls", + "id" : 66, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [83], + "actions" : ["FabricEgress.egress_next.set_mpls"], + "base_default_next" : "node_107", + "next_tables" : { + "FabricEgress.egress_next.set_mpls" : "node_107" + }, + "default_entry" : { + "action_id" : 83, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.egress_next.egress_vlan", + "id" : 67, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [84, 85, 86], + "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"], + "base_default_next" : "node_109", + "next_tables" : { + "FabricEgress.egress_next.push_vlan" : "node_109", + "FabricEgress.egress_next.pop_vlan" : "node_109", + "FabricEgress.egress_next.drop" : "node_109" + }, + "default_entry" : { + "action_id" : 86, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next323", + "id" : 68, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [118], + "actions" : ["next323"], + "base_default_next" : "node_111", + "next_tables" : { + "next323" : "node_111" + }, + "default_entry" : { + "action_id" : 118, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next325", + "id" : 69, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [117], + "actions" : ["next325"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "next325" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 117, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next333", + "id" : 70, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [119], + "actions" : ["next333"], + "base_default_next" : "node_116", + "next_tables" : { + "next333" : "node_116" + }, + "default_entry" : { + "action_id" : 119, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next336", + "id" : 71, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [120], + "actions" : ["next336"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "next336" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 120, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next343", + "id" : 72, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [121], + "actions" : ["next343"], + "base_default_next" : "node_121", + "next_tables" : { + "next343" : "node_121" + }, + "default_entry" : { + "action_id" : 121, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_next346", + "id" : 73, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [122], + "actions" : ["next346"], + "base_default_next" : "tbl_int128", + "next_tables" : { + "next346" : "tbl_int128" + }, + "default_entry" : { + "action_id" : 122, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_int128", + "id" : 74, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [123], + "actions" : ["int128"], + "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds", + "next_tables" : { + "int128" : "FabricEgress.int_egress.queue_latency_thresholds" + }, + "default_entry" : { + "action_id" : 123, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.queue_latency_thresholds", + "id" : 75, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [93, 94, 76], + "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" : 76, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.config", + "id" : 76, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [95], + "actions" : ["FabricEgress.int_egress.set_config"], + "base_default_next" : "tbl_int373", + "next_tables" : { + "FabricEgress.int_egress.set_config" : "tbl_int373" + }, + "default_entry" : { + "action_id" : 95, + "action_const" : false, + "action_data" : ["0xffffff00", "0xffffc0000000"], + "action_entry_const" : false + } + }, + { + "name" : "tbl_int373", + "id" : 77, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [125], + "actions" : ["int373"], + "base_default_next" : "node_127", + "next_tables" : { + "int373" : "node_127" + }, + "default_entry" : { + "action_id" : 125, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.report", + "id" : 78, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [96, 97, 98, 99, 77], + "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" : 77, + "action_const" : false, + "action_data" : [], + "action_entry_const" : false + } + }, + { + "name" : "FabricEgress.int_egress.int_metadata", + "id" : 79, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"], + "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_report42"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : true, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [100, 78], + "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" : 78, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 100, + "action_data" : ["0x1"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 100, + "action_data" : ["0x4"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_int383", + "id" : 80, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [124], + "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" : 124, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length", + "id" : 81, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type18"], + "mask" : null + } + ], + "match_type" : "exact", + "type" : "simple", + "max_size" : 2, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [79, 101], + "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" : 79, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + }, + "entries" : [ + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 101, + "action_data" : ["0xfff2", "0xffde"] + }, + "priority" : 1 + }, + { + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : 101, + "action_data" : ["0xffee", "0xffda"] + }, + "priority" : 2 + } + ] + }, + { + "name" : "tbl_slicing189", + "id" : 82, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [127], + "actions" : ["slicing189"], + "base_default_next" : "FabricEgress.dscp_rewriter.rewriter", + "next_tables" : { + "slicing189" : "FabricEgress.dscp_rewriter.rewriter" + }, + "default_entry" : { + "action_id" : 127, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "FabricEgress.dscp_rewriter.rewriter", + "id" : 83, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [87, 88, 75], + "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"], + "base_default_next" : null, + "next_tables" : { + "__HIT__" : "node_134", + "__MISS__" : "node_136" + }, + "default_entry" : { + "action_id" : 75, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_slicing217", + "id" : 84, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [126], + "actions" : ["slicing217"], + "base_default_next" : "node_136", + "next_tables" : { + "slicing217" : "node_136" + }, + "default_entry" : { + "action_id" : 126, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model170", + "id" : 85, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [128], + "actions" : ["fabric_v1model170"], + "base_default_next" : "node_138", + "next_tables" : { + "fabric_v1model170" : "node_138" + }, + "default_entry" : { + "action_id" : 128, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_fabric_v1model174", + "id" : 86, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : [129], + "actions" : ["fabric_v1model174"], + "base_default_next" : null, + "next_tables" : { + "fabric_v1model174" : null + }, + "default_entry" : { + "action_id" : 129, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + } + ], + "action_profiles" : [], + "conditionals" : [ + { + "name" : "node_72", + "id" : 23, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_74" + }, + { + "name" : "node_74", + "id" : 24, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_84" + }, + { + "name" : "node_76", + "id" : 25, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_78" + }, + { + "name" : "node_78", + "id" : 26, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type46"] + }, + "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_84", + "id" : 27, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"] + }, + "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_86", + "id" : 28, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_88" + }, + { + "name" : "node_88", + "id" : 29, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_type13"] + }, + "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_95", + "id" : 30, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_97" + }, + { + "name" : "node_97", + "id" : 31, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_99" + }, + { + "name" : "node_99", + "id" : 32, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_101" + }, + { + "name" : "node_101", + "id" : 33, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_103" + }, + { + "name" : "node_103", + "id" : 34, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_104", + "false_next" : "tbl_egress_next_set_mpls" + }, + { + "name" : "node_104", + "id" : 35, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_107" + }, + { + "name" : "node_107", + "id" : 36, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_recirc44"] + } + } + }, + "false_next" : "FabricEgress.egress_next.egress_vlan", + "true_next" : "node_109" + }, + { + "name" : "node_109", + "id" : 37, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_113" + }, + { + "name" : "node_111", + "id" : 38, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : "tbl_int128" + }, + { + "name" : "node_113", + "id" : 39, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_114", + "false_next" : "node_118" + }, + { + "name" : "node_114", + "id" : 40, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_116" + }, + { + "name" : "node_116", + "id" : 41, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : "tbl_int128" + }, + { + "name" : "node_118", + "id" : 42, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_119", + "false_next" : "tbl_int128" + }, + { + "name" : "node_119", + "id" : 43, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_121" + }, + { + "name" : "node_121", + "id" : 44, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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" : "tbl_int128" + }, + { + "name" : "node_127", + "id" : 45, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_134", + "id" : 46, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_136" + }, + { + "name" : "node_136", + "id" : 47, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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_138" + }, + { + "name" : "node_138", + "id" : 48, + "source_info" : { + "filename" : "/home/ubuntu/tfs-setup/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/tfs-setup/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_2", + "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/tfs-setup/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_3", + "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/tfs-setup/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_4", + "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/tfs-setup/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_5", + "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/tfs-setup/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_6", + "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/tfs-setup/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-int-routing-acl/p4src/p4info.txt b/src/tests/p4-int-routing-acl/p4src/p4info.txt new file mode 100644 index 0000000000000000000000000000000000000000..4e54f2861496816db734612ad4558cf4d03e69f8 --- /dev/null +++ b/src/tests/p4-int-routing-acl/p4src/p4info.txt @@ -0,0 +1,1911 @@ +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: 39142283 + name: "FabricIngress.next.simple" + alias: "simple" + } + match_fields { + id: 1 + name: "next_id" + bitwidth: 32 + match_type: EXACT + } + action_refs { + id: 19358572 + } + action_refs { + id: 31887425 + } + action_refs { + id: 28485346 + annotations: "@defaultonly" + scope: DEFAULT_ONLY + } + const_default_action_id: 28485346 + direct_resource_ids: 326633416 + 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: 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: 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: 19358572 + name: "FabricIngress.next.output_simple" + alias: "output_simple" + } + params { + id: 1 + name: "port_num" + bitwidth: 9 + type_name { + name: "FabricPortId_t" + } + } +} +actions { + preamble { + id: 31887425 + name: "FabricIngress.next.routing_simple" + alias: "routing_simple" + } + 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: 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: 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: 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 +} +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: 326633416 + name: "FabricIngress.next.simple_counter" + alias: "simple_counter" + } + spec { + unit: BOTH + } + direct_table_id: 39142283 +} +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: 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 +} +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-int-routing-acl/run_test_01_bootstrap.sh b/src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh new file mode 100755 index 0000000000000000000000000000000000000000..76469ca55455aec65569a7c104f87e8d6673dec9 --- /dev/null +++ b/src/tests/p4-int-routing-acl/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-int-routing-acl/test_functional_bootstrap.py diff --git a/src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh b/src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh new file mode 100755 index 0000000000000000000000000000000000000000..6709d66c62cae11ecc1e555bae81c680dfeaafc8 --- /dev/null +++ b/src/tests/p4-int-routing-acl/run_test_02_rules_provision.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-int-routing-acl/test_functional_rules_provision.py diff --git a/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh b/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh new file mode 100755 index 0000000000000000000000000000000000000000..3a67fad8a04520bc48c666b48d684b5ad7fe3d13 --- /dev/null +++ b/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.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-int-routing-acl/test_functional_rules_deprovision.py diff --git a/src/tests/p4-int-routing-acl/run_test_04_cleanup.sh b/src/tests/p4-int-routing-acl/run_test_04_cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..917a2af2dab0ab1b9d0d05ad272c6494486d9580 --- /dev/null +++ b/src/tests/p4-int-routing-acl/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-int-routing-acl/test_functional_cleanup.py diff --git a/src/tests/p4-int-routing-acl/setup.sh b/src/tests/p4-int-routing-acl/setup.sh new file mode 100755 index 0000000000000000000000000000000000000000..c771642769fe528fe1179909ab0b8edb768f7264 --- /dev/null +++ b/src/tests/p4-int-routing-acl/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-int-routing-acl/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server +kubectl cp src/tests/p4-int-routing-acl/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server diff --git a/src/tests/p4-int-routing-acl/test_common.py b/src/tests/p4-int-routing-acl/test_common.py new file mode 100644 index 0000000000000000000000000000000000000000..8254eddc5bb5f2f2bbf4c0866a9409552872b2c8 --- /dev/null +++ b/src/tests/p4-int-routing-acl/test_common.py @@ -0,0 +1,111 @@ +# 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 +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum +from common.tools.object_factory.Context import json_context_id + +# Context info +CONTEXT_NAME_P4 = DEFAULT_CONTEXT_NAME +ADMIN_CONTEXT_ID = ContextId(**json_context_id(CONTEXT_NAME_P4)) + +# Device and rule cardinality variables +DEV_NB = 3 +CONNECTION_RULES = 3 +ENDPOINT_RULES = 2 +DATAPLANE_RULES_NB_INT_B1 = 5 +DATAPLANE_RULES_NB_INT_B2 = 6 +DATAPLANE_RULES_NB_INT_B3 = 8 +DATAPLANE_RULES_NB_RT_EDGE = 7 +DATAPLANE_RULES_NB_RT_CORP = 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_EDGE +\ + DATAPLANE_RULES_NB_RT_CORP +\ + DATAPLANE_RULES_NB_ACL + +# Topology descriptor +DESC_TOPO = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'topology.json' +) + +# Rule insertion descriptors +# The switch cannot digest all rules at once, hence we insert in batches +DESC_FILE_RULES_INSERT_INT_B1 = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-int-b1.json' +) +DESC_FILE_RULES_INSERT_INT_B2 = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-int-b2.json' +) +DESC_FILE_RULES_INSERT_INT_B3 = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-int-b3.json' +) +DESC_FILE_RULES_INSERT_ROUTING_EDGE = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-routing-edge.json' +) +DESC_FILE_RULES_INSERT_ROUTING_CORP = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-routing-corp.json' +) +DESC_FILE_RULES_INSERT_ACL = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-insert-acl.json' +) + +# Rule deletion descriptor +DESC_FILE_RULES_DELETE_ALL = os.path.join( + os.path.dirname( + os.path.abspath(__file__) + ), + 'descriptors', 'rules-remove.json' +) + +def verify_number_of_rules(devices, desired_rules_nb): + # Iterate all devices + for device in devices: + # Skip non-P4 devices + if device.device_type != "p4-switch": continue + + # We want the device to be active + assert \ + device.device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED + + # Get the configuration rules of this device + config_rules = device.device_config.config_rules + + # Expected rule cardinality + assert len(config_rules) == desired_rules_nb diff --git a/src/tests/p4-int-routing-acl/test_functional_bootstrap.py b/src/tests/p4-int-routing-acl/test_functional_bootstrap.py new file mode 100644 index 0000000000000000000000000000000000000000..b5b72cc331ea1c7bf6e57aefc484532d66cb8504 --- /dev/null +++ b/src/tests/p4-int-routing-acl/test_functional_bootstrap.py @@ -0,0 +1,70 @@ +# 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, 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 test_common import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +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_TOPO, 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-int-routing-acl/test_functional_cleanup.py b/src/tests/p4-int-routing-acl/test_functional_cleanup.py new file mode 100644 index 0000000000000000000000000000000000000000..60c8684b098aa886fdd62db28a07a2d5c8adc125 --- /dev/null +++ b/src/tests/p4-int-routing-acl/test_functional_cleanup.py @@ -0,0 +1,41 @@ +# 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 +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 context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from tests.Fixtures import context_client, device_client # pylint: disable=unused-import +from test_common import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +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_TOPO, 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-int-routing-acl/test_functional_rules_deprovision.py b/src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py new file mode 100644 index 0000000000000000000000000000000000000000..2d54ae9088600381a000722608bd39eb49483a03 --- /dev/null +++ b/src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py @@ -0,0 +1,93 @@ +# 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.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 test_common import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_initial_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has 0 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + assert len(response.slices) == 0 + + # Check there is 0 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + assert len(response.services) == 0 + + # Check there are 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + +def test_rules_before_removal( + context_client : ContextClient # 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))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + \ + DATAPLANE_RULES_NB_INT_B3 + \ + DATAPLANE_RULES_NB_RT_EDGE + \ + DATAPLANE_RULES_NB_RT_CORP + \ + DATAPLANE_RULES_NB_ACL + assert desired_rules_nb == CONNECTION_RULES + ENDPOINT_RULES + DATAPLANE_RULES_NB_TOT + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_removal( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load dataplane rules for removal + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_DELETE_ALL, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_removal( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** removing all dataplane rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Only connection and endpoint rules must be in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + verify_number_of_rules(response.devices, desired_rules_nb) diff --git a/src/tests/p4-int-routing-acl/test_functional_rules_provision.py b/src/tests/p4-int-routing-acl/test_functional_rules_provision.py new file mode 100644 index 0000000000000000000000000000000000000000..86a82d2129e495f3c3be9f9ea7b67b24d27a8db7 --- /dev/null +++ b/src/tests/p4-int-routing-acl/test_functional_rules_provision.py @@ -0,0 +1,238 @@ +# 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.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 test_common import * + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +def test_initial_context( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # Verify the scenario has 0 service and 0 slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Check there are no slices + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + assert len(response.slices) == 0 + + # Check there is 0 service + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + assert len(response.services) == 0 + + # Check there are 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + +def test_rules_before_insertion( + context_client : ContextClient # 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))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_int_batch_1( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load INT batch 1 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_INT_B1, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_int_batch_1( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 1 of INT rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_int_batch_2( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load INT batch 2 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_INT_B2, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_int_batch_2( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 2 of INT rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_int_batch_3( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load INT batch 3 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_INT_B3, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_int_batch_3( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 3 of INT rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + \ + DATAPLANE_RULES_NB_INT_B3 + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_routing_edge_batch_4( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load routing edge batch 4 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_ROUTING_EDGE, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_routing_edge_batch_4( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 4 of routing edge rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + \ + DATAPLANE_RULES_NB_INT_B3 + \ + DATAPLANE_RULES_NB_RT_EDGE + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_routing_corp_batch_5( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load routing corp batch 5 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_ROUTING_CORP, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_routing_corp_batch_5( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 5 of routing corp rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + \ + DATAPLANE_RULES_NB_INT_B3 + \ + DATAPLANE_RULES_NB_RT_EDGE + \ + DATAPLANE_RULES_NB_RT_CORP + verify_number_of_rules(response.devices, desired_rules_nb) + +def test_rules_insertion_acl_batch_6( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient # pylint: disable=redefined-outer-name +) -> None: + # Load ACL batch 6 rules for insertion + descriptor_loader = DescriptorLoader( + descriptors_file=DESC_FILE_RULES_INSERT_ACL, context_client=context_client, device_client=device_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) + +def test_rules_after_insertion_acl_batch_6( + context_client : ContextClient # pylint: disable=redefined-outer-name +) -> None: + # State **after** inserting batch 6 of ACL rules + # Still 3 devices + response = context_client.ListDevices(ADMIN_CONTEXT_ID) + LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response))) + assert len(response.devices) == DEV_NB + + # Verify that the following rules are in place + desired_rules_nb = \ + CONNECTION_RULES + \ + ENDPOINT_RULES + \ + DATAPLANE_RULES_NB_INT_B1 + \ + DATAPLANE_RULES_NB_INT_B2 + \ + DATAPLANE_RULES_NB_INT_B3 + \ + DATAPLANE_RULES_NB_RT_EDGE + \ + DATAPLANE_RULES_NB_RT_CORP + \ + DATAPLANE_RULES_NB_ACL + assert desired_rules_nb == CONNECTION_RULES + ENDPOINT_RULES + DATAPLANE_RULES_NB_TOT + verify_number_of_rules(response.devices, desired_rules_nb) diff --git a/src/tests/p4-int-routing-acl/topology/README.md b/src/tests/p4-int-routing-acl/topology/README.md new file mode 100644 index 0000000000000000000000000000000000000000..30d4d84bcf2771bb9732e9686a680de0a643fa79 --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/README.md @@ -0,0 +1,166 @@ +# P4 Topology + +This directory contains scripts for deploying a single software-based Stratum switch on a VM or bare metal machine. + +## 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) + +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 environment and deploy the Stratum switch + +We create a Linux namespace for Stratum to live in an isolated space from the rest of the system. +The two data plane interfaces of the VM need to be enclosed into this namespace, while for this namespace to interact with the outside world (i.e., root namespace and outside the VM), a dedicated virtual interface pair is created. + +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 +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) + +... +``` + +### Step 1: Setup environment + +Edit the `setup` script to modify the subnets' information according to your network setup: + +```shell +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 +``` + +Once your network setup is applied, run the `setup` script as follows: + +```shell +sudo bash p4-switch-setup.sh +``` + +To verify that the switch namespace is in place, issue the following command: + +```shell +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 +sudo ip netns exec ns-switch ping 10.0.0.254 +``` + +This ensures that telemetry data leaves the switch and ends up on the host VM. +To dispatch this telemetry data towards TFS, the `p4-switch-setup.sh` implements packet mirroring from `veth-int-host` to the VM's management interface (i.e., `ens3` in this example). +We assume that TFS is deployed on a machine that is accessible via the management interface (i.e., `ens3`) of this VM. + +### Step 2: Deploy Stratum in the namespace + +Now the namespace is ready to host the Stratum switch. + +First you need to configure the chassis configuration file with the correct network interfaces names. +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 +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-switch" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "ens4" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "ens5" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "veth-int-sw" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +``` + +To deploy Stratum, do: + +```shell +sudo bash run-stratum.sh +``` + +To run Stratum will verbose logging, open the `run-stratum.sh` and change: + +```shell +LOG_LEVEL="debug" +``` + +Then, re-deploy Stratum as shown above. + +To verify that Stratum has been correctly deployed, you should see the following output: + +``` +<timestamp> config_monitoring_service.cc:94] Pushing the saved chassis config read from p4-switch-three-port-chassis-config-phy.pb.txt... +<timestamp> bmv2_chassis_manager.cc:519] Registered port status callbacks successfully for node 1. +<timestamp> bmv2_chassis_manager.cc:453] State of port 1 in node 1: UP. +<timestamp> bmv2_chassis_manager.cc:453] State of port 2 in node 1: UP. +<timestamp> bmv2_chassis_manager.cc:453] State of port 3 in node 1: UP. +<timestamp> bmv2_switch.cc:74] P4-based forwarding pipeline config pushed successfully to node with ID 1. +<timestamp> 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... +``` + +### Step 3: Restore to the original setup + +When your tests with Stratum and TFS are over, you may want to restore your setup. +To do so, execute the following script: + +```shell +sudo bash p4-switch-tear-down.sh +``` diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh new file mode 100644 index 0000000000000000000000000000000000000000..3ba84651e7e9550ef4b47d28f9ce3efa1f8fd2c8 --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh @@ -0,0 +1,40 @@ +#!/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. + +# Switch lives in a namespace +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) + +# Virtual interfaces for INT +SW_IFACE_INT="veth-int-sw" +HOST_IFACE_INT="veth-int-host" + +# IP subnet for INT +TOPO_INT_NET="10.0.0.0/24" +TOPO_INT_NET_IP="10.0.0.0" +TOPO_INT_NET_MASK="255.255.255.0" + +# 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-int-routing-acl/topology/p4-switch-setup.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-setup.sh new file mode 100644 index 0000000000000000000000000000000000000000..1a5f37b2fbe2b1acd6c3ef69682d645591093f69 --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/p4-switch-setup.sh @@ -0,0 +1,134 @@ +#!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. + +# 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" + +# MAC addresses of the virtual INT interfaces +SW_INT_MAC="00:11:22:33:44:11" +HOST_INT_MAC="00:11:22:33:44:22" + +# IP addresses of the virtual INT interfaces +SWITCH_INT_IP="10.0.0.1" +HOST_INT_IP="10.0.0.254" + +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 + +# INT subnet MTU +MTU_LEN=9000 + +kill_stratum() { + pkill stratum +} + +create_namespaces() { + ip netns add ${SWITCH_NS} +} + +create_virtual_interfaces() { + ip link add ${HOST_IFACE_INT} type veth peer name ${SW_IFACE_INT} +} + +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_INT} netns ${SWITCH_NS} +} + +set_mac_addresses() { + ip netns exec ${SWITCH_NS} ifconfig ${SW_IFACE_INT} hw ether ${SW_INT_MAC} + ifconfig ${HOST_IFACE_INT} hw ether ${HOST_INT_MAC} +} + +set_mtu() { + ip netns exec ${SWITCH_NS} ip link set dev ${SW_IFACE_INT} mtu ${MTU_LEN} + ip link set dev ${HOST_IFACE_INT} mtu ${MTU_LEN} +} + +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 ${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_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 +} + +switch_default_gw() { + ip netns exec ${SWITCH_NS} ip route add default via ${HOST_INT_IP} +} + +enable_ip_fwd() { + sysctl net.ipv4.ip_forward=1 + sysctl net.ipv4.conf.${HOST_IFACE_EXT}.forwarding=1 + sysctl net.ipv4.conf.${HOST_IFACE_INT}.forwarding=1 +} + +switch_access_to_internet() { + iptables -P FORWARD DROP + iptables -t nat -A POSTROUTING -s ${TOPO_INT_NET_IP}/${TOPO_INT_NET_MASK} -o ${HOST_IFACE_EXT} -j MASQUERADE + iptables -A FORWARD -i ${HOST_IFACE_EXT} -o ${HOST_IFACE_INT} -j ACCEPT + iptables -A FORWARD -o ${HOST_IFACE_EXT} -i ${HOST_IFACE_INT} -j ACCEPT +} + +grpc_port_forwarding() { + iptables -t nat -A PREROUTING -p tcp -i ${HOST_IFACE_EXT} --dport ${SW_P4RT_GRPC_PORT} -j DNAT --to-destination ${SWITCH_INT_IP}:${SW_P4RT_GRPC_PORT} + iptables -A FORWARD -p tcp -d ${SWITCH_INT_IP} --dport ${SW_P4RT_GRPC_PORT} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT +} + +int_packet_mirroring() { + sudo tc qdisc add dev ${HOST_IFACE_INT} ingress + sudo tc filter add dev ${HOST_IFACE_INT} parent ffff: \ + protocol all prio 2 u32 \ + match u32 0 0 flowid 1:1 \ + action mirred egress mirror dev ${HOST_IFACE_EXT} +} + +kill_stratum +create_namespaces +create_virtual_interfaces +assign_virtual_interfaces +set_mac_addresses +set_mtu +set_ip_addresses +bring_interfaces_up +disable_csum_offloading +switch_default_gw +enable_ip_fwd +switch_access_to_internet +grpc_port_forwarding +int_packet_mirroring + +exit 0 diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh new file mode 100644 index 0000000000000000000000000000000000000000..9d79343a37e8b65167992e53f7c3e54944adfb1a --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh @@ -0,0 +1,84 @@ +#!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. + +# 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 +} + +delete_virtual_interfaces() { + ip netns exec ${SWITCH_NS} ip link delete ${SW_IFACE_INT} +} + +delete_namespaces() { + ip netns del ${SWITCH_NS} +} + +bring_interfaces_up() { + ifconfig ${SW_IFACE_DATA_EDGE} up + ifconfig ${SW_IFACE_DATA_CORP} up +} + +cleanup_iptables() { + # gRPC entries + entry_no=$(iptables --line-numbers -nvL | grep ${HOST_IFACE_INT} | cut -d " " -f 1 | head -1) + iptables -D FORWARD ${entry_no} + entry_no=$(iptables --line-numbers -nvL | grep ${HOST_IFACE_INT} | cut -d " " -f 1) + iptables -D FORWARD ${entry_no} + entry_no=$(iptables --line-numbers -nvL | grep ${SW_P4RT_GRPC_PORT} | cut -d " " -f 1) + iptables -D FORWARD ${entry_no} + + entry_no=$(iptables -t nat --line-numbers -nvL | grep ${SW_P4RT_GRPC_PORT} | cut -d " " -f 1) + iptables -t nat -D PREROUTING ${entry_no} + + entry_no=$(iptables -t nat --line-numbers -nvL | grep ${TOPO_INT_NET} | cut -d " " -f 1) + iptables -t nat -D POSTROUTING ${entry_no} + + # Check new state + echo "Forwarding tables" + iptables --line-numbers -nvL + echo -e "" + echo "NAT tables" + iptables -t nat --line-numbers -nvL +} + +cleanup_tc() { + sudo tc filter del dev ${HOST_IFACE_INT} parent ffff: \ + protocol all prio 2 u32 \ + match u32 0 0 flowid 1:1 \ + action mirred egress mirror dev ${HOST_IFACE_EXT} + sudo tc qdisc del dev ${HOST_IFACE_INT} ingress + + # Check new state + echo -e "" + echo -e "Linux tc status" + tc qdisc show +} + +kill_stratum +delete_virtual_interfaces +delete_namespaces +# bring_interfaces_up +cleanup_iptables +cleanup_tc + +exit 0 diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt new file mode 100644 index 0000000000000000000000000000000000000000..038d3626960e252a318edd5419ed887e2682a4b5 --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt @@ -0,0 +1,63 @@ +# Copyright 2018-present Open Networking Foundation +# SPDX-License-Identifier: Apache-2.0 + +# 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. + +description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports" +chassis { + platform: PLT_P4_SOFT_SWITCH + name: "bmv2-switch" +} +nodes { + id: 1 + slot: 1 + index: 1 +} +singleton_ports { + id: 1 + name: "ens4" + slot: 1 + port: 1 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 2 + name: "ens5" + slot: 1 + port: 2 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} +singleton_ports { + id: 3 + name: "veth-int-sw" + slot: 1 + port: 3 + channel: 1 + speed_bps: 100000000000 + config_params { + admin_state: ADMIN_STATE_ENABLED + } + node: 1 +} diff --git a/src/tests/p4-int-routing-acl/topology/run-stratum.sh b/src/tests/p4-int-routing-acl/topology/run-stratum.sh new file mode 100644 index 0000000000000000000000000000000000000000..29e4647793c79084dbc740d73af454cda16ac9d1 --- /dev/null +++ b/src/tests/p4-int-routing-acl/topology/run-stratum.sh @@ -0,0 +1,46 @@ +#!/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. + +# 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 ;} + +touch "${READ_LOGS_FILE_PATH}" +touch "${WRITE_LOGS_FILE_PATH}" + +ip netns exec ns-switch 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} + +exit 0 diff --git a/src/vnt_manager/service/VNTManagerService.py b/src/vnt_manager/service/VNTManagerService.py index b95ad089a454e9d73e99d9f14cbe525a6c9ca8cb..3f44c4a510245fc2ab145e35b8ff1f35e4ac0f78 100644 --- a/src/vnt_manager/service/VNTManagerService.py +++ b/src/vnt_manager/service/VNTManagerService.py @@ -12,19 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from common.Constants import ServiceNameEnum -from common.proto.vnt_manager_pb2_grpc import add_VNTManagerServiceServicer_to_server from common.Settings import get_service_port_grpc +from common.proto.vnt_manager_pb2 import DESCRIPTOR as VNT_MANAGER_DESCRIPTOR +from common.proto.vnt_manager_pb2_grpc import add_VNTManagerServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from .VNTManagerServiceServicerImpl import VNTManagerServiceServicerImpl -LOGGER = logging.getLogger(__name__) - - class VNTManagerService(GenericGrpcService): - def __init__(self, cls_name: str = __name__): + def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.VNTMANAGER) super().__init__(port, cls_name=cls_name) self.vntmanager_servicer = VNTManagerServiceServicerImpl() @@ -33,3 +29,5 @@ class VNTManagerService(GenericGrpcService): add_VNTManagerServiceServicer_to_server( self.vntmanager_servicer, self.server ) + + self.add_reflection_service_name(VNT_MANAGER_DESCRIPTOR, 'VNTManagerService') diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py index f3896bdd8f80ddcbcc55f91707caa5e462801cab..16b86c769c5af1b69db4b669f5689043d03536bd 100644 --- a/src/webui/service/device/routes.py +++ b/src/webui/service/device/routes.py @@ -13,10 +13,14 @@ # limitations under the License. import json -from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for +from flask import ( + current_app, render_template, Blueprint, flash, session, redirect, url_for +) from common.DeviceTypes import DeviceTypeEnum from common.proto.context_pb2 import ( - ConfigActionEnum, Device, DeviceDriverEnum, DeviceId, DeviceList, DeviceOperationalStatusEnum, Empty) + ConfigActionEnum, Device, DeviceDriverEnum, DeviceId, DeviceList, + DeviceOperationalStatusEnum, Empty +) from common.tools.context_queries.Device import get_device from common.tools.context_queries.Topology import get_topology from context.client.ContextClient import ContextClient diff --git a/src/webui/service/link/routes.py b/src/webui/service/link/routes.py index dacf77534711c97237ca1afd54c3646fe9809a28..42f5984a3c0957a0740690ad6e37bed7438449b7 100644 --- a/src/webui/service/link/routes.py +++ b/src/webui/service/link/routes.py @@ -13,8 +13,10 @@ # limitations under the License. -from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for -from common.proto.context_pb2 import Empty, Link, LinkId, LinkList +from flask import ( + current_app, render_template, Blueprint, flash, session, redirect, url_for +) +from common.proto.context_pb2 import Empty, Link, LinkId, LinkList, LinkTypeEnum from common.tools.context_queries.EndPoint import get_endpoint_names from common.tools.context_queries.Link import get_link from common.tools.context_queries.Topology import get_topology @@ -50,7 +52,10 @@ def home(): device_names, endpoints_data = get_endpoint_names(context_client, endpoint_ids) context_client.close() - return render_template('link/home.html', links=links, device_names=device_names, endpoints_data=endpoints_data) + return render_template( + 'link/home.html', links=links, device_names=device_names, + endpoints_data=endpoints_data, lte=LinkTypeEnum + ) @link.route('detail/<path:link_uuid>', methods=('GET', 'POST')) @@ -64,7 +69,10 @@ def detail(link_uuid: str): else: device_names, endpoints_data = get_endpoint_names(context_client, link_obj.link_endpoint_ids) context_client.close() - return render_template('link/detail.html',link=link_obj, device_names=device_names, endpoints_data=endpoints_data) + return render_template( + 'link/detail.html', link=link_obj, device_names=device_names, + endpoints_data=endpoints_data, lte=LinkTypeEnum + ) @link.get('<path:link_uuid>/delete') def delete(link_uuid): diff --git a/src/webui/service/templates/link/detail.html b/src/webui/service/templates/link/detail.html index 7c5f732e33a209b6acbd36b4982da90d7f148f38..775e5392d3dad06eaf13414cda2c9cde2586fe12 100644 --- a/src/webui/service/templates/link/detail.html +++ b/src/webui/service/templates/link/detail.html @@ -39,6 +39,7 @@ <div class="col-sm-4"> <b>UUID: </b>{{ link.link_id.link_uuid.uuid }}<br> <b>Name: </b>{{ link.name }}<br> + <b>Type: </b>{{ lte.Name(link.link_type).replace('LINKTYPE_', '') }}<br> </div> <div class="col-sm-8"> <table class="table table-striped table-hover"> diff --git a/src/webui/service/templates/link/home.html b/src/webui/service/templates/link/home.html index d96da78147d344533bf94fcc1adecbecf8fe8dd2..6632898793c8601bf30f8d824e9090e3a2f7552e 100644 --- a/src/webui/service/templates/link/home.html +++ b/src/webui/service/templates/link/home.html @@ -12,87 +12,89 @@ 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. - --> - - {% extends 'base.html' %} - - {% block content %} - <h1>Links</h1> - - <div class="row"> - <div class="col"> - <!-- <a href="#" class="btn btn-primary" style="margin-bottom: 10px;"> - <i class="bi bi-plus"></i> - Add New Link - </a> --> - </div> - <div class="col"> - {{ links | length }} links found in context <i>{{ session['context_uuid'] }}</i> - </div> - <!-- <div class="col"> - <form> - <div class="input-group"> - <input type="text" aria-label="Search" placeholder="Search..." class="form-control"/> - <button type="submit" class="btn btn-primary">Search</button> - </div> - </form> - </div> --> - </div> - - <table class="table table-striped table-hover"> - <thead> - <tr> - <th scope="col">UUID</th> - <th scope="col">Name</th> - <th scope="col">Endpoints</th> - <th scope="col"></th> - </tr> - </thead> - <tbody> - {% if links %} - {% for link in links %} - <tr> - <td> +--> + +{% extends 'base.html' %} + +{% block content %} + <h1>Links</h1> + + <div class="row"> + <div class="col"> + <!-- <a href="#" class="btn btn-primary" style="margin-bottom: 10px;"> + <i class="bi bi-plus"></i> + Add New Link + </a> --> + </div> + <div class="col"> + {{ links | length }} links found in context <i>{{ session['context_uuid'] }}</i> + </div> + <!-- <div class="col"> + <form> + <div class="input-group"> + <input type="text" aria-label="Search" placeholder="Search..." class="form-control"/> + <button type="submit" class="btn btn-primary">Search</button> + </div> + </form> + </div> --> + </div> + + <table class="table table-striped table-hover"> + <thead> + <tr> + <th scope="col">UUID</th> + <th scope="col">Name</th> + <th scope="col">Type</th> + <th scope="col">Endpoints</th> + <th scope="col"></th> + </tr> + </thead> + <tbody> + {% if links %} + {% for link in links %} + <tr> + <td> {{ link.link_id.link_uuid.uuid }} - </td> - <td> + </td> + <td> {{ link.name }} </td> - - <td> - <ul> - {% for endpoint in link.link_endpoint_ids %} - <li> - {{ endpoints_data.get(endpoint.endpoint_uuid.uuid, (endpoint.endpoint_uuid.uuid, ''))[0] }} / - Device: - <a href="{{ url_for('device.detail', device_uuid=endpoint.device_id.device_uuid.uuid) }}"> - {{ device_names.get(endpoint.device_id.device_uuid.uuid, endpoint.device_id.device_uuid.uuid) }} - <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16"> - <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/> - <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/> - </svg> - </a> - </li> - {% endfor %} - </ul> - </td> + <td> + {{ lte.Name(link.link_type).replace('LINKTYPE_', '') }} + </td> + <td> + <ul> + {% for endpoint in link.link_endpoint_ids %} + <li> + {{ endpoints_data.get(endpoint.endpoint_uuid.uuid, (endpoint.endpoint_uuid.uuid, ''))[0] }} / + Device: + <a href="{{ url_for('device.detail', device_uuid=endpoint.device_id.device_uuid.uuid) }}"> + {{ device_names.get(endpoint.device_id.device_uuid.uuid, endpoint.device_id.device_uuid.uuid) }} + <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16"> + <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/> + <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/> + </svg> + </a> + </li> + {% endfor %} + </ul> + </td> - <td> + <td> <a href="{{ url_for('link.detail', link_uuid=link.link_id.link_uuid.uuid) }}"> - <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16"> - <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/> - <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/> - </svg> - </a> - </td> - </tr> - {% endfor %} - {% else %} - <tr> - <td colspan="7">No links found</td> - </tr> - {% endif %} - </tbody> - </table> - - {% endblock %} \ No newline at end of file + <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16"> + <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/> + <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/> + </svg> + </a> + </td> + </tr> + {% endfor %} + {% else %} + <tr> + <td colspan="7">No links found</td> + </tr> + {% endif %} + </tbody> + </table> +{% endblock %}