/* Hey Emacs use -*- mode: C -*- */ /* * Copyright (c) 2020 Intel and/or its affiliates. * 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. */ option version = "0.0.4"; import "vnet/ethernet/ethernet_types.api"; import "vnet/ip/ip_types.api"; enum flow_type { FLOW_TYPE_ETHERNET = 1, FLOW_TYPE_IP4, FLOW_TYPE_IP6, FLOW_TYPE_IP4_L2TPV3OIP, FLOW_TYPE_IP4_IPSEC_ESP, FLOW_TYPE_IP4_IPSEC_AH, FLOW_TYPE_IP4_N_TUPLE, FLOW_TYPE_IP6_N_TUPLE, FLOW_TYPE_IP4_N_TUPLE_TAGGED, FLOW_TYPE_IP6_N_TUPLE_TAGGED, FLOW_TYPE_IP4_VXLAN, FLOW_TYPE_IP6_VXLAN, FLOW_TYPE_IP4_GTPC, FLOW_TYPE_IP4_GTPU, }; enum flow_type_v2 { FLOW_TYPE_ETHERNET_V2 = 1, FLOW_TYPE_IP4_V2, FLOW_TYPE_IP6_V2, FLOW_TYPE_IP4_L2TPV3OIP_V2, FLOW_TYPE_IP4_IPSEC_ESP_V2, FLOW_TYPE_IP4_IPSEC_AH_V2, FLOW_TYPE_IP4_N_TUPLE_V2, FLOW_TYPE_IP6_N_TUPLE_V2, FLOW_TYPE_IP4_N_TUPLE_TAGGED_V2, FLOW_TYPE_IP6_N_TUPLE_TAGGED_V2, FLOW_TYPE_IP4_VXLAN_V2, FLOW_TYPE_IP6_VXLAN_V2, FLOW_TYPE_IP4_GTPC_V2, FLOW_TYPE_IP4_GTPU_V2, FLOW_TYPE_GENERIC_V2, }; enum flow_action { FLOW_ACTION_COUNT = 1, FLOW_ACTION_MARK = 2, FLOW_ACTION_BUFFER_ADVANCE = 4, FLOW_ACTION_REDIRECT_TO_NODE = 8, FLOW_ACTION_REDIRECT_TO_QUEUE = 16, FLOW_ACTION_DROP = 64, }; enum flow_action_v2 { FLOW_ACTION_COUNT_V2 = 1, FLOW_ACTION_MARK_V2 = 2, FLOW_ACTION_BUFFER_ADVANCE_V2 = 4, FLOW_ACTION_REDIRECT_TO_NODE_V2 = 8, FLOW_ACTION_REDIRECT_TO_QUEUE_V2 = 16, FLOW_ACTION_RSS_V2 = 32, FLOW_ACTION_DROP_V2 = 64, }; enum rss_function { RSS_FUNC_DEFAULT, RSS_FUNC_TOEPLITZ, RSS_FUNC_SIMPLE_XOR, RSS_FUNC_SYMMETRIC_TOEPLITZ, }; typedef generic_pattern { u8 spec[1024]; u8 mask[1024]; }; typedef ip_port_and_mask { u16 port; u16 mask; }; typedef ip_prot_and_mask { vl_api_ip_proto_t prot; u8 mask; }; typedef flow_ethernet { i32 foo; vl_api_mac_address_t src_addr; vl_api_mac_address_t dst_addr; u16 type; }; typedef flow_ip4 { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; }; typedef flow_ip6 { i32 foo; vl_api_ip6_address_and_mask_t src_addr; vl_api_ip6_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; }; typedef flow_ip4_n_tuple { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; }; typedef flow_ip6_n_tuple { i32 foo; vl_api_ip6_address_and_mask_t src_addr; vl_api_ip6_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; }; typedef flow_ip4_n_tuple_tagged { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; }; typedef flow_ip6_n_tuple_tagged { i32 foo; vl_api_ip6_address_and_mask_t src_addr; vl_api_ip6_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; }; typedef flow_ip4_l2tpv3oip { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; u32 session_id; }; typedef flow_ip4_ipsec_esp { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; u32 spi; }; typedef flow_ip4_ipsec_ah { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; u32 spi; }; typedef flow_ip4_vxlan { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; u32 vni; }; typedef flow_ip6_vxlan { i32 foo; vl_api_ip6_address_and_mask_t src_addr; vl_api_ip6_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; u32 vni; }; typedef flow_ip4_gtpc { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; u32 teid; }; typedef flow_ip4_gtpu { i32 foo; vl_api_ip4_address_and_mask_t src_addr; vl_api_ip4_address_and_mask_t dst_addr; vl_api_ip_prot_and_mask_t protocol; vl_api_ip_port_and_mask_t src_port; vl_api_ip_port_and_mask_t dst_port; u32 teid; }; typedef flow_generic { i32 foo; vl_api_generic_pattern_t pattern; }; union flow { vl_api_flow_ethernet_t ethernet; vl_api_flow_ip4_t ip4; vl_api_flow_ip6_t ip6; vl_api_flow_ip4_l2tpv3oip_t ip4_l2tpv3oip; vl_api_flow_ip4_ipsec_esp_t ip4_ipsec_esp; vl_api_flow_ip4_ipsec_ah_t ip4_ipsec_ah; vl_api_flow_ip4_n_tuple_t ip4_n_tuple; vl_api_flow_ip6_n_tuple_t ip6_n_tuple; vl_api_flow_ip4_n_tuple_tagged_t ip4_n_tuple_tagged; vl_api_flow_ip6_n_tuple_tagged_t ip6_n_tuple_tagged; vl_api_flow_ip4_vxlan_t ip4_vxlan; vl_api_flow_ip6_vxlan_t ip6_vxlan; vl_api_flow_ip4_gtpc_t ip4_gtpc; vl_api_flow_ip4_gtpu_t ip4_gtpu; }; union flow_v2 { vl_api_flow_ethernet_t ethernet; vl_api_flow_ip4_t ip4; vl_api_flow_ip6_t ip6; vl_api_flow_ip4_l2tpv3oip_t ip4_l2tpv3oip; vl_api_flow_ip4_ipsec_esp_t ip4_ipsec_esp; vl_api_flow_ip4_ipsec_ah_t ip4_ipsec_ah; vl_api_flow_ip4_n_tuple_t ip4_n_tuple; vl_api_flow_ip6_n_tuple_t ip6_n_tuple; vl_api_flow_ip4_n_tuple_tagged_t ip4_n_tuple_tagged; vl_api_flow_ip6_n_tuple_tagged_t ip6_n_tuple_tagged; vl_api_flow_ip4_vxlan_t ip4_vxlan; vl_api_flow_ip6_vxlan_t ip6_vxlan; vl_api_flow_ip4_gtpc_t ip4_gtpc; vl_api_flow_ip4_gtpu_t ip4_gtpu; vl_api_flow_generic_t generic; }; /* main flow struct */ typedef flow_rule { /* flow type */ vl_api_flow_type_t type; /* flow index */ u32 index; /* bitmap of flow actions (FLOW_ACTION_*) */ vl_api_flow_action_t actions; /* flow id for VNET_FLOW_ACTION_MARK */ u32 mark_flow_id; /* node index and next index for FLOW_ACTION_REDIRECT_TO_NODE */ u32 redirect_node_index; u32 redirect_device_input_next_index; /* queue for FLOW_ACTION_REDIRECT_TO_QUEUE */ u32 redirect_queue; /* buffer offset for FLOW_ACTION_BUFFER_ADVANCE */ i32 buffer_advance; /* flow enum */ vl_api_flow_t flow; }; /* main flow struct */ typedef flow_rule_v2 { /* flow type */ vl_api_flow_type_v2_t type; /* flow index */ u32 index; /* bitmap of flow actions (FLOW_ACTION_*) */ vl_api_flow_action_v2_t actions; /* flow id for VNET_FLOW_ACTION_MARK */ u32 mark_flow_id; /* node index and next index for FLOW_ACTION_REDIRECT_TO_NODE */ u32 redirect_node_index; u32 redirect_device_input_next_index; /* queue for FLOW_ACTION_REDIRECT_TO_QUEUE */ u32 redirect_queue; /* start queue index and queue numbers for RSS queue group with FLOW_ACTION_RSS */ u32 queue_index; u32 queue_num; /* buffer offset for FLOW_ACTION_BUFFER_ADVANCE */ i32 buffer_advance; /* RSS types, including IPv4/IPv6/TCP/UDP... */ u64 rss_types; /* RSS functions, including IPv4/IPv6/TCP/UDP... */ vl_api_rss_function_t rss_fun; /* flow enum */ vl_api_flow_v2_t flow; };