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:
committed by
Andrew Yourtchenko
parent
34850e0187
commit
8af78b8e36
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user