]> git.proxmox.com Git - mirror_frr.git/commitdiff
[lib] Centralise Zserv route type information, auto-generate redist strings
authorPaul Jakma <paul.jakma@sun.com>
Tue, 27 Jun 2006 07:52:03 +0000 (07:52 +0000)
committerPaul Jakma <paul.jakma@sun.com>
Tue, 27 Jun 2006 07:52:03 +0000 (07:52 +0000)
2006-05-23 Paul Jakma <paul.jakma@sun.com>

* route_types.txt: New file, table of ZEBRA_ROUTE definitions.
* route_types.awk: New script, to parse previous and generate
  (for now) redistribute string defines.
* Makefile.am: build route_types.h using previous two, ala
  memtypes.h, include the script and table file in EXTRA_DIST.
* command.h: pull in route_types.h, add a REDIST_STR define.

lib/ChangeLog
lib/Makefile.am
lib/command.h
lib/route_types.awk [new file with mode: 0644]
lib/route_types.txt [new file with mode: 0644]

index d031d8f58f522409e4f62bdb038ce5e4513dd0c6..37c1324bdff297373678efb0b144ff16f59d217f 100644 (file)
        * if.h: (struct connected) Document the meaning of the
          ZEBRA_IFC_REAL and ZEBRA_IFC_CONFIGURED flags.
 
+2006-05-23 Paul Jakma <paul.jakma@sun.com>
+
+       * route_types.txt: New file, table of ZEBRA_ROUTE definitions.
+       * route_types.awk: New script, to parse previous and generate
+         (for now) redistribute string defines.
+       * Makefile.am: build route_types.h using previous two, ala
+         memtypes.h, include the script and table file in EXTRA_DIST.
+       * command.h: pull in route_types.h, add a REDIST_STR define.
+
 2006-05-15 Paul Jakma <paul.jakma@sun.com>
 
        * log.c: (general) Generalise struct zebra_route_desc into
index ec7ca00fadd336def8b269d3d32afd9904d68875..315e919beec226763fdf550ec867123cab60e607 100644 (file)
@@ -14,7 +14,7 @@ libzebra_la_SOURCES = \
        zclient.c sockopt.c smux.c md5.c if_rmap.c keychain.c privs.c \
        sigevent.c pqueue.c jhash.c memtypes.c workqueue.c
 
-BUILT_SOURCES = memtypes.h
+BUILT_SOURCES = memtypes.h route_types.h
 
 libzebra_la_DEPENDENCIES = @LIB_REGEX@
 
@@ -27,9 +27,12 @@ pkginclude_HEADERS = \
        str.h stream.h table.h thread.h vector.h version.h vty.h zebra.h \
        plist.h zclient.h sockopt.h smux.h md5.h if_rmap.h keychain.h \
        privs.h sigevent.h pqueue.h jhash.h zassert.h memtypes.h \
-       privs.h sigevent.h pqueue.h jhash.h zassert.h memtypes.h workqueue.h
+       workqueue.h route_types.h
 
-EXTRA_DIST = regex.c regex-gnu.h memtypes.awk
+EXTRA_DIST = regex.c regex-gnu.h memtypes.awk route_types.awk route_types.txt
 
 memtypes.h: $(srcdir)/memtypes.c $(srcdir)/memtypes.awk
-       ($(GAWK) -f $(srcdir)/memtypes.awk $(srcdir)/memtypes.c > memtypes.h)
+       ($(GAWK) -f $(srcdir)/memtypes.awk $(srcdir)/memtypes.c > $@)
+
+route_types.h: $(srcdir)/route_types.txt $(srcdir)/route_types.awk
+       ($(GAWK) -f $(srcdir)/route_types.awk $(srcdir)/route_types.txt > $@)
index 99aec3324802723cab8a9bf06949eefb5c2ee2cd..ce18731e6763ccf5e1f7787ab948e56feaa8cc9c 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vector.h"
 #include "vty.h"
