forked from Mirror/frr
lib,zebra: add zapi message to control noarp flag
Add a ZAPI message to control the setting of the IFF_NOARP flag. Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
parent
03d6a6d137
commit
2ee43c873e
|
@ -4520,6 +4520,24 @@ static void zclient_event(enum zclient_event event, struct zclient *zclient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum zclient_send_status zclient_interface_set_arp(struct zclient *client,
|
||||||
|
struct interface *ifp,
|
||||||
|
bool arp_enable)
|
||||||
|
{
|
||||||
|
struct stream *s;
|
||||||
|
|
||||||
|
s = client->obuf;
|
||||||
|
stream_reset(s);
|
||||||
|
|
||||||
|
zclient_create_header(s, ZEBRA_INTERFACE_SET_ARP, ifp->vrf->vrf_id);
|
||||||
|
|
||||||
|
stream_putl(s, ifp->ifindex);
|
||||||
|
stream_putc(s, arp_enable);
|
||||||
|
|
||||||
|
stream_putw_at(s, 0, stream_get_endp(s));
|
||||||
|
return zclient_send_message(client);
|
||||||
|
}
|
||||||
|
|
||||||
enum zclient_send_status zclient_interface_set_master(struct zclient *client,
|
enum zclient_send_status zclient_interface_set_master(struct zclient *client,
|
||||||
struct interface *master,
|
struct interface *master,
|
||||||
struct interface *slave)
|
struct interface *slave)
|
||||||
|
|
|
@ -98,6 +98,7 @@ typedef enum {
|
||||||
ZEBRA_INTERFACE_UP,
|
ZEBRA_INTERFACE_UP,
|
||||||
ZEBRA_INTERFACE_DOWN,
|
ZEBRA_INTERFACE_DOWN,
|
||||||
ZEBRA_INTERFACE_SET_MASTER,
|
ZEBRA_INTERFACE_SET_MASTER,
|
||||||
|
ZEBRA_INTERFACE_SET_ARP,
|
||||||
ZEBRA_INTERFACE_SET_PROTODOWN,
|
ZEBRA_INTERFACE_SET_PROTODOWN,
|
||||||
ZEBRA_ROUTE_ADD,
|
ZEBRA_ROUTE_ADD,
|
||||||
ZEBRA_ROUTE_DELETE,
|
ZEBRA_ROUTE_DELETE,
|
||||||
|
@ -1036,6 +1037,9 @@ extern int zclient_read_header(struct stream *s, int sock, uint16_t *size,
|
||||||
*/
|
*/
|
||||||
extern bool zapi_parse_header(struct stream *zmsg, struct zmsghdr *hdr);
|
extern bool zapi_parse_header(struct stream *zmsg, struct zmsghdr *hdr);
|
||||||
|
|
||||||
|
extern enum zclient_send_status zclient_interface_set_arp(struct zclient *client,
|
||||||
|
struct interface *ifp,
|
||||||
|
bool arp_enable);
|
||||||
extern enum zclient_send_status
|
extern enum zclient_send_status
|
||||||
zclient_interface_set_master(struct zclient *client, struct interface *master,
|
zclient_interface_set_master(struct zclient *client, struct interface *master,
|
||||||
struct interface *slave);
|
struct interface *slave);
|
||||||
|
|
|
@ -3662,6 +3662,27 @@ DEFUN (show_interface_desc_vrf_all,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void if_arp(struct interface *ifp, bool enable)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (enable)
|
||||||
|
ret = if_unset_flags(ifp, IFF_NOARP);
|
||||||
|
else
|
||||||
|
ret = if_set_flags(ifp, IFF_NOARP);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
zlog_debug("Can't %sset noarp flag on interface %s",
|
||||||
|
enable ? "" : "un", ifp->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if_refresh(ifp);
|
||||||
|
}
|
||||||
|
|
||||||
int if_multicast_set(struct interface *ifp)
|
int if_multicast_set(struct interface *ifp)
|
||||||
{
|
{
|
||||||
struct zebra_if *if_data;
|
struct zebra_if *if_data;
|
||||||
|
|
|
@ -314,6 +314,7 @@ extern int if_ipv6_address_install(struct interface *ifp, struct prefix *prefix,
|
||||||
extern int if_ip_address_uinstall(struct interface *ifp, struct prefix *prefix);
|
extern int if_ip_address_uinstall(struct interface *ifp, struct prefix *prefix);
|
||||||
extern int if_shutdown(struct interface *ifp);
|
extern int if_shutdown(struct interface *ifp);
|
||||||
extern int if_no_shutdown(struct interface *ifp);
|
extern int if_no_shutdown(struct interface *ifp);
|
||||||
|
extern void if_arp(struct interface *ifp, bool enable);
|
||||||
extern int if_multicast_set(struct interface *ifp);
|
extern int if_multicast_set(struct interface *ifp);
|
||||||
extern int if_multicast_unset(struct interface *ifp);
|
extern int if_multicast_unset(struct interface *ifp);
|
||||||
extern int if_linkdetect(struct interface *ifp, bool detect);
|
extern int if_linkdetect(struct interface *ifp, bool detect);
|
||||||
|
|
|
@ -3124,6 +3124,28 @@ stream_failure:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void zread_interface_set_arp(ZAPI_HANDLER_ARGS)
|
||||||
|
{
|
||||||
|
struct stream *s = msg;
|
||||||
|
struct interface *ifp;
|
||||||
|
bool arp_enable;
|
||||||
|
vrf_id_t vrf_id = zvrf->vrf->vrf_id;
|
||||||
|
int ifindex;
|
||||||
|
|
||||||
|
STREAM_GETL(s, ifindex);
|
||||||
|
STREAM_GETC(s, arp_enable);
|
||||||
|
ifp = if_lookup_by_index(ifindex, vrf_id);
|
||||||
|
|
||||||
|
if (!ifp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if_arp(ifp, arp_enable);
|
||||||
|
|
||||||
|
stream_failure:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void zread_vrf_label(ZAPI_HANDLER_ARGS)
|
static void zread_vrf_label(ZAPI_HANDLER_ARGS)
|
||||||
{
|
{
|
||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
|
@ -3905,6 +3927,7 @@ void (*const zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
|
||||||
[ZEBRA_REMOTE_MACIP_DEL] = zebra_vxlan_remote_macip_del,
|
[ZEBRA_REMOTE_MACIP_DEL] = zebra_vxlan_remote_macip_del,
|
||||||
[ZEBRA_DUPLICATE_ADDR_DETECTION] = zebra_vxlan_dup_addr_detection,
|
[ZEBRA_DUPLICATE_ADDR_DETECTION] = zebra_vxlan_dup_addr_detection,
|
||||||
[ZEBRA_INTERFACE_SET_MASTER] = zread_interface_set_master,
|
[ZEBRA_INTERFACE_SET_MASTER] = zread_interface_set_master,
|
||||||
|
[ZEBRA_INTERFACE_SET_ARP] = zread_interface_set_arp,
|
||||||
[ZEBRA_PW_ADD] = zread_pseudowire,
|
[ZEBRA_PW_ADD] = zread_pseudowire,
|
||||||
[ZEBRA_PW_DELETE] = zread_pseudowire,
|
[ZEBRA_PW_DELETE] = zread_pseudowire,
|
||||||
[ZEBRA_PW_SET] = zread_pseudowire,
|
[ZEBRA_PW_SET] = zread_pseudowire,
|
||||||
|
|
Loading…
Reference in a new issue