From d87f8c429e6852d11f7a3bddf6981e2f754c1ea8 Mon Sep 17 00:00:00 2001 From: George Joseph <george.joseph@fairview5.com> Date: Thu, 19 Jun 2014 20:13:20 +0000 Subject: [PATCH] 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 --- include/asterisk/acl.h | 7 ++++++ include/asterisk/netsock2.h | 10 ++++++++ main/acl.c | 13 ++++++++++ main/netsock2.c | 34 ++++++++++++++++++++++++++ res/res_pjsip_endpoint_identifier_ip.c | 2 +- 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/include/asterisk/acl.h b/include/asterisk/acl.h index d1773b6b16..bda1c7606d 100644 --- a/include/asterisk/acl.h +++ b/include/asterisk/acl.h @@ -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 * diff --git a/include/asterisk/netsock2.h b/include/asterisk/netsock2.h index 2db8b80812..3ede990877 100644 --- a/include/asterisk/netsock2.h +++ b/include/asterisk/netsock2.h @@ -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 * diff --git a/main/acl.c b/main/acl.c index 213d6d8aa7..5c3b633d70 100644 --- a/main/acl.c +++ b/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; diff --git a/main/netsock2.c b/main/netsock2.c index bd682b17d8..0e83f27cf8 100644 --- a/main/netsock2.c +++ b/main/netsock2.c @@ -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; diff --git a/res/res_pjsip_endpoint_identifier_ip.c b/res/res_pjsip_endpoint_identifier_ip.c index b4b7e9a9c2..f52b4447d5 100644 --- a/res/res_pjsip_endpoint_identifier_ip.c +++ b/res/res_pjsip_endpoint_identifier_ip.c @@ -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; -- GitLab