ip: Replace Sematics for Interface IP addresses
[vpp.git] / src / vnet / interface.api
index d8d9198..c262cd6 100644 (file)
  * limitations under the License.
  */
 
-option version = "2.3.0";
+option version = "3.2.2";
 
 import "vnet/interface_types.api";
+import "vnet/ethernet/ethernet_types.api";
+import "vnet/ip/ip_types.api";
 
 service {
   rpc want_interface_events returns want_interface_events_reply
@@ -27,16 +29,15 @@ service {
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
     @param sw_if_index - index of the interface to set flags on
-    @param admin_up_down - set the admin state, 1 = up, 0 = down
-    @param link_up_down - Oper state sent on change event, not used in config.
+    @param flags - interface_status flags
+        (only IF_STATUS_API_FLAG_ADMIN_UP used in config)
 */
 autoreply define sw_interface_set_flags
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  /* 1 = up, 0 = down */
-  u8 admin_up_down;
+  vl_api_interface_index_t sw_if_index;
+  vl_api_if_status_flags_t flags;
 };
 
 /** \brief Set interface physical MTU
@@ -49,7 +50,7 @@ autoreply define hw_interface_set_mtu
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
   u16 mtu;
 };
 
@@ -58,9 +59,8 @@ autoreply define sw_interface_set_mtu
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  /* $$$$ Replace with enum */
-  u32 mtu[4]; /* 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
+  vl_api_interface_index_t sw_if_index;
+  u32 mtu[4]; /* vl_api_mtu_proto_t 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
 };
 
 /** \brief Set IP4 directed broadcast
@@ -73,26 +73,24 @@ autoreply define sw_interface_set_ip_directed_broadcast
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  u8  enable;
+  vl_api_interface_index_t sw_if_index;
+  bool  enable;
 };
 
 /** \brief Interface Event generated by want_interface_events
     @param client_index - opaque cookie to identify the sender
     @param pid - client pid registered to receive notification
     @param sw_if_index - index of the interface of the event
-    @param admin_up_down - The administrative state; 1 = up, 0 = down
-    @param link_up_down - The operational state; 1 = up, 0 = down
+    @param flags - interface_status flags
     @param deleted - interface was deleted
 */
 define sw_interface_event
 {
   u32 client_index;
   u32 pid;
-  u32 sw_if_index;
-  u8 admin_up_down;
-  u8 link_up_down;
-  u8 deleted;
+  vl_api_interface_index_t sw_if_index;
+  vl_api_if_status_flags_t flags;
+  bool deleted;
 };
 
 /** \brief Register for interface events
@@ -109,25 +107,20 @@ autoreply define want_interface_events
   u32 pid;
 };
 
-/** \brief Interface details structure (fix this) 
+/** \brief Interface details structure (fix this)
     @param sw_if_index - index of the interface
     @param sup_sw_if_index - index of parent interface if any, else same as sw_if_index
-    @param l2_address_length - length of the interface's l2 address
-    @param pid - the interface's l2 address
-    @param interface_name - name of the interface
+    @param l2_address - the interface's l2 address
+    @param flags - interface_status flags
+    @param type - interface type
     @param link_duplex - 1 if half duplex, 2 if full duplex
     @param link_speed - value in kbps
     @param link_MTU - max. transmission unit
-    @param sub_if_id - A number 0-N to uniquely identify this subif on super if
-    @param sub_dot1ad - 0 = dot1q, 1 = dot1ad
-    @param sub_dot1ah - 1 = dot1ah, 0 = otherwise
+    @param sub_id - A number 0-N to uniquely identify this subif on super if
     @param sub_number_of_tags - Number of tags (0 - 2)
     @param sub_outer_vlan_id
     @param sub_inner_vlan_id
-    @param sub_exact_match
-    @param sub_default
-    @param sub_outer_vlan_id_any
-    @param sub_inner_vlan_id_any
+    @param sub_if_flags - sub interface flags
     @param vtr_op - vlan tag rewrite operation
     @param vtr_push_dot1q
     @param vtr_tag1
@@ -137,29 +130,28 @@ autoreply define want_interface_events
     @param pbb_b_smac[6] - B-tag local mac address
     @param pbb_b_vlanid - B-tag vlanid
     @param pbb_i_sid - I-tag service id
+    @param interface_name - name of the interface
+    @param interface_dev_type - device type of the interface
+    @param tag - an ascii tag
 */
 define sw_interface_details
 {
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 
   /* index of sup interface (e.g. hw interface).
      equal to sw_if_index for super hw interface. */
   u32 sup_sw_if_index;
 
   /* Layer 2 address, if applicable */
-  u32 l2_address_length;
-  u8 l2_address[8];
+  vl_api_mac_address_t l2_address;
 
-  /* Interface name */
-  u8 interface_name[64];
+  vl_api_if_status_flags_t flags;
 
-  /* 1 = up, 0 = down */
-  u8 admin_up_down;
-  u8 link_up_down;
+  vl_api_if_type_t type;
 
   /* 1 = half duplex, 2 = full duplex */
-  u8 link_duplex;
+  vl_api_link_duplex_t link_duplex;
 
   /* link speed in kbps */
   u32 link_speed;
@@ -168,77 +160,109 @@ define sw_interface_details
   u16 link_mtu;
 
   /* Per protocol MTUs */
-  u32 mtu[4]; /* 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
+  u32 mtu[4]; /* vl_api_mtu_proto_t 0 - L3, 1 - IP4, 2 - IP6, 3 - MPLS */
 
   /* Subinterface ID. A number 0-N to uniquely identify this subinterface under the super interface */
   u32 sub_id;
 
-  /* 0 = dot1q, 1=dot1ad */
-  u8 sub_dot1ad;
-  /* 1 = dot1h, 1=otherwise */
-  u8 sub_dot1ah;
-
   /* Number of tags 0-2 */
   u8 sub_number_of_tags;
   u16 sub_outer_vlan_id;
   u16 sub_inner_vlan_id;
-  u8 sub_exact_match;
-  u8 sub_default;
-  u8 sub_outer_vlan_id_any;
-  u8 sub_inner_vlan_id_any;
+
+  vl_api_sub_if_flags_t sub_if_flags;
 
   /* vlan tag rewrite state */
   u32 vtr_op;
   u32 vtr_push_dot1q;          // ethertype of first pushed tag is dot1q/dot1ad
   u32 vtr_tag1;                        // first pushed tag
   u32 vtr_tag2;                        // second pushed tag
-  u8 tag[64];
 
   /* pbb tag rewrite info */
   u16 outer_tag;
-  u8  b_dmac[6];
-  u8  b_smac[6];
+  vl_api_mac_address_t  b_dmac;
+  vl_api_mac_address_t  b_smac;
   u16 b_vlanid;
   u32 i_sid;
+
+  /* Interface name */
+  string interface_name[64];
+  string interface_dev_type[64];
+  string tag[64];
 };
 
 /** \brief Request all or filtered subset of sw_interface_details
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param sw_if_index - index of the interface to dump info on, ~0 if on all
+    @param sw_if_index - index of the interface to dump info on, 0 or ~0 if on all
+      TODO: Support selecting only index==0 when CSIT is ready.
     @param name_filter_valid - 1 if requesting a filtered subset of records else 0
-      if name filter is valid, sw_if_index value is effectively set to ~0
+      if name filter is set as valid, sw_if_index value is ignored and all interfaces are examined
     @param name_filter - interface name substring filter. Eg. loop1 returns [loop1, loop10]
 */
 define sw_interface_dump
 {
   u32 client_index;
   u32 context;
-  vl_api_interface_index_t sw_if_index;
-  u8 name_filter_valid;
-  u8 name_filter[49];
+  vl_api_interface_index_t sw_if_index [default=0xFFFFFFFF];
+  bool name_filter_valid;
+  string name_filter[];
 };
 
 /** \brief Set or delete one or all ip addresses on a specified interface
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param sw_if_index - index of the interface to add/del addresses 
+    @param sw_if_index - index of the interface to add/del addresses
     @param is_add - add address if non-zero, else delete
-    @param is_ipv6 - if non-zero the address is ipv6, else ipv4
     @param del_all - if non-zero delete all addresses on the interface
-    @param address_length - address length in bytes, 4 for ip4, 16 for ip6
-    @param address - array of address bytes
+    @param prefix - address + a prefix length for the implied connected route
 */
 autoreply define sw_interface_add_del_address
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  u8 is_add;
-  u8 is_ipv6;
-  u8 del_all;
-  u8 address_length;
-  u8 address[16];
+  vl_api_interface_index_t sw_if_index;
+  bool is_add;
+
+  bool del_all;
+  vl_api_address_with_prefix_t prefix;
+};
+
+/** \brief IP interface address replace begin
+
+    The use-case is that, for some unspecified reason, the control plane
+    has a different set of interface addresses than VPP
+    currently has. The CP would thus like to 'replace' VPP's set
+    only by specifying what the new set shall be, i.e. it is not
+    going to delete anything that already eixts, rather, is wants any
+    unspecified interface addresses to be deleted implicitly.
+    The CP declares the start of this procedure with this replace_begin
+    API Call, and when it has populated all addresses it wants, it calls
+    the below replace_end API. From this point on it is of course free
+    to add and delete interface addresses as usual.
+    The underlying mechanism by which VPP implements this replace is
+    intentionally left unspecified.
+
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+*/
+autoreply define sw_interface_address_replace_begin
+{
+  u32 client_index;
+  u32 context;
+};
+
+/** \brief IP interface address replace end
+
+    see ip_interface_address_replace_begin description.
+
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+*/
+autoreply define sw_interface_address_replace_end
+{
+  u32 client_index;
+  u32 context;
 };
 
 /** \brief Associate the specified interface with a fib table
@@ -246,14 +270,14 @@ autoreply define sw_interface_add_del_address
     @param context - sender context, to match reply w/ request
     @param sw_if_index - index of the interface
     @param is_ipv6 - if non-zero ipv6, else ipv4
-    @param vrf_id - fib table/vrd id to associate the interface with
+    @param vrf_id - fib table/vrf id to associate the interface with
 */
 autoreply define sw_interface_set_table
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  u8 is_ipv6;
+  vl_api_interface_index_t sw_if_index;
+  bool is_ipv6;
   u32 vrf_id;
 };
 
