arping: api to return responder mac address

The new arping_acd call includes the responders mac address in the reply.
Enabling a client doing address conflict detection to identify if it
is itself that is replying or that it is another host uses the IP
address.

Type: feature
Change-Id: Ia4bab2af1086f06ed71ba42e2e07368d4e330a27
Signed-off-by: Ole Troan <otroan@employees.org>
This commit is contained in:
Ole Troan
2023-08-31 09:48:45 +02:00
committed by Andrew Yourtchenko
parent 34850e0187
commit 8af78b8e36
3 changed files with 68 additions and 0 deletions
+23
View File
@@ -18,6 +18,7 @@
option version = "1.0.0";
import "vnet/interface_types.api";
import "vnet/ip/ip_types.api";
import "vnet/ethernet/ethernet_types.api";
/** \brief
@param client_index - opaque cookie to identify the sender
@@ -54,6 +55,28 @@ define arping_reply
u32 reply_count;
};
/*
* Address Conflict Detection
*/
define arping_acd
{
u32 client_index;
u32 context;
vl_api_address_t address;
vl_api_interface_index_t sw_if_index;
bool is_garp;
u32 repeat [default=1];
f64 interval [default=1.0];
};
define arping_acd_reply
{
u32 context;
i32 retval;
u32 reply_count;
vl_api_mac_address_t mac_address;
};
/*
* Local Variables:
* eval: (c-set-style "gnu")
+32
View File
@@ -26,6 +26,7 @@
#include <vlibapi/api.h>
#include <vlibmemory/api.h>
#include <vnet/ethernet/ethernet_types_api.h>
/* define message IDs */
#include <arping/arping.api_enum.h>
@@ -62,6 +63,36 @@ vl_api_arping_t_handler (vl_api_arping_t *mp)
({ rmp->reply_count = ntohl (args.reply_count); }));
}
static void
vl_api_arping_acd_t_handler (vl_api_arping_acd_t *mp)
{
vlib_main_t *vm = vlib_get_main ();
arping_main_t *am = &arping_main;
vl_api_arping_acd_reply_t *rmp;
arping_args_t args = { 0 };
int rv;
if (mp->sw_if_index != ~0)
VALIDATE_SW_IF_INDEX (mp);
ip_address_decode2 (&mp->address, &args.address);
args.interval = clib_net_to_host_f64 (mp->interval);
args.repeat = ntohl (mp->repeat);
args.is_garp = mp->is_garp;
args.sw_if_index = ntohl (mp->sw_if_index);
args.silence = 1;
arping_run_command (vm, &args);
rv = args.rv;
BAD_SW_IF_INDEX_LABEL;
REPLY_MACRO2 (VL_API_ARPING_ACD_REPLY, ({
rmp->reply_count = ntohl (args.reply_count);
mac_address_encode (&args.recv.from4.mac, rmp->mac_address);
}));
}
/* set tup the API message handling tables */
#include <arping/arping.api.c>
clib_error_t *
@@ -75,6 +106,7 @@ arping_plugin_api_hookup (vlib_main_t *vm)
/* Mark API as mp safe */
vl_api_set_msg_thread_safe (vam, am->msg_id_base + VL_API_ARPING, 1);
vl_api_set_msg_thread_safe (vam, am->msg_id_base + VL_API_ARPING_ACD, 1);
return 0;
}
+13
View File
@@ -154,6 +154,19 @@ vl_api_arping_reply_t_handler (vl_api_arping_reply_t *mp)
vam->result_ready = 1;
}
static int
api_arping_acd (vat_main_t *vam)
{
// NOT YET IMPLEMENTED
return -99;
}
static void
vl_api_arping_acd_reply_t_handler (vl_api_arping_reply_t *mp)
{
// NOT YET IMPLEMENTED
}
#include <arping/arping.api_test.c>
/*