diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ChangeLog | 9 | ||||
| -rw-r--r-- | lib/Makefile.am | 11 | ||||
| -rw-r--r-- | lib/command.h | 2 | ||||
| -rw-r--r-- | lib/route_types.awk | 187 | ||||
| -rw-r--r-- | lib/route_types.txt | 74 | 
5 files changed, 279 insertions, 4 deletions
| diff --git a/lib/ChangeLog b/lib/ChangeLog index d031d8f5..37c1324b 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -28,6 +28,15 @@  	* 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 diff --git a/lib/Makefile.am b/lib/Makefile.am index ec7ca00f..315e919b 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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 > $@) diff --git a/lib/command.h b/lib/command.h index 99aec332..ce18731e 100644 --- a/lib/command.h +++ b/lib/command.h @@ -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 index 00000000..26d1c0ce --- /dev/null +++ b/lib/route_types.awk @@ -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 index 00000000..e99cacde --- /dev/null +++ b/lib/route_types.txt @@ -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)" | 
