Mailing List Archive

[PATCH] Router advertisement
OK. I stopped for now and this is result. Many changes:

* Removed "[no] ipv6 nd send-ra" command. It's removed from Cisco as
well and is just alias.
* Replaced "ipv6 nd prefix-advertisement" with "ipv6 nd prefix". It's
shorter and compatible with Cisco.
* Rewrite syntax of "ipv6 nd prefix" command to allow various
combinations of parameters and flags. No defaults in configuration.
That's why I started it. As on-link and autoconfig flags are
defaults, replaced them with off-link and no-autoconfig flags in
command syntax. For compatibility one "ipv6 nd prefix-advertisement"
command is accepted as well (ALIAS) - it still can read
configuration generated by old versions. Can be removed later.
* Remove printing "no ipv6 nd supress-ra" to configuration. I found it
very confusing many times while reading big configuration - you have
to look very carefully where you have "no" and where not. Not
sending router advertisements is still default.
* Cosmetic fixes in all commands.

And document all router advertisement commands.

Btw, there is IPv6 prefix reserved for documentation, it would be good
idea to use it in Quagga docs.

http://www.apnic.net/info/faq/ipv6-documentation-prefix-faq.html

Opinions, please?

--
Hasso Tepper
Elion Enterprises Ltd.
WAN administrator
Re: [PATCH] Router advertisement [ In reply to ]
Hasso Tepper wrote:
> * Remove printing "no ipv6 nd supress-ra" to configuration. I found
> it very confusing many times while reading big configuration - you
> have to look very carefully where you have "no" and where not. Not
> sending router advertisements is still default.

I don't know what I used for thinking (certainly not my head) when I
thought that it will work. Updated patch attached.

> Opinions, please?

Nobody has opinion?


--
Hasso Tepper
Elion Enterprises Ltd.
WAN administrator
Re: [PATCH] Router advertisement [ In reply to ]
I do not see any issue with you patch.

Regards,
Vincent

Hasso Tepper wrote:

>Hasso Tepper wrote:
>
>
>>* Remove printing "no ipv6 nd supress-ra" to configuration. I found
>>it very confusing many times while reading big configuration - you
>>have to look very carefully where you have "no" and where not. Not
>>sending router advertisements is still default.
>>
>>
>
>I don't know what I used for thinking (certainly not my head) when I
>thought that it will work. Updated patch attached.
>
>
>
>>Opinions, please?
>>
>>
>
>Nobody has opinion?
>
>
>
>
>------------------------------------------------------------------------
>
>Index: zebra/rtadv.c
>===================================================================
>RCS file: /var/cvsroot/quagga/zebra/rtadv.c,v
>retrieving revision 1.8
>diff -u -3 -p -r1.8 rtadv.c
>--- zebra/rtadv.c 4 Mar 2004 17:45:02 -0000 1.8
>+++ zebra/rtadv.c 22 Mar 2004 09:33:21 -0000
>@@ -232,7 +232,8 @@ rtadv_send_packet (int sock, struct inte
> {
> u_char buf[INET6_ADDRSTRLEN];
>
>- zlog_info ("DEBUG %s", inet_ntop (AF_INET6, &pinfo->nd_opt_pi_prefix, buf, INET6_ADDRSTRLEN));
>+ zlog_info ("DEBUG %s", inet_ntop (AF_INET6, &pinfo->nd_opt_pi_prefix,
>+ buf, INET6_ADDRSTRLEN));
>
> }
> #endif /* DEBUG */
>@@ -550,7 +551,7 @@ rtadv_prefix_reset (struct zebra_if *zif
> DEFUN (ipv6_nd_suppress_ra,
> ipv6_nd_suppress_ra_cmd,
> "ipv6 nd suppress-ra",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Suppress Router Advertisement\n")
> {
>@@ -581,19 +582,11 @@ DEFUN (ipv6_nd_suppress_ra,
> return CMD_SUCCESS;
> }
>
>-ALIAS (ipv6_nd_suppress_ra,
>- no_ipv6_nd_send_ra_cmd,
>- "no ipv6 nd send-ra",
>- NO_STR
>- IP_STR
>- "Neighbor discovery\n"
>- "Send Router Advertisement\n")
>-
> DEFUN (no_ipv6_nd_suppress_ra,
> no_ipv6_nd_suppress_ra_cmd,
> "no ipv6 nd suppress-ra",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Suppress Router Advertisement\n")
> {
>@@ -624,17 +617,10 @@ DEFUN (no_ipv6_nd_suppress_ra,
> return CMD_SUCCESS;
> }
>
>-ALIAS (no_ipv6_nd_suppress_ra,
>- ipv6_nd_send_ra_cmd,
>- "ipv6 nd send-ra",
>- IP_STR
>- "Neighbor discovery\n"
>- "Send Router Advertisement\n")
>-
> DEFUN (ipv6_nd_ra_interval,
> ipv6_nd_ra_interval_cmd,
> "ipv6 nd ra-interval SECONDS",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Router Advertisement interval\n"
> "Router Advertisement interval in seconds\n")
>@@ -665,7 +651,7 @@ DEFUN (no_ipv6_nd_ra_interval,
> no_ipv6_nd_ra_interval_cmd,
> "no ipv6 nd ra-interval",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Router Advertisement interval\n")
> {
>@@ -685,7 +671,7 @@ DEFUN (no_ipv6_nd_ra_interval,
> DEFUN (ipv6_nd_ra_lifetime,
> ipv6_nd_ra_lifetime_cmd,
> "ipv6 nd ra-lifetime SECONDS",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Router lifetime\n"
> "Router lifetime in seconds\n")
>@@ -714,7 +700,7 @@ DEFUN (no_ipv6_nd_ra_lifetime,
> no_ipv6_nd_ra_lifetime_cmd,
> "no ipv6 nd ra-lifetime",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Router lifetime\n")
> {
>@@ -732,7 +718,7 @@ DEFUN (no_ipv6_nd_ra_lifetime,
> DEFUN (ipv6_nd_reachable_time,
> ipv6_nd_reachable_time_cmd,
> "ipv6 nd reachable-time MILLISECONDS",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Reachable time\n"
> "Reachable time in milliseconds\n")
>@@ -761,7 +747,7 @@ DEFUN (no_ipv6_nd_reachable_time,
> no_ipv6_nd_reachable_time_cmd,
> "no ipv6 nd reachable-time",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Reachable time\n")
> {
>@@ -779,7 +765,7 @@ DEFUN (no_ipv6_nd_reachable_time,
> DEFUN (ipv6_nd_managed_config_flag,
> ipv6_nd_managed_config_flag_cmd,
> "ipv6 nd managed-config-flag",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Managed address configuration flag\n")
> {
>@@ -798,7 +784,7 @@ DEFUN (no_ipv6_nd_managed_config_flag,
> no_ipv6_nd_managed_config_flag_cmd,
> "no ipv6 nd managed-config-flag",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Managed address configuration flag\n")
> {
>@@ -816,7 +802,7 @@ DEFUN (no_ipv6_nd_managed_config_flag,
> DEFUN (ipv6_nd_other_config_flag,
> ipv6_nd_other_config_flag_cmd,
> "ipv6 nd other-config-flag",
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Other statefull configuration flag\n")
> {
>@@ -835,7 +821,7 @@ DEFUN (no_ipv6_nd_other_config_flag,
> no_ipv6_nd_other_config_flag_cmd,
> "no ipv6 nd other-config-flag",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Other statefull configuration flag\n")
> {
>@@ -850,20 +836,24 @@ DEFUN (no_ipv6_nd_other_config_flag,
> return CMD_SUCCESS;
> }
>
>-DEFUN (ipv6_nd_prefix_advertisement,
>- ipv6_nd_prefix_advertisement_cmd,
>- "ipv6 nd prefix-advertisement IPV6PREFIX VALID PREFERRED [onlink] [autoconfig]",
>- IP_STR
>+DEFUN (ipv6_nd_prefix,
>+ ipv6_nd_prefix_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (<0-4294967295>|infinite) "
>+ "(<0-4294967295>|infinite) (off-link|) (no-autoconfig|)",
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Prefix information\n"
> "IPv6 prefix\n"
> "Valid lifetime in seconds\n"
>+ "Infinite valid lifetime\n"
> "Preferred lifetime in seconds\n"
>- "On link flag\n"
>- "Autonomous address-configuration flag\n")
>+ "Infinite preferred lifetime\n"
>+ "Do not use prefix for onlink determination\n"
>+ "Do not use prefix for autoconfiguration\n")
> {
> int i;
> int ret;
>+ int cursor = 1;
> struct interface *ifp;
> struct zebra_if *zebra_if;
> struct rtadv_prefix rp;
>@@ -877,32 +867,43 @@ DEFUN (ipv6_nd_prefix_advertisement,
> vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
> return CMD_WARNING;
> }
>+ rp.AdvOnLinkFlag = 1;
>+ rp.AdvAutonomousFlag = 1;
>+ rp.AdvValidLifetime = RTADV_VALID_LIFETIME;
>+ rp.AdvPreferredLifetime = RTADV_PREFERRED_LIFETIME;
>
>- if (argc == 1)
>- {
>- rp.AdvValidLifetime = RTADV_VALID_LIFETIME;
>- rp.AdvPreferredLifetime = RTADV_PREFERRED_LIFETIME;
>- rp.AdvOnLinkFlag = 1;
>- rp.AdvAutonomousFlag = 1;
>- }
>- else
>+ if (argc > 1)
> {
>- rp.AdvValidLifetime = (u_int32_t) atol (argv[1]);
>- rp.AdvPreferredLifetime = (u_int32_t) atol (argv[2]);
>- if (rp.AdvPreferredLifetime > rp.AdvValidLifetime)
>+ if ((isdigit(argv[1][0])) || strncmp (argv[1], "i", 1) == 0)
> {
>- vty_out (vty, "Invalid preferred lifetime%s", VTY_NEWLINE);
>- return CMD_WARNING;
>+ if ( strncmp (argv[1], "i", 1) == 0)
>+ rp.AdvValidLifetime = UINT32_MAX;
>+ else
>+ rp.AdvValidLifetime = (u_int32_t) strtoll (argv[1],
>+ (char **)NULL, 10);
>+
>+ if ( strncmp (argv[2], "i", 1) == 0)
>+ rp.AdvPreferredLifetime = UINT32_MAX;
>+ else
>+ rp.AdvPreferredLifetime = (u_int32_t) strtoll (argv[2],
>+ (char **)NULL, 10);
>+
>+ if (rp.AdvPreferredLifetime > rp.AdvValidLifetime)
>+ {
>+ vty_out (vty, "Invalid preferred lifetime%s", VTY_NEWLINE);
>+ return CMD_WARNING;
>+ }
>+ cursor = cursor + 2;
> }
>-
>- rp.AdvOnLinkFlag = 0;
>- rp.AdvAutonomousFlag = 0;
>- for (i = 3; i < argc; i++)
>+ if (argc > cursor)
> {
>- if (! strcmp (argv[i], "onlink"))
>- rp.AdvOnLinkFlag = 1;
>- else if (! strcmp (argv[i], "autoconfig"))
>- rp.AdvAutonomousFlag = 1;
>+ for (i = cursor; i < argc; i++)
>+ {
>+ if (strncmp (argv[i], "of", 2) == 0)
>+ rp.AdvOnLinkFlag = 0;
>+ if (strncmp (argv[i], "no", 2) == 0)
>+ rp.AdvAutonomousFlag = 0;
>+ }
> }
> }
>
>@@ -911,19 +912,130 @@ DEFUN (ipv6_nd_prefix_advertisement,
> return CMD_SUCCESS;
> }
>
>-ALIAS (ipv6_nd_prefix_advertisement,
>- ipv6_nd_prefix_advertisement_no_val_cmd,
>- "ipv6 nd prefix-advertisement IPV6PREFIX",
>- IP_STR
>+/* This ALIAS is for compatibility only with zebra or older quagga
>+ * configuration and should not be used any more. It will be removed
>+ * in future probably.
>+ */
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_val_old_cmd,
>+ "ipv6 nd prefix-advertisment IPV6PREFIX <0-4294967295> <0-4294967295> "
>+ "on-link autoconfig",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Obsolete prefix information command for compatibility\n"
>+ "IPv6 prefix\n"
>+ "Valid lifetime in seconds\n"
>+ "Preferred lifetime in seconds\n"
>+ "Use prefix for onlink determination\n"
>+ "Use prefix for autoconfiguration\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_val_rev_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (<0-4294967295>|infinite) "
>+ "(<0-4294967295>|infinite) (no-autoconfig|) (off-link|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Valid lifetime in seconds\n"
>+ "Infinite valid lifetime\n"
>+ "Preferred lifetime in seconds\n"
>+ "Infinite preferred lifetime\n"
>+ "Do not use prefix for autoconfiguration\n"
>+ "Do not use prefix for onlink determination\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_val_noauto_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (<0-4294967295>|infinite) "
>+ "(<0-4294967295>|infinite) (no-autoconfig|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Valid lifetime in seconds\n"
>+ "Infinite valid lifetime\n"
>+ "Preferred lifetime in seconds\n"
>+ "Infinite preferred lifetime\n"
>+ "Do not use prefix for autoconfigurationn")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_val_offlink_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (<0-4294967295>|infinite) "
>+ "(<0-4294967295>|infinite) (off-link|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Valid lifetime in seconds\n"
>+ "Infinite valid lifetime\n"
>+ "Preferred lifetime in seconds\n"
>+ "Infinite preferred lifetime\n"
>+ "Do not use prefix for onlink determination\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_val_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (<0-4294967295>|infinite) "
>+ "(<0-4294967295>|infinite)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Valid lifetime in seconds\n"
>+ "Infinite valid lifetime\n"
>+ "Preferred lifetime in seconds\n"
>+ "Infinite preferred lifetime\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_noval_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (no-autoconfig|) (off-link|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Do not use prefix for autoconfiguration\n"
>+ "Do not use prefix for onlink determination\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_noval_rev_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (off-link|) (no-autoconfig|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Do not use prefix for onlink determination\n"
>+ "Do not use prefix for autoconfiguration\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_noval_noauto_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (no-autoconfig|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Do not use prefix for autoconfiguration\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_noval_offlink_cmd,
>+ "ipv6 nd prefix X:X::X:X/M (off-link|)",
>+ "Interface IPv6 config commands\n"
>+ "Neighbor discovery\n"
>+ "Prefix information\n"
>+ "IPv6 prefix\n"
>+ "Do not use prefix for onlink determination\n")
>+
>+ALIAS (ipv6_nd_prefix,
>+ ipv6_nd_prefix_prefix_cmd,
>+ "ipv6 nd prefix X:X::X:X/M",
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Prefix information\n"
> "IPv6 prefix\n")
>
>-DEFUN (no_ipv6_nd_prefix_advertisement,
>- no_ipv6_nd_prefix_advertisement_cmd,
>- "no ipv6 nd prefix-advertisement IPV6PREFIX",
>+DEFUN (no_ipv6_nd_prefix,
>+ no_ipv6_nd_prefix_cmd,
>+ "no ipv6 nd prefix IPV6PREFIX",
> NO_STR
>- IP_STR
>+ "Interface IPv6 config commands\n"
> "Neighbor discovery\n"
> "Prefix information\n"
> "IPv6 prefix\n")
>@@ -996,16 +1108,26 @@ rtadv_config_write (struct vty *vty, str
> for (node = listhead(zif->rtadv.AdvPrefixList); node; node = nextnode (node))
> {
> rprefix = getdata (node);
>- vty_out (vty, " ipv6 nd prefix-advertisement %s/%d %d %d",
>+ vty_out (vty, " ipv6 nd prefix %s/%d",
> inet_ntop (AF_INET6, &rprefix->prefix.u.prefix6,
> buf, INET6_ADDRSTRLEN),
>- rprefix->prefix.prefixlen,
>- rprefix->AdvValidLifetime,
>- rprefix->AdvPreferredLifetime);
>- if (rprefix->AdvOnLinkFlag)
>- vty_out (vty, " onlink");
>- if (rprefix->AdvAutonomousFlag)
>- vty_out (vty, " autoconfig");
>+ rprefix->prefix.prefixlen);
>+ if ((rprefix->AdvValidLifetime != RTADV_VALID_LIFETIME) ||
>+ (rprefix->AdvPreferredLifetime != RTADV_PREFERRED_LIFETIME))
>+ {
>+ if (rprefix->AdvValidLifetime == UINT32_MAX)
>+ vty_out (vty, " infinite");
>+ else
>+ vty_out (vty, " %u", rprefix->AdvValidLifetime);
>+ if (rprefix->AdvPreferredLifetime == UINT32_MAX)
>+ vty_out (vty, " infinite");
>+ else
>+ vty_out (vty, " %u", rprefix->AdvPreferredLifetime);
>+ }
>+ if (!rprefix->AdvOnLinkFlag)
>+ vty_out (vty, " off-link");
>+ if (!rprefix->AdvAutonomousFlag)
>+ vty_out (vty, " no-autoconfig");
> vty_out (vty, "%s", VTY_NEWLINE);
> }
> }
>@@ -1020,7 +1142,8 @@ rtadv_event (enum rtadv_event event, int
> if (! rtadv->ra_read)
> rtadv->ra_read = thread_add_read (zebrad.master, rtadv_read, NULL, val);
> if (! rtadv->ra_timer)
>- rtadv->ra_timer = thread_add_event (zebrad.master, rtadv_timer, NULL, 0);
>+ rtadv->ra_timer = thread_add_event (zebrad.master, rtadv_timer,
>+ NULL, 0);
> break;
> case RTADV_STOP:
> if (rtadv->ra_timer)
>@@ -1036,7 +1159,8 @@ rtadv_event (enum rtadv_event event, int
> break;
> case RTADV_TIMER:
> if (! rtadv->ra_timer)
>- rtadv->ra_timer = thread_add_timer (zebrad.master, rtadv_timer, NULL, val);
>+ rtadv->ra_timer = thread_add_timer (zebrad.master, rtadv_timer, NULL,
>+ val);
> break;
> case RTADV_READ:
> if (! rtadv->ra_read)
>@@ -1062,8 +1186,6 @@ rtadv_init ()
>
> install_element (INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd);
> install_element (INTERFACE_NODE, &no_ipv6_nd_suppress_ra_cmd);
>- install_element (INTERFACE_NODE, &ipv6_nd_send_ra_cmd);
>- install_element (INTERFACE_NODE, &no_ipv6_nd_send_ra_cmd);
> install_element (INTERFACE_NODE, &ipv6_nd_ra_interval_cmd);
> install_element (INTERFACE_NODE, &no_ipv6_nd_ra_interval_cmd);
> install_element (INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd);
>@@ -1074,9 +1196,18 @@ rtadv_init ()
> install_element (INTERFACE_NODE, &no_ipv6_nd_managed_config_flag_cmd);
> install_element (INTERFACE_NODE, &ipv6_nd_other_config_flag_cmd);
> install_element (INTERFACE_NODE, &no_ipv6_nd_other_config_flag_cmd);
>- install_element (INTERFACE_NODE, &ipv6_nd_prefix_advertisement_cmd);
>- install_element (INTERFACE_NODE, &ipv6_nd_prefix_advertisement_no_val_cmd);
>- install_element (INTERFACE_NODE, &no_ipv6_nd_prefix_advertisement_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_val_old_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_val_rev_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_val_noauto_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_val_offlink_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_val_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_noval_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_noval_rev_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_noval_noauto_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_noval_offlink_cmd);
>+ install_element (INTERFACE_NODE, &ipv6_nd_prefix_prefix_cmd);
>+ install_element (INTERFACE_NODE, &no_ipv6_nd_prefix_cmd);
> }
>
> int
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Quagga-dev mailing list
>Quagga-dev@lists.quagga.net
>http://lists.quagga.net/mailman/listinfo/quagga-dev
>
>