@@ -266,8 +290,8 @@ define sw_interface_get_table
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  u8 is_ipv6;
+  vl_api_interface_index_t sw_if_index;
+  bool is_ipv6;
 };
 
 /** \brief Reply to get_sw_interface_vrf
@@ -292,9 +316,9 @@ autoreply define sw_interface_set_unnumbered
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;             /* use this intfc address */
-  u32 unnumbered_sw_if_index;  /* on this interface */
-  u8 is_add;
+  vl_api_interface_index_t sw_if_index;                /* use this intfc address */
+  vl_api_interface_index_t unnumbered_sw_if_index;     /* on this interface */
+  bool is_add;
 };
 
 /** \brief Clear interface statistics
@@ -306,7 +330,7 @@ autoreply define sw_interface_clear_stats
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Set / clear software interface tag
@@ -316,13 +340,29 @@ autoreply define sw_interface_clear_stats
     @param add_del - 1 = add, 0 = delete
     @param tag - an ascii tag
 */
-autoreply define sw_interface_tag_add_del 
+autoreply define sw_interface_tag_add_del
+{
+  u32 client_index;
+  u32 context;
+  bool is_add;
+  vl_api_interface_index_t sw_if_index;
+  string tag[64];
+};
+
+/** \brief Add or delete a secondary MAC address on an interface
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param sw_if_index - the interface whose MAC will be set
+    @param mac_addr - the new MAC address
+    @param is_add - 0 to delete, != 0 to add
+*/
+autoreply define sw_interface_add_del_mac_address
 {
     u32 client_index;
     u32 context;
-    u8 is_add;
     u32 sw_if_index;
-    u8 tag[64];
+    vl_api_mac_address_t addr;
+    u8 is_add;
 };
 
 /** \brief Set an interface's MAC address
@@ -333,10 +373,10 @@ autoreply define sw_interface_tag_add_del
 */
 autoreply define sw_interface_set_mac_address
 {
-    u32 client_index;
-    u32 context;
-    u32 sw_if_index;
-    u8 mac_address[6];
+  u32 client_index;
+  u32 context;
+  vl_api_interface_index_t sw_if_index;
+  vl_api_mac_address_t mac_address;
 };
 
 /** \brief Get interface's MAC address
@@ -346,9 +386,9 @@ autoreply define sw_interface_set_mac_address
 */
 define sw_interface_get_mac_address
 {
-    u32 client_index;
-    u32 context;
-    u32 sw_if_index;
+  u32 client_index;
+  u32 context;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Reply for get interface's MAC address request
@@ -358,9 +398,9 @@ define sw_interface_get_mac_address
 */
 define sw_interface_get_mac_address_reply
 {
-    u32 context;
-    i32 retval;
-    u8 mac_address[6];
+  u32 context;
+  i32 retval;
+  vl_api_mac_address_t mac_address;
 };
 
 /** \brief Set an interface's rx-mode
@@ -375,12 +415,12 @@ define sw_interface_get_mac_address_reply
 */
 autoreply define sw_interface_set_rx_mode
 {
-    u32 client_index;
-    u32 context;
-    u32 sw_if_index;
-    u8 queue_id_valid;
-    u32 queue_id;
-    u8 mode;
+  u32 client_index;
+  u32 context;
+  vl_api_interface_index_t sw_if_index;
+  bool queue_id_valid;
+  u32 queue_id;
+  vl_api_rx_mode_t mode;
 };
 
 /** \brief Set an interface's rx-placement
@@ -398,10 +438,10 @@ autoreply define sw_interface_set_rx_placement
 {
     u32 client_index;
     u32 context;
-    u32 sw_if_index;
+    vl_api_interface_index_t sw_if_index;
     u32 queue_id;
     u32 worker_id;
-    u8 is_main;
+    bool is_main;
 };
 
 /** \brief dump the rx queue placement of interface(s)
@@ -414,7 +454,7 @@ define sw_interface_rx_placement_dump
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief show the interface's queue - thread placement
@@ -436,10 +476,10 @@ define sw_interface_rx_placement_details
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
   u32 queue_id;
   u32 worker_id;
-  u8 mode;
+  vl_api_rx_mode_t mode;
 };
 
 /* Gross kludge, DGMS */
@@ -447,7 +487,7 @@ autoreply define interface_name_renumber
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
   u32 new_show_dev_instance;
 };
 
