mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	pjsip cli: Change Identify to show CIDR notation instead of netmasks.
* Added ast_sockaddr_cidr_bits() to count the 1 bits in an ast_sockaddr. * Added ast_ha_join_cidr() which uses ast_sockaddr_cidr_bits() for the netmask instead of ast_sockaddr_stringify_addr. * Changed res_pjsip_endpoint_identifier_ip to call ast_ha_join_cidr() instead of ast_ha_join() for the CLI output. This is a CLI change only. AMI was not affected. Tested by: George Joseph Review: https://reviewboard.asterisk.org/r/3652/ ........ Merged revisions 416737 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@416738 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -141,6 +141,13 @@ struct ast_ha *ast_append_ha(const char *sense, const char *stuff, struct ast_ha | ||||
|  */ | ||||
| void ast_ha_join(const struct ast_ha *ha, struct ast_str **buf); | ||||
|  | ||||
| /*! | ||||
|  * \brief Convert HAs to a comma separated string value using CIDR notation | ||||
|  * \param ha the starting ha head | ||||
|  * \param buf string buffer to convert data to | ||||
|  */ | ||||
| void ast_ha_join_cidr(const struct ast_ha *ha, struct ast_str **buf); | ||||
|  | ||||
| /*! | ||||
|  * \brief Add a rule to an ACL struct | ||||
|  * | ||||
|   | ||||
| @@ -262,6 +262,16 @@ static inline char *ast_sockaddr_stringify_addr(const struct ast_sockaddr *addr) | ||||
| 	return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_ADDR); | ||||
| } | ||||
|  | ||||
| /*! | ||||
|  * \since 12.4 | ||||
|  * | ||||
|  * \brief | ||||
|  * Count the 1 bits in a netmask | ||||
|  * | ||||
|  * \return number of 1 bits | ||||
|  */ | ||||
| int ast_sockaddr_cidr_bits(const struct ast_sockaddr *sa); | ||||
|  | ||||
| /*! | ||||
|  * \since 1.8 | ||||
|  * | ||||
|   | ||||
							
								
								
									
										13
									
								
								main/acl.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								main/acl.c
									
									
									
									
									
								
							| @@ -677,6 +677,19 @@ void ast_ha_join(const struct ast_ha *ha, struct ast_str **buf) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void ast_ha_join_cidr(const struct ast_ha *ha, struct ast_str **buf) | ||||
| { | ||||
| 	for (; ha; ha = ha->next) { | ||||
| 		const char *addr = ast_sockaddr_stringify_addr(&ha->addr); | ||||
| 		ast_str_append(buf, 0, "%s%s/%d", | ||||
| 			       ha->sense == AST_SENSE_ALLOW ? "!" : "", | ||||
| 			       addr, ast_sockaddr_cidr_bits(&ha->netmask)); | ||||
| 		if (ha->next) { | ||||
| 			ast_str_append(buf, 0, ","); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| enum ast_acl_sense ast_apply_acl(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr, const char *purpose) | ||||
| { | ||||
| 	struct ast_acl *acl; | ||||
|   | ||||
| @@ -129,6 +129,40 @@ char *ast_sockaddr_stringify_fmt(const struct ast_sockaddr *sa, int format) | ||||
| 	return ast_str_buffer(str); | ||||
| } | ||||
|  | ||||
| int ast_sockaddr_cidr_bits(const struct ast_sockaddr *sa) | ||||
| { | ||||
| 	struct ast_sockaddr sa_ipv4; | ||||
| 	const struct ast_sockaddr *sa_tmp; | ||||
| 	int bits = 0; | ||||
| 	int bytes; | ||||
| 	int i; | ||||
| 	int j; | ||||
| 	char *addr; | ||||
|  | ||||
| 	if (ast_sockaddr_isnull(sa)) { | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) { | ||||
| 		sa_tmp = &sa_ipv4; | ||||
| 	} else { | ||||
| 		sa_tmp = sa; | ||||
| 	} | ||||
|  | ||||
| 	bytes = sa_tmp->len; | ||||
| 	addr = ((struct sockaddr *)&sa_tmp->ss)->sa_data; | ||||
|  | ||||
| 	for (i = 0; i < bytes ; ++i) { | ||||
| 		for (j = 0; j < 8; ++j) { | ||||
| 			if ((addr[i] >> j) & 1) { | ||||
| 				bits++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return bits; | ||||
| } | ||||
|  | ||||
| int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags) | ||||
| { | ||||
| 	char *s = str; | ||||
|   | ||||
| @@ -372,7 +372,7 @@ static int cli_print_body(void *obj, void *arg, int flags) | ||||
|  | ||||
| 	ast_str_append(&context->output_buffer, 0, "%*s:  ", | ||||
| 		CLI_INDENT_TO_SPACES(context->indent_level), "Identify"); | ||||
| 	ast_ha_join(ident->matches, &str); | ||||
| 	ast_ha_join_cidr(ident->matches, &str); | ||||
| 	ast_str_append(&context->output_buffer, 0, "%s\n", ast_str_buffer(str)); | ||||
|  | ||||
| 	return 0; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user