EXPORT_SYMBOL(cfs_range_expr_parse);
/**
- * Print the range expression \a re into specified \a buffer.
- * If \a bracketed is true, expression does not need additional
- * brackets.
- *
- * \retval number of characters written
- */
-static int
-cfs_range_expr_print(char *buffer, int count, struct cfs_range_expr *expr,
- bool bracketed)
-{
- int i;
- char s[] = "[";
- char e[] = "]";
-
- if (bracketed)
- s[0] = e[0] = '\0';
-
- if (expr->re_lo == expr->re_hi)
- i = cfs_snprintf(buffer, count, "%u", expr->re_lo);
- else if (expr->re_stride == 1)
- i = cfs_snprintf(buffer, count, "%s%u-%u%s",
- s, expr->re_lo, expr->re_hi, e);
- else
- i = cfs_snprintf(buffer, count, "%s%u-%u/%u%s",
- s, expr->re_lo, expr->re_hi,
- expr->re_stride, e);
- return i;
-}
-
-/**
- * Print a list of range expressions (\a expr_list) into specified \a buffer.
- * If the list contains several expressions, separate them with comma
- * and surround the list with brackets.
- *
- * \retval number of characters written
- */
-int
-cfs_expr_list_print(char *buffer, int count, struct cfs_expr_list *expr_list)
-{
- struct cfs_range_expr *expr;
- int i = 0, j = 0;
- int numexprs = 0;
-
- if (count <= 0)
- return 0;
-
- list_for_each_entry(expr, &expr_list->el_exprs, re_link)
- numexprs++;
-
- if (numexprs > 1)
- i += cfs_snprintf(buffer + i, count - i, "[");
-
- list_for_each_entry(expr, &expr_list->el_exprs, re_link) {
- if (j++ != 0)
- i += cfs_snprintf(buffer + i, count - i, ",");
- i += cfs_range_expr_print(buffer + i, count - i, expr,
- numexprs > 1);
- }
-
- if (numexprs > 1)
- i += cfs_snprintf(buffer + i, count - i, "]");
-
- return i;
-}
-EXPORT_SYMBOL(cfs_expr_list_print);
-
-/**
* Matches value (\a value) against ranges expression list \a expr_list.
*
* \retval 1 if \a value matches
}
EXPORT_SYMBOL(cfs_expr_list_free);
+void
+cfs_expr_list_print(struct cfs_expr_list *expr_list)
+{
+ struct cfs_range_expr *expr;
+
+ list_for_each_entry(expr, &expr_list->el_exprs, re_link) {
+ CDEBUG(D_WARNING, "%d-%d/%d\n",
+ expr->re_lo, expr->re_hi, expr->re_stride);
+ }
+}
+EXPORT_SYMBOL(cfs_expr_list_print);
+
/**
* Parses \<cfs_expr_list\> token of the syntax.
*
- * \retval 0 if \a str parses to \<number\> | \<expr_list\>
- * \retval -errno otherwise
+ * \retval 1 if \a str parses to \<number\> | \<expr_list\>
+ * \retval 0 otherwise
*/
int
cfs_expr_list_parse(char *str, int len, unsigned min, unsigned max,
static int libcfs_num_str2addr(const char *str, int nob, __u32 *addr);
static int libcfs_num_parse(char *str, int len, struct list_head *list);
static int libcfs_num_match(__u32 addr, struct list_head *list);
-static int libcfs_num_addr_range_print(char *buffer, int count,
- struct list_head *list);
-static int libcfs_ip_addr_range_print(char *buffer, int count,
- struct list_head *list);
struct netstrfns {
int nf_type;
int (*nf_str2addr)(const char *str, int nob, __u32 *addr);
int (*nf_parse_addrlist)(char *str, int len,
struct list_head *list);
- int (*nf_print_addrlist)(char *buffer, int count,
- struct list_head *list);
int (*nf_match_addr)(__u32 addr, struct list_head *list);
};
/* .nf_addr2str */ libcfs_decnum_addr2str,
/* .nf_str2addr */ libcfs_lo_str2addr,
/* .nf_parse_addr*/ libcfs_num_parse,
- /* .nf_print_addrlist*/ libcfs_num_addr_range_print,
/* .nf_match_addr*/ libcfs_num_match},
{/* .nf_type */ SOCKLND,
/* .nf_name */ "tcp",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ O2IBLND,
/* .nf_name */ "o2ib",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ CIBLND,
/* .nf_name */ "cib",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ OPENIBLND,
/* .nf_name */ "openib",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ IIBLND,
/* .nf_name */ "iib",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ VIBLND,
/* .nf_name */ "vib",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ RALND,
/* .nf_name */ "ra",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ QSWLND,
/* .nf_name */ "elan",
/* .nf_addr2str */ libcfs_decnum_addr2str,
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
- /* .nf_print_addrlist*/ libcfs_num_addr_range_print,
/* .nf_match_addr*/ libcfs_num_match},
{/* .nf_type */ GMLND,
/* .nf_name */ "gm",
/* .nf_addr2str */ libcfs_hexnum_addr2str,
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
- /* .nf_print_addrlist*/ libcfs_num_addr_range_print,
/* .nf_match_addr*/ libcfs_num_match},
{/* .nf_type */ MXLND,
/* .nf_name */ "mx",
/* .nf_addr2str */ libcfs_ip_addr2str,
/* .nf_str2addr */ libcfs_ip_str2addr,
/* .nf_parse_addrlist*/ cfs_ip_addr_parse,
- /* .nf_print_addrlist*/ libcfs_ip_addr_range_print,
/* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ PTLLND,
/* .nf_name */ "ptl",
/* .nf_addr2str */ libcfs_decnum_addr2str,
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
- /* .nf_print_addrlist*/ libcfs_num_addr_range_print,
/* .nf_match_addr*/ libcfs_num_match},
{/* .nf_type */ GNILND,
/* .nf_name */ "gni",
/* .nf_addr2str */ libcfs_decnum_addr2str,
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
- /* .nf_print_addrlist*/ libcfs_num_addr_range_print,
/* .nf_match_addr*/ libcfs_num_match},
{/* .nf_type */ GNIIPLND,
/* .nf_name */ "gip",
* Allocates struct addrrange and links to \a nidrange via
* (nidrange::nr_addrranges)
*
- * \retval 0 if \a src parses to '*' | \<ipaddr_range\> | \<cfs_expr_list\>
- * \retval -errno otherwise
+ * \retval 1 if \a src parses to '*' | \<ipaddr_range\> | \<cfs_expr_list\>
+ * \retval 0 otherwise
*/
static int
parse_addrange(const struct cfs_lstr *src, struct nidrange *nidrange)
if (src->ls_len == 1 && src->ls_str[0] == '*') {
nidrange->nr_all = 1;
- return 0;
+ return 1;
}
LIBCFS_ALLOC(addrrange, sizeof(struct addrrange));
if (addrrange == NULL)
- return -ENOMEM;
+ return 0;
list_add_tail(&addrrange->ar_link, &nidrange->nr_addrranges);
INIT_LIST_HEAD(&addrrange->ar_numaddr_ranges);
RETURN(0);
}
-static int
-libcfs_num_addr_range_print(char *buffer, int count, struct list_head *list)
-{
- int i = 0, j = 0;
- struct cfs_expr_list *el;
-
- list_for_each_entry(el, list, el_link) {
- LASSERT(j++ < 1);
- i += cfs_expr_list_print(buffer + i, count - i, el);
- }
- return i;
-}
-
-static int
-libcfs_ip_addr_range_print(char *buffer, int count, struct list_head *list)
-{
- int i = 0, j = 0;
- struct cfs_expr_list *el;
-
- list_for_each_entry(el, list, el_link) {
- LASSERT(j++ < 4);
- if (i != 0)
- i += cfs_snprintf(buffer + i, count - i, ".");
- i += cfs_expr_list_print(buffer + i, count - i, el);
- }
- return i;
-}
-
-
-/**
- * Print the network part of the nidrange \a nr into the specified \a buffer.
- *
- * \retval number of characters written
- */
-static int
-cfs_print_network(char *buffer, int count, struct nidrange *nr)
-{
- struct netstrfns *nf = nr->nr_netstrfns;
-
- if (nr->nr_netnum == 0)
- return cfs_snprintf(buffer, count, "@%s", nf->nf_name);
- else
- return cfs_snprintf(buffer, count, "@%s%u",
- nf->nf_name, nr->nr_netnum);
-}
-
-
-/**
- * Print a list of addrrange (\a addrranges) into the specified \a buffer.
- * At max \a count characters can be printed into \a buffer.
- *
- * \retval number of characters written
- */
-static int
-cfs_print_addrranges(char *buffer, int count, struct list_head *addrranges,
- struct nidrange *nr)
-{
- int i = 0;
- struct addrrange *ar;
- struct netstrfns *nf = nr->nr_netstrfns;
-
- list_for_each_entry(ar, addrranges, ar_link) {
- if (i != 0)
- i += cfs_snprintf(buffer + i, count - i, " ");
- i += nf->nf_print_addrlist(buffer + i, count - i,
- &ar->ar_numaddr_ranges);
- i += cfs_print_network(buffer + i, count - i, nr);
- }
- return i;
-}
-
-
-/**
- * Print a list of nidranges (\a nidlist) into the specified \a buffer.
- * At max \a count characters can be printed into \a buffer.
- * Nidranges are separated by a space character.
- *
- * \retval number of characters written
- */
-int cfs_print_nidlist(char *buffer, int count, struct list_head *nidlist)
-{
- int i = 0;
- struct nidrange *nr;
- ENTRY;
-
- if (count <= 0)
- RETURN(0);
-
- list_for_each_entry(nr, nidlist, nr_link) {
- if (i != 0)
- i += cfs_snprintf(buffer + i, count - i, " ");
-
- if (nr->nr_all != 0) {
- LASSERT(list_empty(&nr->nr_addrranges));
- i += cfs_snprintf(buffer + i, count - i, "*");
- i += cfs_print_network(buffer + i, count - i, nr);
- } else {
- i += cfs_print_addrranges(buffer + i, count - i,
- &nr->nr_addrranges, nr);
- }
- }
- RETURN(i);
-}
-
#ifdef __KERNEL__
EXPORT_SYMBOL(libcfs_isknown_lnd);
EXPORT_SYMBOL(libcfs_str2anynid);
EXPORT_SYMBOL(cfs_free_nidlist);
EXPORT_SYMBOL(cfs_parse_nidlist);
-EXPORT_SYMBOL(cfs_print_nidlist);
EXPORT_SYMBOL(cfs_match_nid);
#endif