/* 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.3"; 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_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, }; 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; }; 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; }; /* 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; };