diff options
author | Henning Brauer <henning@cvs.openbsd.org> | 2007-03-05 21:08:23 +0000 |
---|---|---|
committer | Henning Brauer <henning@cvs.openbsd.org> | 2007-03-05 21:08:23 +0000 |
commit | 539c0e840d410edbf39fa9ea6c59811ca1c989b2 (patch) | |
tree | 23a01f7c0dd1ac4c6ddda81820ba67468a9a0d6f /usr.sbin/bgpctl/irr_asset.c | |
parent | b98fe50008bf820e7860d4f809f4dab375de6892 (diff) |
correctly deal with hierarchical as-set names.
everything we run into as members that is hierarchical (contains :) has to
be an as-set. RPSL requires one component to have the AS- prefix; we check
that.
now the huge AS-TELIANET correctly resolves - into 15128 unique ASes, takes
12m47.11s real 0m8.62s user 0m1.07s system
Diffstat (limited to 'usr.sbin/bgpctl/irr_asset.c')
-rw-r--r-- | usr.sbin/bgpctl/irr_asset.c | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/usr.sbin/bgpctl/irr_asset.c b/usr.sbin/bgpctl/irr_asset.c index da1b66f9ab1..383f9bf66c0 100644 --- a/usr.sbin/bgpctl/irr_asset.c +++ b/usr.sbin/bgpctl/irr_asset.c @@ -1,4 +1,4 @@ -/* $OpenBSD: irr_asset.c,v 1.4 2007/03/05 19:30:46 henning Exp $ */ +/* $OpenBSD: irr_asset.c,v 1.5 2007/03/05 21:08:22 henning Exp $ */ /* * Copyright (c) 2007 Henning Brauer <henning@openbsd.org> @@ -34,9 +34,16 @@ RB_HEAD(as_set_h, as_set) as_set_h; RB_PROTOTYPE(as_set_h, as_set, entry, as_set_compare) RB_GENERATE(as_set_h, as_set, entry, as_set_compare) +enum obj_type { + T_UNKNOWN, + T_ASSET, + T_AUTNUM +}; + struct as_set *curass; struct as_set *asset_get(char *); +enum obj_type asset_membertype(char *); void asset_resolve(struct as_set *); int asset_merge(struct as_set *, struct as_set *); int asset_add_as(struct as_set *, char *); @@ -82,24 +89,26 @@ asset_get(char *name) err(1, "expand_as_set strdup"); RB_INSERT(as_set_h, &as_set_h, ass); - if (!strncmp(name, "AS", 2) && - strlen(name) > 2 && isdigit(name[2])) { - /* - * this must be an aut-num - * make a dummy as-set with the the AS both as name - * and its only member - */ - asset_add_as(ass, name); - return (ass); - - } else if (!strncmp(name, "AS-", 3)) { + switch (asset_membertype(name)) { + case T_ASSET: /* as-set */ curass = ass; if (whois(name, QTYPE_ASSET) == -1) errx(1, "whois error, asset_get %s", name); curass = NULL; - } else + break; + case T_AUTNUM: + /* + * make a dummy as-set with the the AS both as name + * and its only member + */ + asset_add_as(ass, name); + return (ass); + default: fprintf(stderr, "asset_get: %s: unknown object type\n", name); + break; + } + for (i = 0; i < ass->n_members; i++) { mas = asset_get(ass->members[i]); @@ -113,6 +122,30 @@ asset_get(char *name) return (ass); } +enum obj_type +asset_membertype(char *name) +{ + char *s; + + if (!strncmp(name, "AS-", 3)) + return (T_ASSET); + + if ((s = strchr(name, ':')) != NULL) { + /* this must be an as-set. one component has to start w/ AS- */ + for (s = name; s != NULL; s = strchr(s, ':')) + if (!strncmp(++s, "AS-", 3)) + return (T_ASSET); + return (T_UNKNOWN); + } + + /* neither plain nor hierachical set definition, might be aut-num */ + if (!strncmp(name, "AS", 2) && strlen(name) > 2 && isdigit(name[2])) + return (T_AUTNUM); + + return (T_UNKNOWN); + +} + void asset_resolve(struct as_set *ass) { |