mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-31 09:04:27 +00:00 
			
		
		
		
	*: cleanup number-named access-lists and prefix-lists
A long time ago there was a difference between number-named and string-named access/prefix-lists. Currently we always treat the name as a string and there is no need for a separate list for number-named lists. Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
		
							parent
							
								
									8a2ec9102f
								
							
						
					
					
						commit
						3eff8e2f44
					
				| @ -40,9 +40,6 @@ struct as_list_list { | ||||
| 
 | ||||
| /* AS path filter master. */ | ||||
| struct as_list_master { | ||||
| 	/* List of access_list which name is number. */ | ||||
| 	struct as_list_list num; | ||||
| 
 | ||||
| 	/* List of access_list which name is string. */ | ||||
| 	struct as_list_list str; | ||||
| 
 | ||||
| @ -71,8 +68,6 @@ struct as_filter { | ||||
| struct as_list { | ||||
| 	char *name; | ||||
| 
 | ||||
| 	enum access_type type; | ||||
| 
 | ||||
| 	struct as_list *next; | ||||
| 	struct as_list *prev; | ||||
| 
 | ||||
| @ -115,7 +110,6 @@ static struct as_filter *bgp_aslist_seq_check(struct as_list *list, int64_t seq) | ||||
| /* as-path access-list 10 permit AS1. */ | ||||
| 
 | ||||
| static struct as_list_master as_list_master = {{NULL, NULL}, | ||||
| 					       {NULL, NULL}, | ||||
| 					       NULL, | ||||
| 					       NULL}; | ||||
| 
 | ||||
| @ -237,10 +231,6 @@ struct as_list *as_list_lookup(const char *name) | ||||
| 	if (name == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	for (aslist = as_list_master.num.head; aslist; aslist = aslist->next) | ||||
| 		if (strcmp(aslist->name, name) == 0) | ||||
| 			return aslist; | ||||
| 
 | ||||
| 	for (aslist = as_list_master.str.head; aslist; aslist = aslist->next) | ||||
| 		if (strcmp(aslist->name, name) == 0) | ||||
| 			return aslist; | ||||
| @ -263,8 +253,6 @@ static void as_list_free(struct as_list *aslist) | ||||
|    the name. */ | ||||
| static struct as_list *as_list_insert(const char *name) | ||||
| { | ||||
| 	size_t i; | ||||
| 	long number; | ||||
| 	struct as_list *aslist; | ||||
| 	struct as_list *point; | ||||
| 	struct as_list_list *list; | ||||
| @ -274,36 +262,13 @@ static struct as_list *as_list_insert(const char *name) | ||||
| 	aslist->name = XSTRDUP(MTYPE_AS_STR, name); | ||||
| 	assert(aslist->name); | ||||
| 
 | ||||
| 	/* If name is made by all digit character.  We treat it as
 | ||||
| 	   number. */ | ||||
| 	for (number = 0, i = 0; i < strlen(name); i++) { | ||||
| 		if (isdigit((unsigned char)name[i])) | ||||
| 			number = (number * 10) + (name[i] - '0'); | ||||
| 		else | ||||
| 	/* Set access_list to string list. */ | ||||
| 	list = &as_list_master.str; | ||||
| 
 | ||||
| 	/* Set point to insertion point. */ | ||||
| 	for (point = list->head; point; point = point->next) | ||||
| 		if (strcmp(point->name, name) >= 0) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of name is all digit character */ | ||||
| 	if (i == strlen(name)) { | ||||
| 		aslist->type = ACCESS_TYPE_NUMBER; | ||||
| 
 | ||||
| 		/* Set access_list to number list. */ | ||||
| 		list = &as_list_master.num; | ||||
| 
 | ||||
| 		for (point = list->head; point; point = point->next) | ||||
| 			if (atol(point->name) >= number) | ||||
| 				break; | ||||
| 	} else { | ||||
| 		aslist->type = ACCESS_TYPE_STRING; | ||||
| 
 | ||||
| 		/* Set access_list to string list. */ | ||||
| 		list = &as_list_master.str; | ||||
| 
 | ||||
| 		/* Set point to insertion point. */ | ||||
| 		for (point = list->head; point; point = point->next) | ||||
| 			if (strcmp(point->name, name) >= 0) | ||||
| 				break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of this is the first element of master. */ | ||||
| 	if (list->head == NULL) { | ||||
| @ -371,10 +336,7 @@ static void as_list_delete(struct as_list *aslist) | ||||
| 		as_filter_free(filter); | ||||
| 	} | ||||
| 
 | ||||
| 	if (aslist->type == ACCESS_TYPE_NUMBER) | ||||
| 		list = &as_list_master.num; | ||||
| 	else | ||||
| 		list = &as_list_master.str; | ||||
| 	list = &as_list_master.str; | ||||
| 
 | ||||
| 	if (aslist->next) | ||||
| 		aslist->next->prev = aslist->prev; | ||||
| @ -667,17 +629,6 @@ static void as_list_show_all(struct vty *vty) | ||||
| 	struct as_list *aslist; | ||||
| 	struct as_filter *asfilter; | ||||
| 
 | ||||
| 	for (aslist = as_list_master.num.head; aslist; aslist = aslist->next) { | ||||
| 		vty_out(vty, "AS path access list %s\n", aslist->name); | ||||
| 
 | ||||
| 		for (asfilter = aslist->head; asfilter; | ||||
| 		     asfilter = asfilter->next) { | ||||
| 			vty_out(vty, "    %s %s\n", | ||||
| 				filter_type_str(asfilter->type), | ||||
| 				asfilter->reg_str); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for (aslist = as_list_master.str.head; aslist; aslist = aslist->next) { | ||||
| 		vty_out(vty, "AS path access list %s\n", aslist->name); | ||||
| 
 | ||||
| @ -740,18 +691,6 @@ static int config_write_as_list(struct vty *vty) | ||||
| 	struct as_filter *asfilter; | ||||
| 	int write = 0; | ||||
| 
 | ||||
| 	for (aslist = as_list_master.num.head; aslist; aslist = aslist->next) | ||||
| 		for (asfilter = aslist->head; asfilter; | ||||
| 		     asfilter = asfilter->next) { | ||||
| 			vty_out(vty, | ||||
| 				"bgp as-path access-list %s seq %" PRId64 | ||||
| 				" %s %s\n", | ||||
| 				aslist->name, asfilter->seq, | ||||
| 				filter_type_str(asfilter->type), | ||||
| 				asfilter->reg_str); | ||||
| 			write++; | ||||
| 		} | ||||
| 
 | ||||
| 	for (aslist = as_list_master.str.head; aslist; aslist = aslist->next) | ||||
| 		for (asfilter = aslist->head; asfilter; | ||||
| 		     asfilter = asfilter->next) { | ||||
| @ -794,19 +733,11 @@ void bgp_filter_reset(void) | ||||
| 	struct as_list *aslist; | ||||
| 	struct as_list *next; | ||||
| 
 | ||||
| 	for (aslist = as_list_master.num.head; aslist; aslist = next) { | ||||
| 		next = aslist->next; | ||||
| 		as_list_delete(aslist); | ||||
| 	} | ||||
| 
 | ||||
| 	for (aslist = as_list_master.str.head; aslist; aslist = next) { | ||||
| 		next = aslist->next; | ||||
| 		as_list_delete(aslist); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(as_list_master.num.head == NULL); | ||||
| 	assert(as_list_master.num.tail == NULL); | ||||
| 
 | ||||
| 	assert(as_list_master.str.head == NULL); | ||||
| 	assert(as_list_master.str.tail == NULL); | ||||
| } | ||||
|  | ||||
| @ -650,9 +650,8 @@ ldp_zebra_filter_update(struct access_list *access) | ||||
| 
 | ||||
| 	if (access && access->name[0] != '\0') { | ||||
| 		strlcpy(laccess.name, access->name, sizeof(laccess.name)); | ||||
| 		laccess.type = access->type; | ||||
| 		debug_evt("%s ACL update filter name %s type %d", __func__, | ||||
| 		    access->name, access->type); | ||||
| 		debug_evt("%s ACL update filter name %s", __func__, | ||||
| 			  access->name); | ||||
| 
 | ||||
| 		main_imsg_compose_both(IMSG_FILTER_UPDATE, &laccess, | ||||
| 			sizeof(laccess)); | ||||
|  | ||||
| @ -174,7 +174,6 @@ struct ldpd_init { | ||||
| 
 | ||||
| struct ldp_access { | ||||
| 	char			 name[ACL_NAMSIZ]; | ||||
| 	enum access_type	 type; | ||||
| }; | ||||
| 
 | ||||
| union ldpd_addr { | ||||
|  | ||||
							
								
								
									
										117
									
								
								lib/filter.c
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								lib/filter.c
									
									
									
									
									
								
							| @ -37,7 +37,6 @@ DEFINE_MTYPE_STATIC(LIB, ACCESS_FILTER, "Access Filter"); | ||||
| 
 | ||||
| /* Static structure for mac access_list's master. */ | ||||
| static struct access_master access_master_mac = { | ||||
| 	{NULL, NULL}, | ||||
| 	{NULL, NULL}, | ||||
| 	NULL, | ||||
| 	NULL, | ||||
| @ -45,7 +44,6 @@ static struct access_master access_master_mac = { | ||||
| 
 | ||||
| /* Static structure for IPv4 access_list's master. */ | ||||
| static struct access_master access_master_ipv4 = { | ||||
| 	{NULL, NULL}, | ||||
| 	{NULL, NULL}, | ||||
| 	NULL, | ||||
| 	NULL, | ||||
| @ -53,7 +51,6 @@ static struct access_master access_master_ipv4 = { | ||||
| 
 | ||||
| /* Static structure for IPv6 access_list's master. */ | ||||
| static struct access_master access_master_ipv6 = { | ||||
| 	{NULL, NULL}, | ||||
| 	{NULL, NULL}, | ||||
| 	NULL, | ||||
| 	NULL, | ||||
| @ -166,10 +163,7 @@ void access_list_delete(struct access_list *access) | ||||
| 
 | ||||
| 	master = access->master; | ||||
| 
 | ||||
| 	if (access->type == ACCESS_TYPE_NUMBER) | ||||
| 		list = &master->num; | ||||
| 	else | ||||
| 		list = &master->str; | ||||
| 	list = &master->str; | ||||
| 
 | ||||
| 	if (access->next) | ||||
| 		access->next->prev = access->prev; | ||||
| @ -192,8 +186,6 @@ void access_list_delete(struct access_list *access) | ||||
|    is sorted by the name. */ | ||||
| static struct access_list *access_list_insert(afi_t afi, const char *name) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 	long number; | ||||
| 	struct access_list *access; | ||||
| 	struct access_list *point; | ||||
| 	struct access_list_list *alist; | ||||
| @ -208,36 +200,13 @@ static struct access_list *access_list_insert(afi_t afi, const char *name) | ||||
| 	access->name = XSTRDUP(MTYPE_ACCESS_LIST_STR, name); | ||||
| 	access->master = master; | ||||
| 
 | ||||
| 	/* If name is made by all digit character.  We treat it as
 | ||||
| 	   number. */ | ||||
| 	for (number = 0, i = 0; i < strlen(name); i++) { | ||||
| 		if (isdigit((unsigned char)name[i])) | ||||
| 			number = (number * 10) + (name[i] - '0'); | ||||
| 		else | ||||
| 	/* Set access_list to string list. */ | ||||
| 	alist = &master->str; | ||||
| 
 | ||||
| 	/* Set point to insertion point. */ | ||||
| 	for (point = alist->head; point; point = point->next) | ||||
| 		if (strcmp(point->name, name) >= 0) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of name is all digit character */ | ||||
| 	if (i == strlen(name)) { | ||||
| 		access->type = ACCESS_TYPE_NUMBER; | ||||
| 
 | ||||
| 		/* Set access_list to number list. */ | ||||
| 		alist = &master->num; | ||||
| 
 | ||||
| 		for (point = alist->head; point; point = point->next) | ||||
| 			if (atol(point->name) >= number) | ||||
| 				break; | ||||
| 	} else { | ||||
| 		access->type = ACCESS_TYPE_STRING; | ||||
| 
 | ||||
| 		/* Set access_list to string list. */ | ||||
| 		alist = &master->str; | ||||
| 
 | ||||
| 		/* Set point to insertion point. */ | ||||
| 		for (point = alist->head; point; point = point->next) | ||||
| 			if (strcmp(point->name, name) >= 0) | ||||
| 				break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of this is the first element of master. */ | ||||
| 	if (alist->head == NULL) { | ||||
| @ -285,10 +254,6 @@ struct access_list *access_list_lookup(afi_t afi, const char *name) | ||||
| 	if (master == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	for (access = master->num.head; access; access = access->next) | ||||
| 		if (strcmp(access->name, name) == 0) | ||||
| 			return access; | ||||
| 
 | ||||
| 	for (access = master->str.head; access; access = access->next) | ||||
| 		if (strcmp(access->name, name) == 0) | ||||
| 			return access; | ||||
| @ -488,53 +453,6 @@ static int filter_show(struct vty *vty, const char *name, afi_t afi) | ||||
| 	/* Print the name of the protocol */ | ||||
| 	vty_out(vty, "%s:\n", frr_protoname); | ||||
| 
 | ||||
| 	for (access = master->num.head; access; access = access->next) { | ||||
| 		if (name && strcmp(access->name, name) != 0) | ||||
| 			continue; | ||||
| 
 | ||||
| 		write = 1; | ||||
| 
 | ||||
| 		for (mfilter = access->head; mfilter; mfilter = mfilter->next) { | ||||
| 			filter = &mfilter->u.cfilter; | ||||
| 
 | ||||
| 			if (write) { | ||||
| 				vty_out(vty, "%s %s access list %s\n", | ||||
| 					mfilter->cisco ? (filter->extended | ||||
| 								  ? "Extended" | ||||
| 								  : "Standard") | ||||
| 						       : "Zebra", | ||||
| 					(afi == AFI_IP) | ||||
| 						? ("IP") | ||||
| 						: ((afi == AFI_IP6) ? ("IPv6 ") | ||||
| 								    : ("MAC ")), | ||||
| 					access->name); | ||||
| 				write = 0; | ||||
| 			} | ||||
| 
 | ||||
| 			vty_out(vty, "    seq %" PRId64, mfilter->seq); | ||||
| 			vty_out(vty, " %s%s", filter_type_str(mfilter), | ||||
| 				mfilter->type == FILTER_DENY ? "  " : ""); | ||||
| 
 | ||||
| 			if (!mfilter->cisco) | ||||
| 				config_write_access_zebra(vty, mfilter); | ||||
| 			else if (filter->extended) | ||||
| 				config_write_access_cisco(vty, mfilter); | ||||
| 			else { | ||||
| 				if (filter->addr_mask.s_addr == 0xffffffff) | ||||
| 					vty_out(vty, " any\n"); | ||||
| 				else { | ||||
| 					vty_out(vty, " %pI4", &filter->addr); | ||||
| 					if (filter->addr_mask.s_addr | ||||
| 					    != INADDR_ANY) | ||||
| 						vty_out(vty, | ||||
| 							", wildcard bits %pI4", | ||||
| 							&filter->addr_mask); | ||||
| 					vty_out(vty, "\n"); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for (access = master->str.head; access; access = access->next) { | ||||
| 		if (name && strcmp(access->name, name) != 0) | ||||
| 			continue; | ||||
| @ -734,18 +652,11 @@ static void access_list_reset_mac(void) | ||||
| 	if (master == NULL) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (access = master->num.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 	for (access = master->str.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(master->num.head == NULL); | ||||
| 	assert(master->num.tail == NULL); | ||||
| 
 | ||||
| 	assert(master->str.head == NULL); | ||||
| 	assert(master->str.tail == NULL); | ||||
| } | ||||
| @ -792,18 +703,11 @@ static void access_list_reset_ipv4(void) | ||||
| 	if (master == NULL) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (access = master->num.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 	for (access = master->str.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(master->num.head == NULL); | ||||
| 	assert(master->num.tail == NULL); | ||||
| 
 | ||||
| 	assert(master->str.head == NULL); | ||||
| 	assert(master->str.tail == NULL); | ||||
| } | ||||
| @ -833,18 +737,11 @@ static void access_list_reset_ipv6(void) | ||||
| 	if (master == NULL) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (access = master->num.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 	for (access = master->str.head; access; access = next) { | ||||
| 		next = access->next; | ||||
| 		access_list_delete(access); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(master->num.head == NULL); | ||||
| 	assert(master->num.tail == NULL); | ||||
| 
 | ||||
| 	assert(master->str.head == NULL); | ||||
| 	assert(master->str.tail == NULL); | ||||
| } | ||||
|  | ||||
| @ -50,8 +50,6 @@ extern "C" { | ||||
| /* Filter type is made by `permit', `deny' and `dynamic'. */ | ||||
| enum filter_type { FILTER_DENY, FILTER_PERMIT, FILTER_DYNAMIC }; | ||||
| 
 | ||||
| enum access_type { ACCESS_TYPE_STRING, ACCESS_TYPE_NUMBER }; | ||||
| 
 | ||||
| struct filter_cisco { | ||||
| 	/* Cisco access-list */ | ||||
| 	int extended; | ||||
| @ -103,8 +101,6 @@ struct access_list { | ||||
| 
 | ||||
| 	struct access_master *master; | ||||
| 
 | ||||
| 	enum access_type type; | ||||
| 
 | ||||
| 	struct access_list *next; | ||||
| 	struct access_list *prev; | ||||
| 
 | ||||
| @ -120,9 +116,6 @@ struct access_list_list { | ||||
| 
 | ||||
| /* Master structure of access_list. */ | ||||
| struct access_master { | ||||
| 	/* List of access_list which name is number. */ | ||||
| 	struct access_list_list num; | ||||
| 
 | ||||
| 	/* List of access_list which name is string. */ | ||||
| 	struct access_list_list str; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										75
									
								
								lib/plist.c
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								lib/plist.c
									
									
									
									
									
								
							| @ -66,9 +66,6 @@ struct prefix_list_list { | ||||
| 
 | ||||
| /* Master structure of prefix_list. */ | ||||
| struct prefix_master { | ||||
| 	/* List of prefix_list which name is number. */ | ||||
| 	struct prefix_list_list num; | ||||
| 
 | ||||
| 	/* List of prefix_list which name is string. */ | ||||
| 	struct prefix_list_list str; | ||||
| 
 | ||||
| @ -87,22 +84,22 @@ struct prefix_master { | ||||
| 
 | ||||
| /* Static structure of IPv4 prefix_list's master. */ | ||||
| static struct prefix_master prefix_master_ipv4 = { | ||||
| 	{NULL, NULL}, {NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV4, | ||||
| 	{NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV4, | ||||
| }; | ||||
| 
 | ||||
| /* Static structure of IPv6 prefix-list's master. */ | ||||
| static struct prefix_master prefix_master_ipv6 = { | ||||
| 	{NULL, NULL}, {NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV6, | ||||
| 	{NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV6, | ||||
| }; | ||||
| 
 | ||||
| /* Static structure of BGP ORF prefix_list's master. */ | ||||
| static struct prefix_master prefix_master_orf_v4 = { | ||||
| 	{NULL, NULL}, {NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV4, | ||||
| 	{NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV4, | ||||
| }; | ||||
| 
 | ||||
| /* Static structure of BGP ORF prefix_list's master. */ | ||||
| static struct prefix_master prefix_master_orf_v6 = { | ||||
| 	{NULL, NULL}, {NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV6, | ||||
| 	{NULL, NULL}, NULL, NULL, NULL, PLC_MAXLEVELV6, | ||||
| }; | ||||
| 
 | ||||
| static struct prefix_master *prefix_master_get(afi_t afi, int orf) | ||||
| @ -141,10 +138,6 @@ static struct prefix_list *prefix_list_lookup_do(afi_t afi, int orf, | ||||
| 	if (master == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	for (plist = master->num.head; plist; plist = plist->next) | ||||
| 		if (strcmp(plist->name, name) == 0) | ||||
| 			return plist; | ||||
| 
 | ||||
| 	for (plist = master->str.head; plist; plist = plist->next) | ||||
| 		if (strcmp(plist->name, name) == 0) | ||||
| 			return plist; | ||||
| @ -194,8 +187,6 @@ void prefix_list_entry_free(struct prefix_list_entry *pentry) | ||||
| static struct prefix_list *prefix_list_insert(afi_t afi, int orf, | ||||
| 					      const char *name) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 	long number; | ||||
| 	struct prefix_list *plist; | ||||
| 	struct prefix_list *point; | ||||
| 	struct prefix_list_list *list; | ||||
| @ -212,36 +203,13 @@ static struct prefix_list *prefix_list_insert(afi_t afi, int orf, | ||||
| 	plist->trie = | ||||
| 		XCALLOC(MTYPE_PREFIX_LIST_TRIE, sizeof(struct pltrie_table)); | ||||
| 
 | ||||
| 	/* If name is made by all digit character.  We treat it as
 | ||||
| 	   number. */ | ||||
| 	for (number = 0, i = 0; i < strlen(name); i++) { | ||||
| 		if (isdigit((unsigned char)name[i])) | ||||
| 			number = (number * 10) + (name[i] - '0'); | ||||
| 		else | ||||
| 	/* Set prefix_list to string list. */ | ||||
| 	list = &master->str; | ||||
| 
 | ||||
| 	/* Set point to insertion point. */ | ||||
| 	for (point = list->head; point; point = point->next) | ||||
| 		if (strcmp(point->name, name) >= 0) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of name is all digit character */ | ||||
| 	if (i == strlen(name)) { | ||||
| 		plist->type = PREFIX_TYPE_NUMBER; | ||||
| 
 | ||||
| 		/* Set prefix_list to number list. */ | ||||
| 		list = &master->num; | ||||
| 
 | ||||
| 		for (point = list->head; point; point = point->next) | ||||
| 			if (atol(point->name) >= number) | ||||
| 				break; | ||||
| 	} else { | ||||
| 		plist->type = PREFIX_TYPE_STRING; | ||||
| 
 | ||||
| 		/* Set prefix_list to string list. */ | ||||
| 		list = &master->str; | ||||
| 
 | ||||
| 		/* Set point to insertion point. */ | ||||
| 		for (point = list->head; point; point = point->next) | ||||
| 			if (strcmp(point->name, name) >= 0) | ||||
| 				break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* In case of this is the first element of master. */ | ||||
| 	if (list->head == NULL) { | ||||
| @ -310,10 +278,7 @@ void prefix_list_delete(struct prefix_list *plist) | ||||
| 
 | ||||
| 	master = plist->master; | ||||
| 
 | ||||
| 	if (plist->type == PREFIX_TYPE_NUMBER) | ||||
| 		list = &master->num; | ||||
| 	else | ||||
| 		list = &master->str; | ||||
| 	list = &master->str; | ||||
| 
 | ||||
| 	if (plist->next) | ||||
| 		plist->next->prev = plist->prev; | ||||
| @ -1056,10 +1021,6 @@ static int vty_show_prefix_list(struct vty *vty, afi_t afi, const char *name, | ||||
| 					master->recent->name); | ||||
| 		} | ||||
| 
 | ||||
| 		for (plist = master->num.head; plist; plist = plist->next) | ||||
| 			vty_show_prefix_entry(vty, afi, plist, master, dtype, | ||||
| 					      seqnum); | ||||
| 
 | ||||
| 		for (plist = master->str.head; plist; plist = plist->next) | ||||
| 			vty_show_prefix_entry(vty, afi, plist, master, dtype, | ||||
| 					      seqnum); | ||||
| @ -1148,11 +1109,6 @@ static int vty_clear_prefix_list(struct vty *vty, afi_t afi, const char *name, | ||||
| 		return CMD_WARNING; | ||||
| 
 | ||||
| 	if (name == NULL && prefix == NULL) { | ||||
| 		for (plist = master->num.head; plist; plist = plist->next) | ||||
| 			for (pentry = plist->head; pentry; | ||||
| 			     pentry = pentry->next) | ||||
| 				pentry->hitcnt = 0; | ||||
| 
 | ||||
| 		for (plist = master->str.head; plist; plist = plist->next) | ||||
| 			for (pentry = plist->head; pentry; | ||||
| 			     pentry = pentry->next) | ||||
| @ -1509,18 +1465,11 @@ static void prefix_list_reset_afi(afi_t afi, int orf) | ||||
| 	if (master == NULL) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (plist = master->num.head; plist; plist = next) { | ||||
| 		next = plist->next; | ||||
| 		prefix_list_delete(plist); | ||||
| 	} | ||||
| 	for (plist = master->str.head; plist; plist = next) { | ||||
| 		next = plist->next; | ||||
| 		prefix_list_delete(plist); | ||||
| 	} | ||||
| 
 | ||||
| 	assert(master->num.head == NULL); | ||||
| 	assert(master->num.tail == NULL); | ||||
| 
 | ||||
| 	assert(master->str.head == NULL); | ||||
| 	assert(master->str.tail == NULL); | ||||
| 
 | ||||
| @ -1546,8 +1495,6 @@ static void plist_autocomplete_afi(afi_t afi, vector comps, | ||||
| 
 | ||||
| 	for (plist = master->str.head; plist; plist = plist->next) | ||||
| 		vector_set(comps, XSTRDUP(MTYPE_COMPLETION, plist->name)); | ||||
| 	for (plist = master->num.head; plist; plist = plist->next) | ||||
| 		vector_set(comps, XSTRDUP(MTYPE_COMPLETION, plist->name)); | ||||
| } | ||||
| 
 | ||||
| static void plist_autocomplete(vector comps, struct cmd_token *token) | ||||
|  | ||||
| @ -26,8 +26,6 @@ | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| enum prefix_name_type { PREFIX_TYPE_STRING, PREFIX_TYPE_NUMBER }; | ||||
| 
 | ||||
| struct pltrie_table; | ||||
| 
 | ||||
| struct prefix_list { | ||||
| @ -36,8 +34,6 @@ struct prefix_list { | ||||
| 
 | ||||
| 	struct prefix_master *master; | ||||
| 
 | ||||
| 	enum prefix_name_type type; | ||||
| 
 | ||||
| 	int count; | ||||
| 	int rangecount; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Igor Ryzhov
						Igor Ryzhov