meta/rpc/SAI/RPC/Function/Argument.pm (100 lines of code) (raw):

# Copyright 2021-present Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package SAI::RPC::Function::Argument; use Moose::Role; requires 'name'; requires 'type'; requires 'pos'; requires 'in'; requires 'out'; requires 'parent'; requires 'count'; requires 'is_count'; requires 'has_attributes'; requires 'compare'; # Determine if the argument is a return value defined by the RPC interface sub is_rpc_return { my $self = shift; return 1 if $self->compare( $self->parent->rpc_return ); return 0; } # Most of types returned by C++ server are the same as in Thrift file, # but some of them are being changed by Thrift to void, and moved into first parameter. sub is_cpp_return { my $self = shift; if ( $self->is_rpc_return ) { return 1 unless $self->is_list or $self->type->thrift_name eq 'string' or $self->type->thrift_name eq 'void'; } return 0; } sub is_adapter_arg { my $self = shift; # Expose all arguments, with some exceptions: # We cannot expose arguments which are not exposed via RPC return 0 if not $self->is_rpc_arg; # Don't expose attributes - we handle them using arguments return 0 if ( $self->is_attr or $self->type->is_attr_list ); # Don't expose stats lists - we add them all to the list by default return 0 if ( $self->is_list and $self->type->subtype->name =~ 'stat_id_t' ); # Python can take count from its lists natively return 0 if ( $self->is_count ); return 1; } sub is_rpc_arg { my $self = shift; # Expose all arguments, with some exceptions: # Remove switch ID return 0 if $self->name =~ /switch_o?id/ and $self->typename =~ /object_id_t/; # Count is taken from vector (unless it is a list of counts) return 0 if $self->is_count and not $self->is_list; # If the argument is returned by RPC funtion (and is not 'in'), # then remove it from RPC argument list return 0 if $self->compare( $self->parent->rpc_return ) and not $self->in; return 1; } # Obsolete # TODO: Remove this method sub internal { my $self = shift; return not $self->is_rpc_arg; } # Check if the argument requires additional vector allocated sub requires_vector { my $self = shift; # We declare additional vector for attributes. If the argument is a list # then we already have a vector (but for sai_attr_list we need it anyway # to extract the vector from sai_attr_list structure) return 1 if $self->is_attr and ( not $self->is_list or $self->is_attr_list ); return 0; } # Check if the argument requires malloc - for attribute # or counter parsing sub requires_malloc { my $self = shift; return 1 if $self->is_list or $self->is_attr_list; return 0; } # Check if the argument requires counter type parsing sub requires_counter_parsing { my $self = shift; return 1 if $self->parent->operation =~ '(stats|clear)' and $self->is_list; return 0; } # Check if the argument requires struct or another complex # type parsing sub requires_parsing { my $self = shift; return 1 if ( $self->type->ptr and $self->is_rpc_arg ) or $self->requires_counter_parsing; return 0; } sub requires_preprocessing { my $self = shift; return ( $self->requires_parsing or $self->requires_malloc ); } sub requires_casting { my $self = shift; # All RPC arguments should be casted into SAI types. If the argument # is preprocessed, then we already have a variable of the proper type. return ( $self->is_rpc_arg and not $self->requires_preprocessing ); } sub requires_address { my $self = shift; # RPC args are not passed by pointers, so if SAI requires an address # then we need to use '&' operator, unless we already declared a pointer. return ( $self->type->ptr and not $self->requires_malloc ); } sub requires_declaration { my $self = shift; # If argument is a count then don't declare it. We can do it later # if needed. return 0 if $self->is_count; # If argument requires malloc, then we declare it right before malloc return 0 if $self->requires_malloc; return 1 if $self->requires_parsing; # If this is an internal argument only, then we have to declare it, # because it is not part of Thrift argument list return 1 if not $self->is_rpc_arg; # in/out arguments: in Thrift list is of C++ type, so # we need a local C copy. return 1 if $self->in and $self->out; return 0; } sub requires_adapter_preprocessing { my $self = shift; # We preprocess only those attributes which are # 1) Related to stats (lists) or attributes # 2) Are required by RPC server, but not provided # by python caller. # Note, that expanded attribute lists are not # considered as function arguments (they are not # part of SAI interface). # The attribute argument itself is hidden (not # exposed by adapter). return ( not $self->is_adapter_arg and $self->is_rpc_arg and ( $self->is_list or $self->is_attr ) ); } 1;