/*
 * Copyright (c) 2017 SUSE LLC.
 * 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 = "2.1.0";

import "vnet/interface_types.api";
import "vnet/ethernet/ethernet_types.api";
import "vnet/ip/ip_types.api";

define geneve_add_del_tunnel
{
  option deprecated="20.06";
  u32 client_index;
  u32 context;
  bool is_add;
  vl_api_address_t local_address;
  vl_api_address_t remote_address;
  vl_api_interface_index_t mcast_sw_if_index;
  u32 encap_vrf_id;
  u32 decap_next_index;
  u32 vni;
};

define geneve_add_del_tunnel_reply
{
  u32 context;
  i32 retval;
  vl_api_interface_index_t sw_if_index;
};

define geneve_add_del_tunnel2
{
  u32 client_index;
  u32 context;
  bool is_add;
  vl_api_address_t local_address;
  vl_api_address_t remote_address;
  vl_api_interface_index_t mcast_sw_if_index;
  u32 encap_vrf_id;
  u32 decap_next_index;
  u32 vni;
  bool l3_mode;
};

define geneve_add_del_tunnel2_reply
{
  u32 context;
  i32 retval;
  vl_api_interface_index_t sw_if_index;
};

define geneve_tunnel_dump
{
  u32 client_index;
  u32 context;
  vl_api_interface_index_t sw_if_index;
};

define geneve_tunnel_details
{
  u32 context;
  vl_api_interface_index_t sw_if_index;
  vl_api_address_t src_address;
  vl_api_address_t dst_address;
  vl_api_interface_index_t mcast_sw_if_index;
  u32 encap_vrf_id;
  u32 decap_next_index;
  u32 vni;
};

/** \brief Interface set geneve-bypass request
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - interface used to reach neighbor
    @param is_ipv6 - if non-zero, enable ipv6-geneve-bypass, else ipv4-geneve-bypass
    @param enable - if non-zero enable, else disable
*/
autoreply define sw_interface_set_geneve_bypass
{
  u32 client_index;
  u32 context;
  vl_api_interface_index_t sw_if_index;
  bool is_ipv6;
  bool enable;
};