+#include "lib/route_types.h"
 
 /* Host configuration variable */
 struct host
@@ -271,6 +272,7 @@ struct desc
 #define IP_STR "IP information\n"
 #define IPV6_STR "IPv6 information\n"
 #define NO_STR "Negate a command or set its defaults\n"
+#define REDIST_STR "Redistribute information from another routing protocol\n"
 #define CLEAR_STR "Reset functions\n"
 #define RIP_STR "RIP information\n"
 #define BGP_STR "BGP information\n"
diff --git a/lib/route_types.awk b/lib/route_types.awk
new file mode 100644 (file)
index 0000000..26d1c0c
--- /dev/null
@@ -0,0 +1,187 @@
+# $Id$
+#
+# Scan a file of route-type definitions (see eg route_types.txt) and
+# generate a corresponding header file with:
+#
+# - enum of Zserv route-types
+# - redistribute strings for the various Quagga daemons
+#
+# See route_types.txt for the format.
+#
+#
+
+BEGIN {
+       FS="[,]";
+       
+       # globals
+       exitret = 0;
+       tcount = 0;
+       
+       # 'bare' redistribute specifier, <1-255>, help string.
+       redist_bare_help = "Numeric Zserv route type";
+       
+       # formats for output
+       redist_def_fmt = "#define QUAGGA_REDIST_STR_%s \\\n";
+       redist_str_fmt = "\"(%s<1-255>)\"\n";
+       redist_help_def_fmt = "#define QUAGGA_REDIST_HELP_STR_%s";
+       redist_help_str_fmt = " \\\n  \"%s\\n\"";
+       
+       # header
+       header = "/* Auto-generated from route_types.txt by " ARGV[0] ". */\n";
+       header = header "/* Do not edit! */\n";
+       header = header "\n#ifndef _QUAGGA_ROUTE_TYPES_H\n";
+       header = header "#define _QUAGGA_ROUTE_TYPES_H\n";
+       footer = "#endif /* _QUAGGA_ROUTE_TYPES_H */\n";
+       printf ("%s\n", header);
+}
+
+# Chomp comment lines
+($0 ~ /^#/) { 
+       next;
+}
+
+# get rid of the commas, leading/trailling whitespace and
+# quotes
+{
+       for (i = 1; i <= NF; i++) {
+               #print "before:" $i;
+               $i = gensub(/^[[:blank:]]*(.*)[,]*.*/, "\\1", "g",$i);
+               $i = gensub(/^["](.*)["]$/, "\\1", "g", $i);
+               #print "after :" $i;
+       }
+}
+
+# 7 field format:
+#  type                 cname      daemon  C    4  6  short help
+(NF >= 7) {
+       #print "7", $1, $0;
+       
+       if ($1 in types) {
+               print "error: attempt to redefine", $1;
+               exitret = 1;
+               exit exitret;
+       }
+       
+       typesbynum[tcount] = $1;
+       types[$1,"num"] = tcount++; 
+       types[$1,"cname"] = $2;
+       types[$1,"daemon"] = $3;
+       types[$1,"C"] = $4;
+       types[$1,"4"] = strtonum($5);
+       types[$1,"6"] = strtonum($6);
+       types[$1,"shelp"] = $7;
+       
+       #print "num   :", types[$1,"num"]
+       #print "cname :", types[$1,"cname"]
+       #print "daemon:", types[$1,"daemon"];
+       #print "char  :", types[$1,"C"];
+};
+
+# 2 field: type "long description"
+(NF == 2) {
+       #print "2", $1, $2;
+       
+       if (!(($1 SUBSEP "num") in types)) {
+               print "error: type", $1, "must be defined before help str";
+               exitret = 2;
+               exit exitret;
+       }
+       
+       types[$1,"lhelp"] = $2;
+}
+
+END {
+       if (exitret)
+               exit exitret;
+       
+       # The enums
+       # not yet...
+       #printf("enum\n{\n");
+       #for (i = 0; i < tcount; i++) {
+       #       type = typesbynum[i];
+       #       if (type != "" && types[type,"num"] == i)
+       #               printf ("  %s,\n", type);
+       #}
+       #printf ("  ZEBRA_ROUTE_MAX,\n};\n\n");
+       
+       # the redistribute defines
+       for (i = 0; i < tcount; i++) {
+               type = typesbynum[i];
+               
+               # must be a type, and must cross-check against recorded type
+               if (type == "" || types[type,"num"] != i)
+                       continue;
+               
+               # ignore route types that can't be redistributed
+               if (!(types[type,"4"] || types[type,"6"]))
+                       continue;
+               
+               # must have a daemon name
+               if (!((type SUBSEP "daemon") in types))
+                       continue;
+               if (!(daemon = types[type,"daemon"]))
+                       continue;
+               
+               # might have done this daemon already?
+               if (daemon in seen_daemons)
+                       continue;
+               
+               cname = types[type,"cname"];
+               all = all "|" cname;
+               rstr = "";
+               hstr = "";
+               
+               # add it to the others
+               for (j = 0; j < tcount; j++) {
+                       # ignore self
+                       if (i == j)
+                               continue;
+                       
+                       type2 = typesbynum[j];
+                       
+                       # type2 must be valid, and self-check.
+                       if (type2 == "" || types[type2,"num"] != j)
+                               continue;
+                       
+                       # ignore different route types for the same daemon
+                       # (eg system/kernel/connected)
+                       if (types[type2,"daemon"] == daemon)
+                               continue;
+                       
+                       if ((types[type2,"4"] && types[type,"4"]) \
+                           || (types[type2,"6"] && types[type,"6"])) {
+
+                               rstr = rstr types[type2,"cname"] "|";
+                               
+                               if ((type2 SUBSEP "lhelp") in types)
+                                 hstr2 = types[type2,"lhelp"];
+                               else if ((type2 SUBSEP "shelp") in types)
+                                 hstr2 = types[type2,"shelp"];
+                               else
+                                 hstr2 = types[type2,"cname"];
+                               
+                               hstr = hstr sprintf(redist_help_str_fmt, hstr2);
+                       }
+               }
+               
+               # dont double-process daemons.
+               seen_daemons[daemon] = 1;
+               
+               printf("/* %s */\n", daemon);
+               printf(redist_def_fmt, toupper(daemon));
+               printf(redist_str_fmt, rstr);
+               printf(redist_help_def_fmt, toupper(daemon));
+               printf("%s", hstr);
+               printf(redist_help_str_fmt, redist_bare_help);
+               print("\n");
+               
+       }
+       
+       #printf("#define QUAGGA_REDIST_STR_ALL %s\n",all);
+                       
+#      for (i = 0; i < lcount; i++) {
+#              if (mlists[i] != "")
+#                      printf (mlistformat "\n", mlists[i]);
+#      }
+       printf (footer);
+}
diff --git a/lib/route_types.txt b/lib/route_types.txt
new file mode 100644 (file)
index 0000000..e99cacd
--- /dev/null
@@ -0,0 +1,74 @@
+# Canonical Zserv route types information registry for Quagga.
+#
+# Used to construct route_types.c and route_types.h
+#
+# comma-seperated fields of either 2 fields (help strings) or 7 fields.
+# White space before and after the comma seperators is stripped.
+# Lines /beginning/ with # are comments.
+#
+####
+# 7 field line has format:
+# ZServ route type, canonical name, daemon, route char, ipv4, ipv6, short desc
+#
+# Zserv route type:    Corresponding with zebra.h. Key field.
+# canonical name:      Typically derived from the route type definition.
+#                      Used in 'redistribute' commands in daemons.
+#                      Key field.
+# daemon:              The daemon which may originates this route type
+#                      for redistribution to other daemons.
+#                      NULL if not applicable.
+#                      M:N definitions of type:daemon are allowed.
+#                      Used to construct vty command strings.
+# route char:          Single character to denote the route, if applicable.
+#                      Used to denote route type where space is tight,
+#                      e.g. 'show ip route' / 'show ipv6 route'.
+#                      'X' is reserved as the 'not needed' placeholder.
+# ipv4:                        IPv4 capable? yes/no, or 1/0.
+# ipv6:                        IPv6 capable? ditto.
+# short desc:          Very brief description. Used in header of
+#                      'show ip route'. May be specified as NULL
+#                      if the canonical name suffices.
+#
+# Key fields obviously must be a unique ASCII alpha-numeric word.
+#   Lower-case is required, brevity is optional but highly desirable.
+#
+####
+# 2 field format:
+#
+# Zserv route type, Long description
+#
+# Long description:     Full description, but should try fit on a line.
+####
+
+##  type                cname      daemon  C    4  6  short help
+ZEBRA_ROUTE_SYSTEM,     system,    NULL,   'X', 0, 0, "Reserved"
+ZEBRA_ROUTE_KERNEL,     kernel,    zebra,  'K', 1, 1, NULL
+ZEBRA_ROUTE_CONNECT,    connected, zebra,  'C', 1, 1, NULL
+ZEBRA_ROUTE_STATIC,     static,    zebra,  'S', 1, 1, NULL
+ZEBRA_ROUTE_RIP,        rip,       ripd,   'R', 1, 0, "RIP"
+ZEBRA_ROUTE_RIPNG,      ripng,     ripngd, 'R', 0, 1, "RIPng"
+ZEBRA_ROUTE_OSPF,       ospf,      ospfd,  'O', 1, 0, "OSPF"
+ZEBRA_ROUTE_OSPF6,      ospf6,     ospf6d, 'O', 0, 1, "OSPF"
+ZEBRA_ROUTE_ISIS,       isis,      isisd,  'I', 1, 1, "IS-IS"
+ZEBRA_ROUTE_BGP,        bgp,       bgpd,   'B', 1, 1, "BGP"
+# HSLS and OLSR both are AFI independent (so: 1, 1), however
+# we want to disable for them for general Quagga distribution.
+# This at least makes it trivial for users of these protocols
+# to 'switch on' redist support (direct numeric entry remaining
+# possible).
+ZEBRA_ROUTE_HSLS,       hsls,      hslsd,  'H', 0, 0, "HSLS"
+ZEBRA_ROUTE_OLSR,       olsr,      oslrd,  'o', 0, 0, "OLSR"
+
+## help strings
+ZEBRA_ROUTE_SYSTEM, "Reserved route type, for internal use only"
+ZEBRA_ROUTE_KERNEL, "Kernel routes (not installed via the zebra RIB)"
+ZEBRA_ROUTE_CONNECT,"Connected routes (directly attached subnet or host)"
+ZEBRA_ROUTE_STATIC, "Statically configured routes"
+ZEBRA_ROUTE_RIP,    "Routing Information Protocol (RIP)"
+ZEBRA_ROUTE_RIPNG,  "Routing Information Protocol next-generation (IPv6) (RIPng)"
+ZEBRA_ROUTE_OSPF,   "Open Shortest Path First (OSPFv2)"
+ZEBRA_ROUTE_OSPF6,  "Open Shortest Path First (IPv6) (OSPFv3)"
+ZEBRA_ROUTE_ISIS,   "Intermediate System to Intermediate System (IS-IS)"
+ZEBRA_ROUTE_BGP,    "Border Gateway Protocol (BGP)"
+ZEBRA_ROUTE_HSLS,   "Hazy-Sighted Link State Protocol (HSLS)"
+ZEBRA_ROUTE_OLSR,   "Optimised Link State Routing (OLSR)"