ip: Protocol Independent IP Neighbors

Type: feature

 - ip-neighbour: generic neighbour handling; APIs, DBs, event handling,
aging
 - arp: ARP protocol implementation
 - ip6-nd; IPv6 neighbor discovery implementation; separate ND,
MLD, RA
 - ip6-link; manage link-local addresses
 - l2-arp-term; events separated from IP neighbours, since they are not
the same.

vnet retains just enough education to perform ND/ARP packet
construction.
arp and ip6-nd to be moved to plugins soon.

Change-Id: I88dedd0006b299344f4c7024a0aa5baa6b9a8bbe
Signed-off-by: Neale Ranns <nranns@cisco.com>
diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api
index 0bdd152..831b38a 100644
--- a/src/vnet/ip/ip.api
+++ b/src/vnet/ip/ip.api
@@ -189,76 +189,6 @@
   vl_api_ip_route_t route;
 };
 
-/** \brief IP neighbor flags
-    @param is_static - A static neighbor Entry - there are not flushed
-                       If the interface goes down.
-    @param is_no_fib_entry - Do not create a corresponding entry in the FIB
-                           table for the neighbor.
-*/
-enum ip_neighbor_flags
-{
-  IP_API_NEIGHBOR_FLAG_NONE = 0,
-  IP_API_NEIGHBOR_FLAG_STATIC = 0x1,
-  IP_API_NEIGHBOR_FLAG_NO_FIB_ENTRY = 0x2,
-};
-
-/** \brief IP neighbor
-    @param sw_if_index - interface used to reach neighbor
-    @param mac_address - l2 address of the neighbor
-    @param ip_address - ip4 or ip6 address of the neighbor
-    @param flags - flags for the nieghbor
-*/
-typedef ip_neighbor {
-  vl_api_interface_index_t sw_if_index;
-  vl_api_ip_neighbor_flags_t flags;
-  vl_api_mac_address_t mac_address;
-  vl_api_address_t ip_address;
-};
-
-/** \brief IP neighbor add / del request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param is_add - 1 to add neighbor, 0 to delete
-    @param neighbor - the neighor to add/remove
-*/
-define ip_neighbor_add_del
-{
-  u32 client_index;
-  u32 context;
-  /* 1 = add, 0 = delete */
-  bool is_add;
-  vl_api_ip_neighbor_t neighbor;
-};
-define ip_neighbor_add_del_reply
-{
-  u32 context;
-  i32 retval;
-  u32 stats_index;
-};
-
-/** \brief Dump IP neighboors
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - the interface to dump neighboors, ~0 == all
-    @param is_ipv6 - [1|0] to indicate if address family is ipv[6|4]
-*/
-define ip_neighbor_dump
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  bool is_ipv6;
-};
-
-/** \brief IP neighboors dump response
-    @param context - sender context which was passed in the request
-    @param neighbour - the neighbor
-*/
-define ip_neighbor_details {
-  u32 context;
-  vl_api_ip_neighbor_t neighbor;
-};
-
 /** \brief Set the ip flow hash config for a fib request
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
@@ -287,150 +217,6 @@
   u8 symmetric;
 };
 
-/** \brief IPv6 router advertisement config request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param suppress -
-    @param managed -
-    @param other -
-    @param ll_option -
-    @param send_unicast -
-    @param cease -
-    @param is_no -
-    @param default_router -
-    @param max_interval -
-    @param min_interval -
-    @param lifetime -
-    @param initial_count -
-    @param initial_interval -
-*/
-autoreply define sw_interface_ip6nd_ra_config
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  u8 suppress;
-  u8 managed;
-  u8 other;
-  u8 ll_option;
-  u8 send_unicast;
-  u8 cease;
-  bool is_no;
-  u8 default_router;
-  u32 max_interval;
-  u32 min_interval;
-  u32 lifetime;
-  u32 initial_count;
-  u32 initial_interval;
-};
-
-/** \brief IPv6 router advertisement prefix config request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - The interface the RA prefix information is for
-    @param prefix - The prefix to advertise
-    @param use_default - Revert to default settings
-    @param no_advertise - Do not advertise this prefix
-    @param off_link - The prefix is off link (it is not configured on the interface)
-                      Configures the L-flag, When set, indicates that this
-		      prefix can be used for on-link determination.
-    @param no_autoconfig - Setting for the A-flag. When
-                           set indicates that this prefix can be used for
-                          stateless address configuration.
-    @param no_onlink - The prefix is not on link. Make sure this is consistent
-                       with the off_link parameter else YMMV
-    @param is_no - add/delete
-    @param val_lifetime - The length of time in
-                     seconds (relative to the time the packet is sent)
-                     that the prefix is valid for the purpose of on-link
-                     determination.  A value of all one bits
-                     (0xffffffff) represents infinity
-    @param pref_lifetime - The length of time in
-                     seconds (relative to the time the packet is sent)
-                     that addresses generated from the prefix via
-                     stateless address autoconfiguration remain
-                     preferred [ADDRCONF].  A value of all one bits
-                     (0xffffffff) represents infinity.
-*/
-autoreply define sw_interface_ip6nd_ra_prefix
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_prefix_t prefix;
-  bool use_default;
-  bool no_advertise;
-  bool off_link;
-  bool no_autoconfig;
-  bool no_onlink;
-  bool is_no;
-  u32 val_lifetime;
-  u32 pref_lifetime;
-};
-
-/** \brief IPv6 ND proxy config
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - The interface the host is on
-    @param address - The address of the host for which to proxy for
-    @param is_add - Adding or deleting
-*/
-autoreply define ip6nd_proxy_add_del
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  bool is_del;
-  vl_api_ip6_address_t ip;
-};
-
-/** \brief IPv6 ND proxy details returned after request
-    @param context - sender context, to match reply w/ request
-    @param retval - return code for the request
-*/
-define ip6nd_proxy_details
-{
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_ip6_address_t ip;
-};
-
-/** \brief IPv6 ND proxy dump request
-    @param context - sender context, to match reply w/ request
-    @param retval - return code for the request
-    @param sw_if_index - The interface the host is on
-    @param address - The address of the host for which to proxy for
-*/
-define ip6nd_proxy_dump
-{
-  u32 client_index;
-  u32 context;
-};
-
-/** \brief Start / stop sending router solicitation
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param irt - initial retransmission time
-    @param mrt - maximum retransmission time
-    @param mrc - maximum retransmission count
-    @param mrd - maximum retransmission duration
-    @param sw_if_index - software interface index of interface
-                         for sending router solicitation
-    @param stop - if non-zero then stop sending router solicitation,
-                  otherwise start sending router solicitation
-*/
-autoreply define ip6nd_send_router_solicitation
-{
-  u32 client_index;
-  u32 context;
-  u32 irt;
-  u32 mrt;
-  u32 mrc;
-  u32 mrd;
-  u32 sw_if_index;
-  bool stop;
-};
-
 /** \brief IPv6 interface enable / disable request
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
@@ -445,20 +231,6 @@
   bool enable;			/* set to true if enable */
 };
 
