pjsip cli: Change Identify to show CIDR notation instead of netmasks.
authorGeorge Joseph <george.joseph@fairview5.com>
Thu, 19 Jun 2014 20:13:20 +0000 (20:13 +0000)
committerGeorge Joseph <george.joseph@fairview5.com>
Thu, 19 Jun 2014 20:13:20 +0000 (20:13 +0000)
* 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
include/asterisk/netsock2.h
main/acl.c
main/netsock2.c
res/res_pjsip_endpoint_identifier_ip.c

index d1773b6..bda1c76 100644 (file)
@@ -142,6 +142,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
  *
  * \details
index 2db8b80..3ede990 100644 (file)
@@ -263,6 +263,16 @@ static inline char *ast_sockaddr_stringify_addr(const struct ast_sockaddr *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
  *
  * \brief
index 213d6d8..5c3b633 100644 (file)
@@ -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;
index bd682b1..0e83f27 100644 (file)
@@ -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;
index b4b7e9a..f52b444 100644 (file)
@@ -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;