@@ -455,18 +495,10 @@ define create_subif
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
   u32 sub_id;
 
-  /* These fields map directly onto the subif template */
-  u8 no_tags;
-  u8 one_tag;
-  u8 two_tags;
-  u8 dot1ad;                   // 0 = dot1q, 1=dot1ad
-  u8 exact_match;
-  u8 default_sub;
-  u8 outer_vlan_id_any;
-  u8 inner_vlan_id_any;
+  vl_api_sub_if_flags_t sub_if_flags;
   u16 outer_vlan_id;
   u16 inner_vlan_id;
 };
@@ -475,7 +507,7 @@ define create_subif_reply
 {
   u32 context;
   i32 retval;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Create a new subinterface with the given vlan id
@@ -488,7 +520,7 @@ define create_vlan_subif
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
   u32 vlan_id;
 };
 
@@ -501,7 +533,7 @@ define create_vlan_subif_reply
 {
   u32 context;
   i32 retval;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Delete sub interface request
@@ -512,7 +544,7 @@ define create_vlan_subif_reply
 autoreply define delete_subif {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Create loopback interface request
@@ -524,7 +556,7 @@ define create_loopback
 {
   u32 client_index;
   u32 context;
-  u8 mac_address[6];
+  vl_api_mac_address_t mac_address;
 };
 
 /** \brief Create loopback interface response
@@ -536,7 +568,7 @@ define create_loopback_reply
 {
   u32 context;
   i32 retval;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Create loopback interface instance request
@@ -550,8 +582,8 @@ define create_loopback_instance
 {
   u32 client_index;
   u32 context;
-  u8 mac_address[6];
-  u8 is_specified;
+  vl_api_mac_address_t mac_address;
+  bool is_specified;
   u32 user_instance;
 };
 
@@ -564,7 +596,7 @@ define create_loopback_instance_reply
 {
   u32 context;
   i32 retval;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Delete loopback interface request
@@ -576,7 +608,7 @@ autoreply define delete_loopback
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
+  vl_api_interface_index_t sw_if_index;
 };
 
 /** \brief Enable or disable detailed interface stats
@@ -590,8 +622,8 @@ autoreply define collect_detailed_interface_stats
 {
   u32 client_index;
   u32 context;
-  u32 sw_if_index;
-  u8  enable_disable;
+  vl_api_interface_index_t sw_if_index;
+  bool  enable_disable;
 };
 
 /*