mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 10:07:04 +00:00 
			
		
		
		
	Zebra's clear duplicate detect command is rpc converted. There is condition where cli fails with human readable message. Using northboun's errmsg buffer to display error message to user. Testing: bharat# clear evpn dup-addr vni 1002 ip 2011:11::11 Error type: generic error Error description: Requested IP's associated MAC aa:aa:aa:aa:aa:aa is still in duplicate state bharat# clear evpn dup-addr vni 1002 ip 11.11.11.11 Error type: generic error Error description: Requested IP's associated MAC aa:aa:aa:aa:aa:aa is still in duplicate state Signed-off-by: Chirag Shah <chirag@nvidia.com>
		
			
				
	
	
		
			202 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2020 Cumulus Networks, Inc.
 | 
						|
 *                    Chirag Shah
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify it
 | 
						|
 * under the terms of the GNU General Public License as published by the Free
 | 
						|
 * Software Foundation; either version 2 of the License, or (at your option)
 | 
						|
 * any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful, but WITHOUT
 | 
						|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
						|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
						|
 * more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License along
 | 
						|
 * with this program; see the file COPYING; if not, write to the Free Software
 | 
						|
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 | 
						|
 */
 | 
						|
 | 
						|
#include <zebra.h>
 | 
						|
#include "northbound.h"
 | 
						|
#include "libfrr.h"
 | 
						|
 | 
						|
#include "zebra/zebra_nb.h"
 | 
						|
#include "zebra/zebra_router.h"
 | 
						|
#include "zebra/zebra_vrf.h"
 | 
						|
#include "zebra/zebra_vxlan.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:clear-evpn-dup-addr
 | 
						|
 */
 | 
						|
int clear_evpn_dup_addr_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	struct zebra_vrf *zvrf;
 | 
						|
	int ret = NB_OK;
 | 
						|
	struct yang_data *yang_dup_choice = NULL, *yang_dup_vni = NULL,
 | 
						|
			 *yang_dup_ip = NULL, *yang_dup_mac = NULL;
 | 
						|
 | 
						|
	yang_dup_choice = yang_data_list_find(args->input, "%s/%s", args->xpath,
 | 
						|
					      "input/clear-dup-choice");
 | 
						|
 | 
						|
	zvrf = zebra_vrf_get_evpn();
 | 
						|
 | 
						|
	if (yang_dup_choice
 | 
						|
	    && strcmp(yang_dup_choice->value, "all-case") == 0) {
 | 
						|
		zebra_vxlan_clear_dup_detect_vni_all(zvrf);
 | 
						|
	} else {
 | 
						|
		vni_t vni;
 | 
						|
		struct ipaddr host_ip = {.ipa_type = IPADDR_NONE};
 | 
						|
		struct ethaddr mac;
 | 
						|
 | 
						|
		yang_dup_vni = yang_data_list_find(
 | 
						|
			args->input, "%s/%s", args->xpath,
 | 
						|
			"input/clear-dup-choice/single-case/vni-id");
 | 
						|
		if (yang_dup_vni) {
 | 
						|
			vni = yang_str2uint32(yang_dup_vni->value);
 | 
						|
 | 
						|
			yang_dup_mac = yang_data_list_find(
 | 
						|
				args->input, "%s/%s", args->xpath,
 | 
						|
				"input/clear-dup-choice/single-case/vni-id/mac-addr");
 | 
						|
			yang_dup_ip = yang_data_list_find(
 | 
						|
				args->input, "%s/%s", args->xpath,
 | 
						|
				"input/clear-dup-choice/single-case/vni-id/vni-ipaddr");
 | 
						|
 | 
						|
			if (yang_dup_mac) {
 | 
						|
				yang_str2mac(yang_dup_mac->value, &mac);
 | 
						|
				ret = zebra_vxlan_clear_dup_detect_vni_mac(
 | 
						|
					zvrf, vni, &mac, args->errmsg,
 | 
						|
					args->errmsg_len);
 | 
						|
			} else if (yang_dup_ip) {
 | 
						|
				yang_str2ip(yang_dup_ip->value, &host_ip);
 | 
						|
				ret = zebra_vxlan_clear_dup_detect_vni_ip(
 | 
						|
					zvrf, vni, &host_ip, args->errmsg,
 | 
						|
					args->errmsg_len);
 | 
						|
			} else
 | 
						|
				ret = zebra_vxlan_clear_dup_detect_vni(zvrf,
 | 
						|
								       vni);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (ret < 0)
 | 
						|
		return NB_ERR;
 | 
						|
 | 
						|
	return NB_OK;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-route-information
 | 
						|
 */
 | 
						|
int get_route_information_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-v6-mroute-info
 | 
						|
 */
 | 
						|
int get_v6_mroute_info_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-vrf-info
 | 
						|
 */
 | 
						|
int get_vrf_info_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-vrf-vni-info
 | 
						|
 */
 | 
						|
int get_vrf_vni_info_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-evpn-info
 | 
						|
 */
 | 
						|
int get_evpn_info_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-vni-info
 | 
						|
 */
 | 
						|
int get_vni_info_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-evpn-vni-rmac
 | 
						|
 */
 | 
						|
int get_evpn_vni_rmac_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-evpn-vni-nexthops
 | 
						|
 */
 | 
						|
int get_evpn_vni_nexthops_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-evpn-macs
 | 
						|
 */
 | 
						|
int get_evpn_macs_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-evpn-arp-cache
 | 
						|
 */
 | 
						|
int get_evpn_arp_cache_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-pbr-ipset
 | 
						|
 */
 | 
						|
int get_pbr_ipset_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-pbr-iptable
 | 
						|
 */
 | 
						|
int get_pbr_iptable_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * XPath: /frr-zebra:get-debugs
 | 
						|
 */
 | 
						|
int get_debugs_rpc(struct nb_cb_rpc_args *args)
 | 
						|
{
 | 
						|
	/* TODO: implement me. */
 | 
						|
	return NB_ERR_NOT_FOUND;
 | 
						|
}
 |