flow: add vnet/flow formal API
[vpp.git] / src / vnet / flow / flow_types.api
diff --git a/src/vnet/flow/flow_types.api b/src/vnet/flow/flow_types.api
new file mode 100644 (file)
index 0000000..d872d6e
--- /dev/null
@@ -0,0 +1,218 @@
+/* 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.1";
+import "vnet/ethernet/ethernet_types.api";
+import "vnet/ip/ip_types.api";
+
+enum flow_type
+{
+  FLOW_TYPE_ETHERNET = 1,
+  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_L2TPV3OIP,
+  FLOW_TYPE_IP4_IPSEC_ESP,
+  FLOW_TYPE_IP4_IPSEC_AH,
+  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 flow_ethernet
+{
+  i32 foo;
+  vl_api_mac_address_t src_addr;
+  vl_api_mac_address_t dst_addr;
+  u16 type;
+};
+
+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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+};
+
+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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+};
+
+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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+};
+
+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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+};
+
+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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+  u32 spi;
+};
+
+typedef flow_ip4_vxlan
+{
+  i32 foo;
+  vl_api_ip4_address_t src_addr;
+  vl_api_ip4_address_t dst_addr;
+  u16 dst_port;
+  u16 vni;
+};
+
+typedef flow_ip6_vxlan
+{
+  i32 foo;
+  vl_api_ip6_address_t src_addr;
+  vl_api_ip6_address_t dst_addr;
+  u16 dst_port;
+  u16 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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+  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_port_and_mask_t src_port;
+  vl_api_ip_port_and_mask_t dst_port;
+  vl_api_ip_proto_t protocol;
+  u32 teid;
+};
+
+union flow
+{
+  vl_api_flow_ethernet_t ethernet;
+  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_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_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;
+};
+