-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
* Author: Phil Schwan <phil@clusterfs.com>
*/
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
#define DEBUG_SUBSYSTEM S_LNET
#include <libcfs/libcfs.h>
static int libcfs_nidstring_idx = 0;
#ifdef __KERNEL__
-static cfs_spinlock_t libcfs_nidstring_lock;
+static spinlock_t libcfs_nidstring_lock;
void libcfs_init_nidstrings (void)
{
- cfs_spin_lock_init(&libcfs_nidstring_lock);
+ spin_lock_init(&libcfs_nidstring_lock);
}
-# define NIDSTR_LOCK(f) cfs_spin_lock_irqsave(&libcfs_nidstring_lock, f)
-# define NIDSTR_UNLOCK(f) cfs_spin_unlock_irqrestore(&libcfs_nidstring_lock, f)
+# define NIDSTR_LOCK(f) spin_lock_irqsave(&libcfs_nidstring_lock, f)
+# define NIDSTR_UNLOCK(f) spin_unlock_irqrestore(&libcfs_nidstring_lock, f)
#else
-# define NIDSTR_LOCK(f) (f=0) /* avoid unused var warnings */
-# define NIDSTR_UNLOCK(f) (f=0)
+# define NIDSTR_LOCK(f) (f=sizeof(f)) /* avoid set-but-unused warnings */
+# define NIDSTR_UNLOCK(f) (f=sizeof(f))
#endif
static char *
static void libcfs_decnum_addr2str(__u32 addr, char *str);
static void libcfs_hexnum_addr2str(__u32 addr, char *str);
static int libcfs_num_str2addr(const char *str, int nob, __u32 *addr);
-static int libcfs_ip_parse(char *str, int len, cfs_list_t *list);
static int libcfs_num_parse(char *str, int len, cfs_list_t *list);
-static int libcfs_ip_match(__u32 addr, cfs_list_t *list);
static int libcfs_num_match(__u32 addr, cfs_list_t *list);
struct netstrfns {
};
static struct netstrfns libcfs_netstrfns[] = {
- {/* .nf_type */ LOLND,
- /* .nf_name */ "lo",
- /* .nf_modname */ "klolnd",
- /* .nf_addr2str */ libcfs_decnum_addr2str,
- /* .nf_str2addr */ libcfs_lo_str2addr,
- /* .nf_parse_addr*/ libcfs_num_parse,
- /* .nf_match_addr*/ libcfs_num_match},
- {/* .nf_type */ SOCKLND,
- /* .nf_name */ "tcp",
- /* .nf_modname */ "ksocklnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ O2IBLND,
- /* .nf_name */ "o2ib",
- /* .nf_modname */ "ko2iblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ CIBLND,
- /* .nf_name */ "cib",
- /* .nf_modname */ "kciblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ OPENIBLND,
- /* .nf_name */ "openib",
- /* .nf_modname */ "kopeniblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ IIBLND,
- /* .nf_name */ "iib",
- /* .nf_modname */ "kiiblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ VIBLND,
- /* .nf_name */ "vib",
- /* .nf_modname */ "kviblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
- {/* .nf_type */ RALND,
- /* .nf_name */ "ra",
- /* .nf_modname */ "kralnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
+ {/* .nf_type */ LOLND,
+ /* .nf_name */ "lo",
+ /* .nf_modname */ "klolnd",
+ /* .nf_addr2str */ libcfs_decnum_addr2str,
+ /* .nf_str2addr */ libcfs_lo_str2addr,
+ /* .nf_parse_addr*/ libcfs_num_parse,
+ /* .nf_match_addr*/ libcfs_num_match},
+ {/* .nf_type */ SOCKLND,
+ /* .nf_name */ "tcp",
+ /* .nf_modname */ "ksocklnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ O2IBLND,
+ /* .nf_name */ "o2ib",
+ /* .nf_modname */ "ko2iblnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ CIBLND,
+ /* .nf_name */ "cib",
+ /* .nf_modname */ "kciblnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ OPENIBLND,
+ /* .nf_name */ "openib",
+ /* .nf_modname */ "kopeniblnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ IIBLND,
+ /* .nf_name */ "iib",
+ /* .nf_modname */ "kiiblnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ VIBLND,
+ /* .nf_name */ "vib",
+ /* .nf_modname */ "kviblnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
+ {/* .nf_type */ RALND,
+ /* .nf_name */ "ra",
+ /* .nf_modname */ "kralnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ QSWLND,
/* .nf_name */ "elan",
/* .nf_modname */ "kqswlnd",
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
/* .nf_match_addr*/ libcfs_num_match},
- {/* .nf_type */ MXLND,
- /* .nf_name */ "mx",
- /* .nf_modname */ "kmxlnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr,
- /* .nf_parse_addrlist*/ libcfs_ip_parse,
- /* .nf_match_addr*/ libcfs_ip_match},
+ {/* .nf_type */ MXLND,
+ /* .nf_name */ "mx",
+ /* .nf_modname */ "kmxlnd",
+ /* .nf_addr2str */ libcfs_ip_addr2str,
+ /* .nf_str2addr */ libcfs_ip_str2addr,
+ /* .nf_parse_addrlist*/ cfs_ip_addr_parse,
+ /* .nf_match_addr*/ cfs_ip_addr_match},
{/* .nf_type */ PTLLND,
/* .nf_name */ "ptl",
/* .nf_modname */ "kptllnd",
/* .nf_str2addr */ libcfs_num_str2addr,
/* .nf_parse_addrlist*/ libcfs_num_parse,
/* .nf_match_addr*/ libcfs_num_match},
+ {/* .nf_type */ GNILND,
+ /* .nf_name */ "gni",
+ /* .nf_modname */ "kgnilnd",
+ /* .nf_addr2str */ libcfs_decnum_addr2str,
+ /* .nf_str2addr */ libcfs_num_str2addr,
+ /* .nf_parse_addrlist*/ libcfs_num_parse,
+ /* .nf_match_addr*/ libcfs_num_match},
/* placeholder for net0 alias. It MUST BE THE LAST ENTRY */
{/* .nf_type */ -1},
};
int nob;
if (nid == LNET_NID_ANY)
- return "LNET_NID_ANY";
+ return "<?>";
nf = libcfs_lnd2netstrfns(lnd);
str = libcfs_next_nidstring();
* <nidrange> :== <addrrange> '@' <net>
* <addrrange> :== '*' |
* <ipaddr_range> |
- * <numaddr_range>
- * <ipaddr_range> :== <numaddr_range>.<numaddr_range>.<numaddr_range>.
- * <numaddr_range>
- * <numaddr_range> :== <number> |
+ * <cfs_expr_list>
+ * <ipaddr_range> :== <cfs_expr_list>.<cfs_expr_list>.<cfs_expr_list>.
+ * <cfs_expr_list>
+ * <cfs_expr_list> :== <number> |
* <expr_list>
* <expr_list> :== '[' <range_expr> [ ',' <range_expr>] ']'
* <range_expr> :== <number> |
* <number> '-' <number> '/' <number>
* <net> :== <netname> | <netname><number>
* <netname> :== "lo" | "tcp" | "o2ib" | "cib" | "openib" | "iib" |
- * "vib" | "ra" | "elan" | "gm" | "mx" | "ptl"
+ * "vib" | "ra" | "elan" | "mx" | "ptl"
* \endverbatim
*/
/**
- * Structure to represent NULL-less strings.
- */
-struct lstr {
- char *ls_str;
- int ls_len;
-};
-
-/**
* Structure to represent \<nidrange\> token of the syntax.
*
* One of this is created for each \<net\> parsed.
*/
cfs_list_t ar_link;
/**
- * List head for numaddr_range::nar_link.
+ * List head for cfs_expr_list::el_list.
*/
cfs_list_t ar_numaddr_ranges;
};
/**
- * Structure to represent \<numaddr_range\> token of the syntax.
- */
-struct numaddr_range {
- /**
- * Link to addrrange::ar_numaddr_ranges.
- */
- cfs_list_t nar_link;
- /**
- * List head for range_expr::re_link.
- */
- cfs_list_t nar_range_exprs;
-};
-
-/**
- * Structure to represent \<range_expr\> token of the syntax.
- */
-struct range_expr {
- /**
- * Link to numaddr_range::nar_range_exprs.
- */
- cfs_list_t re_link;
- __u32 re_lo;
- __u32 re_hi;
- __u32 re_stride;
-};
-
-int
-cfs_iswhite(char c)
-{
- switch (c) {
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-/*
- * Extracts tokens from strings.
- *
- * Looks for \a delim in string \a next, sets \a res to point to
- * substring before the delimiter, sets \a next right after the found
- * delimiter.
- *
- * \retval 1 if \a res points to a string of non-whitespace characters
- * \retval 0 otherwise
- */
-static int
-gettok(struct lstr *next, char delim, struct lstr *res)
-{
- char *end;
-
- if (next->ls_str == NULL)
- return 0;
-
- /* skip leading white spaces */
- while (next->ls_len) {
- if (!cfs_iswhite(*next->ls_str))
- break;
- next->ls_str ++;
- next->ls_len --;
- }
- if (next->ls_len == 0)
- /* whitespaces only */
- return 0;
-
- if (*next->ls_str == delim)
- /* first non-writespace is the delimiter */
- return 0;
-
- res->ls_str = next->ls_str;
- end = memchr(next->ls_str, delim, next->ls_len);
- if (end == NULL) {
- /* there is no the delimeter in the string */
- end = next->ls_str + next->ls_len;
- next->ls_str = NULL;
- } else {
- next->ls_str = end + 1;
- next->ls_len -= (end - res->ls_str + 1);
- }
-
- /* skip ending whitespaces */
- while (--end != res->ls_str)
- if (!cfs_iswhite(*end))
- break;
-
- res->ls_len = end - res->ls_str + 1;
- return 1;
-}
-
-/**
- * Converts string to integer.
- *
- * Accepts decimal and hexadecimal number recordings.
- *
- * \retval 1 if first \a nob chars of \a str convert to decimal or
- * hexadecimal integer in the range [\a min, \a max]
- * \retval 0 otherwise
- */
-static int
-libcfs_str2num_check(const char *str, int nob, unsigned *num,
- unsigned min, unsigned max)
-{
- int n;
- char nstr[12];
-
- n = nob;
- if (sscanf(str, "%u%n", num, &n) != 1 || n != nob)
- if (sscanf(str, "0x%x%n", num, &n) != 1 || n != nob)
- if (sscanf(str, "0X%x%n", num, &n) != 1 || n != nob)
- return 0;
- sprintf(nstr, "%u", *num);
- if (n != strlen(nstr) || memcmp(nstr, str, n)) {
- sprintf(nstr, "0x%x", *num);
- if (n != strlen(nstr) || memcmp(nstr, str, n)) {
- sprintf(nstr, "0X%x", *num);
- if (n != strlen(nstr) || memcmp(nstr, str, n))
- return 0;
- }
- }
- if (*num < min || *num > max)
- return 0;
- return 1;
-}
-
-/**
- * Parses \<range_expr\> token of the syntax.
- *
- * \retval pointer to allocated range_expr and initialized
- * range_expr::re_lo, range_expr::re_hi and range_expr:re_stride if \a
- `* src parses to
- * \<number\> |
- * \<number\> '-' \<number\> |
- * \<number\> '-' \<number\> '/' \<number\>
- * \retval NULL othersize
- */
-static struct range_expr *
-parse_range_expr(struct lstr *src, unsigned min, unsigned max)
-{
- struct lstr tok;
- struct range_expr *expr;
-
- LIBCFS_ALLOC(expr, sizeof(struct range_expr));
- if (expr == NULL)
- return NULL;
-
- if (libcfs_str2num_check(src->ls_str, src->ls_len, &expr->re_lo,
- min, max)) {
- /* <number> is parsed */
- expr->re_hi = expr->re_lo;
- expr->re_stride = 1;
- return expr;
- }
-
- if (!gettok(src, '-', &tok))
- goto failed;
- if (!libcfs_str2num_check(tok.ls_str, tok.ls_len, &expr->re_lo,
- min, max))
- goto failed;
- /* <number> - */
- if (libcfs_str2num_check(src->ls_str, src->ls_len, &expr->re_hi,
- min, max)) {
- /* <number> - <number> is parsed */
- expr->re_stride = 1;
- return expr;
- }
-
- /* go to check <number> '-' <number> '/' <number> */
- if (gettok(src, '/', &tok)) {
- if (!libcfs_str2num_check(tok.ls_str, tok.ls_len,
- &expr->re_hi, min, max))
- goto failed;
- /* <number> - <number> / ... */
- if (libcfs_str2num_check(src->ls_str, src->ls_len,
- &expr->re_stride, min, max))
- /* <number> - <number> / <number> is parsed */
- return expr;
- }
-
-failed:
- LIBCFS_FREE(expr, sizeof(struct range_expr));
- return NULL;
-}
-
-/**
- * Parses \<expr_list\> token of the syntax.
- *
- * \retval 1 if \a str parses to '[' \<range_expr\> [ ',' \<range_expr\>] ']'
- * \retval 0 otherwise
- */
-static int
-parse_expr_list(struct lstr *str, cfs_list_t *list,
- unsigned min, unsigned max)
-{
- struct lstr res;
- struct range_expr *range;
-
- if (str->ls_str[0] != '[' || str->ls_str[str->ls_len - 1] != ']')
- return 0;
- str->ls_str ++;
- str->ls_len -= 2;
-
- while (str->ls_str) {
- if (gettok(str, ',', &res) == 0)
- return 0;
- range = parse_range_expr(&res, min, max);
- if (range == NULL)
- return 0;
- cfs_list_add_tail(&range->re_link, list);
- }
- return 1;
-}
-
-/**
- * Parses \<numaddr_range\> token of the syntax.
- *
- * \retval 1 if \a str parses to \<number\> | \<expr_list\>
- * \retval 0 otherwise
- */
-static int
-num_parse(char *str, int len,
- cfs_list_t *list, unsigned min, unsigned max)
-{
- __u32 num;
- struct lstr src;
- struct numaddr_range *numaddr;
-
- src.ls_str = str;
- src.ls_len = len;
-
- LIBCFS_ALLOC(numaddr, sizeof(struct numaddr_range));
- if (numaddr == NULL)
- return 0;
- cfs_list_add_tail(&numaddr->nar_link, list);
- CFS_INIT_LIST_HEAD(&numaddr->nar_range_exprs);
-
- if (libcfs_str2num_check(src.ls_str, src.ls_len, &num, min, max)) {
- /* <number> */
- struct range_expr *expr;
-
- LIBCFS_ALLOC(expr, sizeof(struct range_expr));
- if (expr == NULL)
- return 0;
-
- expr->re_lo = expr->re_hi = num;
- expr->re_stride = 1;
- cfs_list_add_tail(&expr->re_link, &numaddr->nar_range_exprs);
- return 1;
- }
-
- return parse_expr_list(&src, &numaddr->nar_range_exprs, min, max);
-}
-
-/**
* Nf_parse_addrlist method for networks using numeric addresses.
*
* Examples of such networks are gm and elan.
*
- * \retval 1 if \a str parsed to numeric address
- * \retval 0 otherwise
+ * \retval 0 if \a str parsed to numeric address
+ * \retval errno otherwise
*/
static int
libcfs_num_parse(char *str, int len, cfs_list_t *list)
{
- return num_parse(str, len, list, 0, MAX_NUMERIC_VALUE);
-}
-
-/**
- * Nf_parse_addrlist method for networks using ip addresses.
- *
- * Examples of such networks are tcp and o2ib.
- *
- * \retval 1 if \a str parsed to ip address
- * \retval 0 otherwise
- */
-static int
-libcfs_ip_parse(char *str, int len,
- cfs_list_t *list)
-{
- struct lstr src, res;
- int i;
+ struct cfs_expr_list *el;
+ int rc;
- src.ls_str = str;
- src.ls_len = len;
- i = 0;
- while (src.ls_str) {
- if (gettok(&src, '.', &res) == 0)
- return 0;
- if (!num_parse(res.ls_str, res.ls_len, list, 0, 255))
- return 0;
- i ++;
- }
+ rc = cfs_expr_list_parse(str, len, 0, MAX_NUMERIC_VALUE, &el);
+ if (rc == 0)
+ cfs_list_add_tail(&el->el_link, list);
- return (i == 4) ? 1 : 0;
+ return rc;
}
/**
* Allocates struct addrrange and links to \a nidrange via
* (nidrange::nr_addrranges)
*
- * \retval 1 if \a src parses to '*' | \<ipaddr_range\> | \<numaddr_range\>
+ * \retval 1 if \a src parses to '*' | \<ipaddr_range\> | \<cfs_expr_list\>
* \retval 0 otherwise
*/
static int
-parse_addrange(const struct lstr *src, struct nidrange *nidrange)
+parse_addrange(const struct cfs_lstr *src, struct nidrange *nidrange)
{
struct addrrange *addrrange;
* \retval NULL if \a src does not match any network
*/
static struct nidrange *
-add_nidrange(const struct lstr *src,
+add_nidrange(const struct cfs_lstr *src,
cfs_list_t *nidlist)
{
struct netstrfns *nf;
/* e.g. "elan25" or "tcp23", refuse to parse if
* network name is not appended with decimal or
* hexadecimal number */
- if (!libcfs_str2num_check(src->ls_str + strlen(nf->nf_name),
- endlen, &netnum,
- 0, MAX_NUMERIC_VALUE))
+ if (!cfs_str2num_check(src->ls_str + strlen(nf->nf_name),
+ endlen, &netnum, 0, MAX_NUMERIC_VALUE))
return NULL;
}
* \retval 0 otherwise
*/
static int
-parse_nidrange(struct lstr *src, cfs_list_t *nidlist)
+parse_nidrange(struct cfs_lstr *src, cfs_list_t *nidlist)
{
- struct lstr addrrange, net, tmp;
+ struct cfs_lstr addrrange;
+ struct cfs_lstr net;
+ struct cfs_lstr tmp;
struct nidrange *nr;
tmp = *src;
- if (gettok(src, '@', &addrrange) == 0)
+ if (cfs_gettok(src, '@', &addrrange) == 0)
goto failed;
- if (gettok(src, '@', &net) == 0 || src->ls_str != NULL)
+ if (cfs_gettok(src, '@', &net) == 0 || src->ls_str != NULL)
goto failed;
nr = add_nidrange(&net, nidlist);
if (nr == NULL)
goto failed;
- if (!parse_addrange(&addrrange, nr))
+ if (parse_addrange(&addrrange, nr) != 0)
goto failed;
return 1;
}
/**
- * Frees range_expr structures of \a list.
- *
- * \retval none
- */
-static void
-free_range_exprs(cfs_list_t *list)
-{
- cfs_list_t *pos, *next;
-
- cfs_list_for_each_safe(pos, next, list) {
- cfs_list_del(pos);
- LIBCFS_FREE(cfs_list_entry(pos, struct range_expr, re_link),
- sizeof(struct range_expr));
- }
-}
-
-/**
- * Frees numaddr_range structures of \a list.
- *
- * For each struct numaddr_range structure found on \a list it frees
- * range_expr list attached to it and frees the numddr_range itself.
- *
- * \retval none
- */
-static void
-free_numaddr_ranges(cfs_list_t *list)
-{
- cfs_list_t *pos, *next;
- struct numaddr_range *numaddr;
-
- cfs_list_for_each_safe(pos, next, list) {
- numaddr = cfs_list_entry(pos, struct numaddr_range, nar_link);
- free_range_exprs(&numaddr->nar_range_exprs);
- cfs_list_del(pos);
- LIBCFS_FREE(numaddr, sizeof(struct numaddr_range));
- }
-}
-
-/**
* Frees addrrange structures of \a list.
*
* For each struct addrrange structure found on \a list it frees
- * numaddr_range list attached to it and frees the addrrange itself.
+ * cfs_expr_list list attached to it and frees the addrrange itself.
*
* \retval none
*/
static void
free_addrranges(cfs_list_t *list)
{
- cfs_list_t *pos, *next;
- struct addrrange *ar;
+ while (!cfs_list_empty(list)) {
+ struct addrrange *ar;
- cfs_list_for_each_safe(pos, next, list) {
- ar = cfs_list_entry(pos, struct addrrange, ar_link);
- free_numaddr_ranges(&ar->ar_numaddr_ranges);
- cfs_list_del(pos);
- LIBCFS_FREE(ar, sizeof(struct addrrange));
- }
+ ar = cfs_list_entry(list->next, struct addrrange, ar_link);
+
+ cfs_expr_list_free_list(&ar->ar_numaddr_ranges);
+ cfs_list_del(&ar->ar_link);
+ LIBCFS_FREE(ar, sizeof(struct addrrange));
+ }
}
/**
int
cfs_parse_nidlist(char *str, int len, cfs_list_t *nidlist)
{
- struct lstr src, res;
+ struct cfs_lstr src;
+ struct cfs_lstr res;
int rc;
ENTRY;
src.ls_len = len;
CFS_INIT_LIST_HEAD(nidlist);
while (src.ls_str) {
- rc = gettok(&src, ' ', &res);
+ rc = cfs_gettok(&src, ' ', &res);
if (rc == 0) {
cfs_free_nidlist(nidlist);
RETURN(0);
RETURN(1);
}
-/**
- * Matches address (\a addr) against address set encoded in \a list.
- *
- * \see libcfs_num_match(), libcfs_ip_match()
- *
- * \retval 1 if \a addr matches
- * \retval 0 otherwise
- */
-static int
-match_numaddr(__u32 addr, cfs_list_t *list, int shift, __u32 mask)
-{
- struct numaddr_range *numaddr;
- struct range_expr *expr;
- int ip, ok;
- ENTRY;
-
- cfs_list_for_each_entry(numaddr, list, nar_link) {
- ip = (addr >> shift) & mask;
- shift -= 8;
- ok = 0;
- cfs_list_for_each_entry(expr, &numaddr->nar_range_exprs,
- re_link) {
- if (ip >= expr->re_lo &&
- ip <= expr->re_hi &&
- ((ip - expr->re_lo) % expr->re_stride) == 0) {
- ok = 1;
- break;
- }
- }
- if (!ok)
- RETURN(0);
- }
- RETURN(1);
-}
-
/*
* Nf_match_addr method for networks using numeric addresses
*
static int
libcfs_num_match(__u32 addr, cfs_list_t *numaddr)
{
- return match_numaddr(addr, numaddr, 0, 0xffffffff);
-}
+ struct cfs_expr_list *el;
-/*
- * Nf_match_addr method for networks using ip addresses
- *
- * \retval 1 on match
- * \retval 0 otherwise
- */
-static int
-libcfs_ip_match(__u32 addr, cfs_list_t *numaddr)
-{
- return match_numaddr(addr, numaddr, 24, 0xff);
+ LASSERT(!cfs_list_empty(numaddr));
+ el = cfs_list_entry(numaddr->next, struct cfs_expr_list, el_link);
+
+ return cfs_expr_list_match(addr, el);
}
/**
EXPORT_SYMBOL(libcfs_str2nid);
EXPORT_SYMBOL(libcfs_id2str);
EXPORT_SYMBOL(libcfs_str2anynid);
-EXPORT_SYMBOL(cfs_iswhite);
EXPORT_SYMBOL(cfs_free_nidlist);
EXPORT_SYMBOL(cfs_parse_nidlist);
EXPORT_SYMBOL(cfs_match_nid);