[zebra] Routemap support on received routes, with 'set src' command (linux)

2007-05-01 David L Stevens <dlstevens@us.ibm.com>

	* (general) These changes collectively add route-map and
	  prefix-list support to zebra and fix a bug in "show
	  route-map" (with no argument).
	* doc/main.texi: added route-map, prefix-list, ip protocol
	  and set src documentation
	* lib/command.h: added PROTOCOL_NODE type
	* lib/log.c: (proto_name2num) new function, protocol name to
	  number translation.
	* lib/routemap.c: (vty_show_route_map) fixed "show route-map"
	  without route-map name
	* lib/routemap.h: added RMAP_ZEBRA type
	* lib/zebra.h: added proto_name2num() prototype
	* vtysh/extract.pl.in: added VTYSH_ZEBRA flag for route-map and
	  plist
	* vtysh/Makefile.am: added zebra_routemap.c
	* vtysh/vtysh.h: added VTYSH_ZEBRA flag to VTYSH_RMAP
	* zebra/connected.c: (connected_up_ipv4) added src preference argument
	  to rib_add_ipv4()
	* zebra/kernel_socket.c: (rtm_read) ditto
	* zebra/main.c: added prefix list initialization
	* zebra/Makefile.am: added zebra_routemap.c source file
	* zebra/rib.h: added generic address union "g_addr" and use in
	  existing places that had an explicit union.
	  Added "src" to struct nexthop.
	  Added preferred src arg to nexthop_ipv4_add and rib_add_ipv4.
	* zebra/rt_netlink.c: (netlink_routing_table) set preferred source on
	  netlink messages.
	  (netlink_route_change) ditto
	  (netlink_route_multipath) ditto.
	* zebra/rtread_getmsg.c: (handle_route_entry) added (NULL) src to
	  rib_add_ipv4() call.
	* zebra/rtread_proc.c: (proc_route_read) ditto
	* zebra/zebra_rib.c: (nexthop_ipv4_add) add src argument.
	  (nexthop_ipv4_ifindex_add) ditto
	  (rib_add_ipv4) ditto
	  (nexthop_active_check) Add route-map processing.
	* zebra/zebra_routemap.c: new file for zebra route-map commands.
	* zebra/zebra_vty.c: (ip_protocol_cmd) Apply route-map to protocol
	  (vty_show_ip_route_detail) added "src" printing
	  (vty_show_ip_route) ditto
	  (show_ip_protocol_cmd) new command, list routemaps.
	  (config_write_protocol) write out routemap protocl config.
	  (zebra_vty_init) Install the new routemap protocol commands.
	* zebra/zserv.c: (zread_ipv4_add) added (NULL) src arg
	  (zebra_init) init zebra route-maps.
	* zebra/zserv.h: add zebra_route_map_init
diff --git a/lib/ChangeLog b/lib/ChangeLog
index f8fdd11..3787b68 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,16 @@
+2007-05-01 David L Stevens <dlstevens@us.ibm.com>
+
+	* (general) These changes collectively add route-map and
+	  prefix-list support to zebra and fix a bug in "show
+	  route-map" (with no argument).
+	* command.h: added PROTOCOL_NODE type
+	* log.c: (proto_name2num) new function, protocol name to
+	  number translation.
+	* routemap.c: (vty_show_route_map) fixed "show route-map"
+	  without route-map name
+	* routemap.h: added RMAP_ZEBRA type
+	* zebra.h: added proto_name2num() prototype
+
 2007-04-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* log.c: (quagga_timestamp) Optimize the subsecond timestamp generation.
diff --git a/lib/command.h b/lib/command.h
index ce18731..a725378 100644
--- a/lib/command.h
+++ b/lib/command.h
@@ -99,6 +99,7 @@
   SMUX_NODE,			/* SNMP configuration node. */
   DUMP_NODE,			/* Packet dump node. */
   FORWARDING_NODE,		/* IP forwarding node. */
+  PROTOCOL_NODE,                /* protocol filtering node */
   VTY_NODE			/* Vty node. */
 };
 
diff --git a/lib/log.c b/lib/log.c
index 21bf3f2..cbf76af 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -886,3 +886,17 @@
     }
   return command_types[command].string;
 }
+
+#define RTSIZE	(sizeof(route_types)/sizeof(route_types[0]))
+
+int
+proto_name2num(const char *s)
+{
+   unsigned i;
+
+   for (i=0; i<RTSIZE; ++i)
+     if (strcasecmp(s, route_types[i].string) == 0)
+       return route_types[i].type;
+   return -1;
+}
+#undef RTSIZE
diff --git a/lib/routemap.c b/lib/routemap.c
index 55cc33c..58ed09a 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -268,6 +268,11 @@
           return CMD_WARNING;
         }
     }
+  else
+    {
+      for (map = route_map_master.head; map; map = map->next)
+	vty_show_route_map_entry (vty, map);
+    }
   return CMD_SUCCESS;
 }
 
@@ -1135,23 +1140,17 @@
        "Continue on a different entry within the route-map\n"
        "Route-map entry sequence number\n")
 
-DEFUN (rmap_show,
-       rmap_show_cmd,
-       "show route-map",
-       SHOW_STR
-       "route-map information\n")
-{
-    return vty_show_route_map (vty, NULL);
-}
-
 DEFUN (rmap_show_name,
        rmap_show_name_cmd,
-       "show route-map WORD",
+       "show route-map [WORD]",
        SHOW_STR
        "route-map information\n"
        "route-map name\n")
 {
-    return vty_show_route_map (vty, argv[0]);
+    const char *name = NULL;
+    if (argc)
+      name = argv[0];
+    return vty_show_route_map (vty, name);
 }
 
 ALIAS (rmap_onmatch_goto,
@@ -1322,6 +1321,5 @@
   install_element (RMAP_NODE, &no_rmap_description_cmd);
    
   /* Install show command */
-  install_element (ENABLE_NODE, &rmap_show_cmd);
   install_element (ENABLE_NODE, &rmap_show_name_cmd);
 }
diff --git a/lib/routemap.h b/lib/routemap.h
index c9cf441..321e192 100644
--- a/lib/routemap.h
+++ b/lib/routemap.h
@@ -45,7 +45,8 @@
   RMAP_RIPNG,
   RMAP_OSPF,
   RMAP_OSPF6,
-  RMAP_BGP
+  RMAP_BGP,
+  RMAP_ZEBRA
 } route_map_object_t;
 
 typedef enum
diff --git a/lib/zebra.h b/lib/zebra.h
index 2e2f8cd..8553739 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -444,6 +444,9 @@
 extern char zebra_route_char(unsigned int route_type);
 /* Map a zserv command type to the same string, 
  * e.g. ZEBRA_INTERFACE_ADD -> "ZEBRA_INTERFACE_ADD" */
+/* Map a protocol name to its number. e.g. ZEBRA_ROUTE_BGP->9*/
+extern int proto_name2num(const char *s);
+
 extern const char *zserv_command_string (unsigned int command);
 
 /* Zebra's family types. */