- if (!strcmp(str, "*")) /* match all */
- return lnet_new_range_expr(exprs, 0, 255, 1);
-
- n = nob;
- if (sscanf(str, "%u%n", &x, &n) >= 1 && n == nob) {
- /* simple number */
- return lnet_new_range_expr(exprs, x, x, 1);
- }
-
- /* Has to be an expansion */
- if (!(str[0] == '[' && nob > 2 && str[nob-1] == ']'))
- return -EINVAL;
-
- nob -= 2;
- str++;
- str[nob] = 0;
-
- do {
- /* Comma separated list of expressions... */
- sep = strchr(str, ',');
- if (sep != NULL)
- *sep++ = 0;
-
- nob = strlen(str);
- n = nob;
- if (sscanf(str, "%u%n", &x, &n) >= 1 && n == nob) {
- /* simple number */
- rc = lnet_new_range_expr(exprs, x, x, 1);
- if (rc != 0)
- return rc;
-
- continue;
- }
-
- n = nob;
- if (sscanf(str, "%u-%u%n", &x, &y, &n) >= 2 && n == nob) {
- /* simple range */
- rc = lnet_new_range_expr(exprs, x, y, 1);
- if (rc != 0)
- return rc;
- continue;
- }
-
- n = nob;
- if (sscanf(str, "%u-%u/%u%n", &x, &y, &z, &n) >= 3 && n == nob) {
- /* strided range */
- rc = lnet_new_range_expr(exprs, x, y, z);
- if (rc != 0)
- return rc;
- continue;
- }
-
- return -EINVAL;
-
- } while ((str = sep) != NULL);
-
- return 0;
-}
-
-int
-lnet_match_network_token(char *token, __u32 *ipaddrs, int nip)
-{
- struct list_head exprs[4];
- struct list_head *e;
- lnet_range_expr_t *re;
- char *str;
- int i;
- int j;
- __u32 ip;
- int n;
- int match;
- int rc;
-
- for (i = 0; i < 4; i++)
- CFS_INIT_LIST_HEAD(&exprs[i]);
-
- for (i = 0; i < 4; i++) {
- str = token;
- if (i != 3) {
- token = strchr(token, '.');
- if (token == NULL) {
- rc = -EINVAL;
- goto out;
- }
- *token++ = 0;
- }
-
- rc = lnet_parse_range_expr(&exprs[i], str);
- if (rc != 0) {
- LASSERT (rc < 0);
- goto out;
- }
- }
-
- for (match = i = 0; !match && i < nip; i++) {
- ip = ipaddrs[i];
-
- for (match = 1, j = 0; match && j < 4; j++) {
- n = (ip >> (8 * (3 - j))) & 0xff;
- match = 0;
-
- list_for_each(e, &exprs[j]) {
- re = list_entry(e, lnet_range_expr_t, lre_list);
-
- if (re->lre_min <= n &&
- re->lre_max >= n &&
- (n - re->lre_min) % re->lre_stride == 0) {
- match = 1;
- break;
- }
- }
- }
- }
-
- rc = match ? 1 : 0;
-
- out:
- for (i = 0; i < 4; i++)
- lnet_destroy_range_exprs(&exprs[i]);
- LASSERT (lnet_re_alloc == 0);
-