-/** \brief IPv6 set link local address on interface request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - interface to set link local on
-    @param address[] - the new link local address
-*/
-autoreply define sw_interface_ip6_set_link_local_address
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_ip6_address_t address;
-};
-
 /** \brief Dump IP multicast fib table
     @param client_index - opaque cookie to identify the sender
 */
@@ -752,277 +524,18 @@
   vl_api_interface_index_t sw_if_index;
 };
 
-/** \brief Enable/disable periodic IP neighbor scan
+/** \brief IPv6 set link local address on interface request
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param mode - 0: disable, 1: IPv4, 2: IPv6, 3: both IPv4/v6
-    @param scan_interval - neighbor scan interval in minutes, 0: default to 1
-    @param max_proc_time - max processing time per run in usec, 0: default to 20
-    @param max_update - max neighbor probe/delete per run, 0: default to 10
-    @param scan_int_delay - delay in msec to resume scan if exceed max proc
-                            time or update, 0: default to 1
-    @param stale_threshold - threshold in minutes for neighbor deletion, 
-                             0: default to 4*scan_interval
+    @param sw_if_index - interface to set link local on
+    @param ip - the new link local address
 */
-autoreply define ip_scan_neighbor_enable_disable
-{
-  u32 client_index;
-  u32 context;
-  u8 mode;
-  u8 scan_interval;
-  u8 max_proc_time;
-  u8 max_update;
-  u8 scan_int_delay;
-  u8 stale_threshold;
-};
-
-/** \brief IP probe neighbor address on an interface by sending an
-           ARP request (for IP4) or ICMP6 Neighbor Solicitation (for IP6)
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - interface index
-    @param dst - target IP address to send IP addr resolution request
-*/
-autoreply define ip_probe_neighbor
-{
-  u32 client_index;
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_address_t dst;
-};
-
-/** \brief Register for IP4 ARP resolution event on receing ARP reply or
-           MAC/IP info from ARP requests in L2 BDs
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param enable_disable - 1 => register for events, 0 => cancel registration
-    @param pid - sender's pid
-    @param ip - exact IP4 address of interested arp resolution event, or
-                0 to get MAC/IP info from ARP requests in BDs
-*/
-autoreply define want_ip4_arp_events
-{
-  u32 client_index;
-  u32 context;
-  bool enable_disable;
-  u32 pid;
-  vl_api_ip4_address_t ip;
-};
-
-/** \brief Tell client about an IP4 ARP resolution event or
-           MAC/IP info from ARP requests in L2 BDs
-    @param client_index - opaque cookie to identify the sender
-    @param ip - the exact ip4 address of interest
-    @param pid - client pid registered to receive notification
-    @param sw_if_index - interface which received ARP packet
-    @param mac - the new mac address 
-    @param mac_ip - 0: ARP resolution event, 1: MAC/IP info from L2 BDs
-*/
-define ip4_arp_event
-{
-  u32 client_index;
-  vl_api_ip4_address_t ip;
-  u32 pid;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_mac_address_t mac;
-  u8 mac_ip;
-};
-
-service {
-  rpc want_ip4_arp_events returns want_ip4_arp_events_reply
-    events ip4_arp_event;
-};
-
-/** \brief Register for IP6 ND resolution event on recieving NA reply
-           MAC/IP info from ICMP6 Neighbor Solicitation in L2 BDs
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param enable_disable - 1 => register for events, 0 => cancel registration
-    @param pid - sender's pid
-    @param ip - the exact IP6 address of interested ND resolution event, or
-                0 to get MAC/IP info from ICMP6 NS in L2 BDs.
-*/
-autoreply define want_ip6_nd_events
-{
-  u32 client_index;
-  u32 context;
-  bool enable_disable;
-  u32 pid;
-  vl_api_ip6_address_t ip;
-};
-
-/** \brief Tell client about an IP6 ND resolution or
-           MAC/IP info from ICMP6 Neighbor Solicitation in L2 BDs.
-    @param client_index - opaque cookie to identify the sender
-    @param pid - client pid registered to receive notification
-    @param sw_if_index - interface which received ARP packet
-    @param ip - the exact ip6 address of interest
-    @param new_mac - the new mac address 
-    @param mac_ip - 0: ND resolution event, 1: MAC/IP info from L2 BDs
-*/
-define ip6_nd_event
-{
-  u32 client_index;
-  u32 pid;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_ip6_address_t ip;
-  vl_api_mac_address_t mac;
-  u8 mac_ip;
-};
-
-service {
-  rpc want_ip6_ra_events returns want_ip6_ra_events_reply
-    events ip6_ra_event;
-};
-
-/** \brief Register for ip6 router advertisement events
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param enable_disable - 1 => register for events, 0 => cancel registration
-    @param pid - sender's pid
-*/
-autoreply define want_ip6_ra_events
-{
-  u32 client_index;
-  u32 context;
-  bool enable_disable;
-  u32 pid;
-};
-
-/** \brief Struct representing RA prefix info
-    @param prefix - RA prefix info destination address
-    @param flags - RA prefix info flags
-    @param valid_time - RA prefix info valid time
-    @param preferred_time - RA prefix info preferred time
-*/
-typedef ip6_ra_prefix_info
-{
-  vl_api_prefix_t prefix;
-  u8 flags;
-  u32 valid_time;
-  u32 preferred_time;
-};
-
-/** \brief Tell client about a router advertisement event
-    @param client_index - opaque cookie to identify the sender
-    @param pid - client pid registered to receive notification
-    @param current_hop_limit - RA current hop limit
-    @param flags - RA flags
-    @param router_lifetime_in_sec - RA lifetime in seconds
-    @param router_addr - The router's address
-    @param neighbor_reachable_time_in_msec - RA neighbor reachable time in msec
-    @param time_in_msec_between_retransmitted_neighbor_solicitations -
-               time in msec between retransmitted neighbor solicitations
-    @param n_prefixes -
-    @param prefixes -
-*/
-define ip6_ra_event
-{
-  u32 client_index;
-  u32 pid;
-  vl_api_interface_index_t sw_if_index;
-  vl_api_ip6_address_t router_addr;
-  u8 current_hop_limit;
-  u8 flags;
-  u16 router_lifetime_in_sec;
-  u32 neighbor_reachable_time_in_msec;
-  u32 time_in_msec_between_retransmitted_neighbor_solicitations;
-  u32 n_prefixes;
-  vl_api_ip6_ra_prefix_info_t prefixes[n_prefixes];
-};
-
-service {
-  rpc want_ip6_nd_events returns want_ip6_nd_events_reply
-    events ip6_nd_event;
-};
-
-/** \brief Proxy ARP configuration type
-    @param table_id - VRF / Fib table ID
-    @param low - Low address of the Proxy ARP range
-    @param hi - High address of the Proxy ARP range
-*/
-typedef proxy_arp
-{
-  u32 table_id;
-  vl_api_ip4_address_t low;
-  vl_api_ip4_address_t hi;
-};
-
-/** \brief Proxy ARP add / del request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param is_add - 1 if adding the Proxy ARP range, 0 if deleting
-    @param proxy - Proxy configuration
-*/
-autoreply define proxy_arp_add_del
-{
-  u32 client_index;
-  u32 context;
-  bool is_add;
-  vl_api_proxy_arp_t proxy;
-};
-
-/** \brief Proxy ARP dump request
- */
-define proxy_arp_dump
-{
-  u32 client_index;
-  u32 context;
-};
-
-/** \brief Proxy ARP dump details reply
- * @param proxy - Same data as used to configure
- */
-define proxy_arp_details
-{
-  u32 context;
-  vl_api_proxy_arp_t proxy;
-};
-
-/** \brief Proxy ARP add / del interface request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - Which interface to enable / disable Proxy Arp on
-    @param enable_disable - 1 to enable Proxy ARP on interface, 0 to disable
-*/
-autoreply define proxy_arp_intfc_enable_disable
+autoreply define sw_interface_ip6_set_link_local_address
 {
   u32 client_index;
   u32 context;
   vl_api_interface_index_t sw_if_index;
-  /* 1 = on, 0 = off */
-  bool enable_disable;
-};
-
-/** \brief Proxy ARP interface dump request
- */
-define proxy_arp_intfc_dump
-{
-  u32 client_index;
-  u32 context;
-};
-
-/** \brief Proxy ARP interface dump details reply
- * @param sw_if_index The interface on which ARP proxy is enabled.
- */
-define proxy_arp_intfc_details
-{
-  u32 context;
-  vl_api_interface_index_t sw_if_index;
-};
-
-/** \brief Set max allowed ARP or ip6 neighbor entries request
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param is_ipv6 - neighbor limit if non-zero, else ARP limit
-    @param arp_neighbor_limit - the new limit, defaults are ~ 50k
-*/
-autoreply define set_arp_neighbor_limit
-{
-  u32 client_index;
-  u32 context;
-  bool is_ipv6;
-  u32 arp_neighbor_limit;
+  vl_api_ip6_address_t ip;
 };
 
 /** \brief IOAM enable : Enable in-band OAM