2002-12-13 21:15:29 +01:00
|
|
|
/* RIPd and zebra interface.
|
|
|
|
* Copyright (C) 1997, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
|
|
|
|
*
|
|
|
|
* This file is part of GNU Zebra.
|
|
|
|
*
|
|
|
|
* GNU Zebra is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the
|
|
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
|
|
* later version.
|
|
|
|
*
|
|
|
|
* GNU Zebra is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with GNU Zebra; see the file COPYING. If not, write to the Free
|
|
|
|
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
* 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <zebra.h>
|
|
|
|
|
|
|
|
#include "command.h"
|
|
|
|
#include "prefix.h"
|
|
|
|
#include "stream.h"
|
|
|
|
#include "routemap.h"
|
|
|
|
#include "zclient.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include "ripd/ripd.h"
|
|
|
|
#include "ripd/rip_debug.h"
|
2005-10-26 01:31:05 +02:00
|
|
|
#include "ripd/rip_interface.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* All information about zebra. */
|
|
|
|
struct zclient *zclient = NULL;
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* RIPd to zebra command interface. */
|
|
|
|
void
|
|
|
|
rip_zebra_ipv4_add (struct prefix_ipv4 *p, struct in_addr *nexthop,
|
|
|
|
u_int32_t metric, u_char distance)
|
|
|
|
{
|
|
|
|
struct zapi_ipv4 api;
|
|
|
|
|
2015-05-20 03:03:45 +02:00
|
|
|
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
api.type = ZEBRA_ROUTE_RIP;
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
api.instance = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
api.flags = 0;
|
|
|
|
api.message = 0;
|
2011-12-05 13:35:14 +01:00
|
|
|
api.safi = SAFI_UNICAST;
|
2002-12-13 21:15:29 +01:00
|
|
|
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
|
|
|
|
api.nexthop_num = 1;
|
|
|
|
api.nexthop = &nexthop;
|
|
|
|
api.ifindex_num = 0;
|
|
|
|
SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
|
|
|
|
api.metric = metric;
|
|
|
|
|
|
|
|
if (distance && distance != ZEBRA_RIP_DISTANCE_DEFAULT)
|
|
|
|
{
|
|
|
|
SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
|
|
|
|
api.distance = distance;
|
|
|
|
}
|
|
|
|
|
2004-05-08 13:48:26 +02:00
|
|
|
zapi_ipv4_route (ZEBRA_IPV4_ROUTE_ADD, zclient, p, &api);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
rip_global_route_changes++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
rip_zebra_ipv4_delete (struct prefix_ipv4 *p, struct in_addr *nexthop,
|
|
|
|
u_int32_t metric)
|
|
|
|
{
|
|
|
|
struct zapi_ipv4 api;
|
|
|
|
|
2015-05-20 03:03:45 +02:00
|
|
|
if (zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
api.type = ZEBRA_ROUTE_RIP;
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
api.instance = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
api.flags = 0;
|
|
|
|
api.message = 0;
|
2011-12-05 13:35:14 +01:00
|
|
|
api.safi = SAFI_UNICAST;
|
2002-12-13 21:15:29 +01:00
|
|
|
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
|
|
|
|
api.nexthop_num = 1;
|
|
|
|
api.nexthop = &nexthop;
|
|
|
|
api.ifindex_num = 0;
|
|
|
|
SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
|
|
|
|
api.metric = metric;
|
|
|
|
|
2004-05-08 13:48:26 +02:00
|
|
|
zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, p, &api);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
rip_global_route_changes++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Zebra route add and delete treatment. */
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
rip_zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
|
|
|
|
{
|
|
|
|
struct stream *s;
|
|
|
|
struct zapi_ipv4 api;
|
|
|
|
unsigned long ifindex;
|
|
|
|
struct in_addr nexthop;
|
|
|
|
struct prefix_ipv4 p;
|
|
|
|
|
|
|
|
s = zclient->ibuf;
|
|
|
|
ifindex = 0;
|
|
|
|
nexthop.s_addr = 0;
|
|
|
|
|
|
|
|
/* Type, flags, message. */
|
|
|
|
api.type = stream_getc (s);
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
api.instance = stream_getw (s);
|
2002-12-13 21:15:29 +01:00
|
|
|
api.flags = stream_getc (s);
|
|
|
|
api.message = stream_getc (s);
|
|
|
|
|
|
|
|
/* IPv4 prefix. */
|
|
|
|
memset (&p, 0, sizeof (struct prefix_ipv4));
|
|
|
|
p.family = AF_INET;
|
|
|
|
p.prefixlen = stream_getc (s);
|
|
|
|
stream_get (&p.prefix, s, PSIZE (p.prefixlen));
|
|
|
|
|
|
|
|
/* Nexthop, ifindex, distance, metric. */
|
|
|
|
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
|
|
|
|
{
|
|
|
|
api.nexthop_num = stream_getc (s);
|
|
|
|
nexthop.s_addr = stream_get_ipv4 (s);
|
|
|
|
}
|
|
|
|
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
|
|
|
|
{
|
|
|
|
api.ifindex_num = stream_getc (s);
|
|
|
|
ifindex = stream_getl (s);
|
|
|
|
}
|
|
|
|
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
|
|
|
|
api.distance = stream_getc (s);
|
2005-09-29 13:25:50 +02:00
|
|
|
else
|
|
|
|
api.distance = 255;
|
2002-12-13 21:15:29 +01:00
|
|
|
if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
|
|
|
|
api.metric = stream_getl (s);
|
2005-09-29 13:25:50 +02:00
|
|
|
else
|
|
|
|
api.metric = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Then fetch IPv4 prefixes. */
|
2015-10-21 06:38:38 +02:00
|
|
|
if (command == ZEBRA_REDISTRIBUTE_IPV4_ADD)
|
2005-09-29 13:25:50 +02:00
|
|
|
rip_redistribute_add (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex,
|
|
|
|
&nexthop, api.metric, api.distance);
|
2015-10-21 06:38:38 +02:00
|
|
|
else if (command == ZEBRA_REDISTRIBUTE_IPV4_DEL)
|
2002-12-13 21:15:29 +01:00
|
|
|
rip_redistribute_delete (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-10-26 01:31:05 +02:00
|
|
|
rip_zclient_reset (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
zclient_reset (zclient);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* RIP route-map set for redistribution */
|
2005-10-26 01:31:05 +02:00
|
|
|
static void
|
2004-10-11 14:57:57 +02:00
|
|
|
rip_routemap_set (int type, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (rip->route_map[type].name)
|
|
|
|
free(rip->route_map[type].name);
|
|
|
|
|
|
|
|
rip->route_map[type].name = strdup (name);
|
|
|
|
rip->route_map[type].map = route_map_lookup_by_name (name);
|
|
|
|
}
|
|
|
|
|
2005-10-26 01:31:05 +02:00
|
|
|
static void
|
2004-10-08 08:36:38 +02:00
|
|
|
rip_redistribute_metric_set (int type, unsigned int metric)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
rip->route_map[type].metric_config = 1;
|
|
|
|
rip->route_map[type].metric = metric;
|
|
|
|
}
|
|
|
|
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2004-10-08 08:36:38 +02:00
|
|
|
rip_metric_unset (int type, unsigned int metric)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
#define DONT_CARE_METRIC_RIP 17
|
|
|
|
if (metric != DONT_CARE_METRIC_RIP &&
|
|
|
|
rip->route_map[type].metric != metric)
|
|
|
|
return 1;
|
|
|
|
rip->route_map[type].metric_config = 0;
|
|
|
|
rip->route_map[type].metric = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* RIP route-map unset for redistribution */
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2004-10-11 14:57:57 +02:00
|
|
|
rip_routemap_unset (int type, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (! rip->route_map[type].name ||
|
|
|
|
(name != NULL && strcmp(rip->route_map[type].name,name)))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
free (rip->route_map[type].name);
|
|
|
|
rip->route_map[type].name = NULL;
|
|
|
|
rip->route_map[type].map = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Redistribution types */
|
|
|
|
static struct {
|
|
|
|
int type;
|
|
|
|
int str_min_len;
|
2004-10-08 08:36:38 +02:00
|
|
|
const char *str;
|
2002-12-13 21:15:29 +01:00
|
|
|
} redist_type[] = {
|
|
|
|
{ZEBRA_ROUTE_KERNEL, 1, "kernel"},
|
|
|
|
{ZEBRA_ROUTE_CONNECT, 1, "connected"},
|
|
|
|
{ZEBRA_ROUTE_STATIC, 1, "static"},
|
|
|
|
{ZEBRA_ROUTE_OSPF, 1, "ospf"},
|
2012-02-09 21:51:17 +01:00
|
|
|
{ZEBRA_ROUTE_BGP, 2, "bgp"},
|
|
|
|
{ZEBRA_ROUTE_BABEL, 2, "babel"},
|
2002-12-13 21:15:29 +01:00
|
|
|
{0, 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
DEFUN (router_zebra,
|
|
|
|
router_zebra_cmd,
|
|
|
|
"router zebra",
|
|
|
|
"Enable a routing process\n"
|
|
|
|
"Make connection to zebra daemon\n")
|
|
|
|
{
|
|
|
|
vty->node = ZEBRA_NODE;
|
|
|
|
zclient->enable = 1;
|
|
|
|
zclient_start (zclient);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_router_zebra,
|
|
|
|
no_router_zebra_cmd,
|
|
|
|
"no router zebra",
|
|
|
|
NO_STR
|
|
|
|
"Enable a routing process\n"
|
|
|
|
"Make connection to zebra daemon\n")
|
|
|
|
{
|
|
|
|
zclient->enable = 0;
|
|
|
|
zclient_stop (zclient);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2009-12-10 17:16:05 +01:00
|
|
|
#if 0
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
rip_redistribute_set (int type)
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
if (zclient->redist[AFI_IP][type])
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient->redist[AFI_IP][type] = 1;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (zclient->sock > 0)
|
2015-05-20 03:03:45 +02:00
|
|
|
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, API_IP, type);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
2009-12-10 17:16:05 +01:00
|
|
|
#endif
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
rip_redistribute_unset (int type)
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
if (! zclient->redist[AFI_IP][type].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
|
2015-05-20 03:03:45 +02:00
|
|
|
redist_del_instance(&zclient->redist[AFI_IP][type], 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (zclient->sock > 0)
|
2015-05-20 03:03:45 +02:00
|
|
|
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Remove the routes from RIP table. */
|
|
|
|
rip_redistribute_withdraw (type);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
rip_redistribute_check (int type)
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
return (zclient->redist[AFI_IP][type].enabled);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-10-26 01:31:05 +02:00
|
|
|
rip_redistribute_clean (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
if (zclient->redist[AFI_IP][redist_type[i].type].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (zclient->sock > 0)
|
|
|
|
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient, AFI_IP, redist_type[i].type, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:03:45 +02:00
|
|
|
redist_del_instance(&zclient->redist[AFI_IP][redist_type[i].type], 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Remove the routes from RIP table. */
|
|
|
|
rip_redistribute_withdraw (redist_type[i].type);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (rip_redistribute_rip,
|
|
|
|
rip_redistribute_rip_cmd,
|
|
|
|
"redistribute rip",
|
|
|
|
"Redistribute information from another routing protocol\n"
|
|
|
|
"Routing Information Protocol (RIP)\n")
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
redist_add_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP], 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_rip_redistribute_rip,
|
|
|
|
no_rip_redistribute_rip_cmd,
|
|
|
|
"no redistribute rip",
|
|
|
|
NO_STR
|
|
|
|
"Redistribute information from another routing protocol\n"
|
|
|
|
"Routing Information Protocol (RIP)\n")
|
|
|
|
{
|
2015-05-20 03:03:45 +02:00
|
|
|
redist_del_instance(&zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP], 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (rip_redistribute_type,
|
|
|
|
rip_redistribute_type_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"redistribute " QUAGGA_REDIST_STR_RIPD,
|
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for(i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
|
|
|
if (strncmp (redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
2004-05-08 13:48:26 +02:00
|
|
|
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient,
|
2015-05-20 03:03:45 +02:00
|
|
|
AFI_IP, redist_type[i].type, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_rip_redistribute_type,
|
|
|
|
no_rip_redistribute_type_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"no redistribute " QUAGGA_REDIST_STR_RIPD,
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
2006-06-30 18:58:53 +02:00
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
rip_metric_unset (redist_type[i].type, DONT_CARE_METRIC_RIP);
|
|
|
|
rip_routemap_unset (redist_type[i].type,NULL);
|
|
|
|
rip_redistribute_unset (redist_type[i].type);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (rip_redistribute_type_routemap,
|
|
|
|
rip_redistribute_type_routemap_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
|
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2002-12-13 21:15:29 +01:00
|
|
|
"Route map reference\n"
|
|
|
|
"Pointer to route-map entries\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++) {
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
rip_routemap_set (redist_type[i].type, argv[1]);
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
|
|
|
|
redist_type[i].type, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_rip_redistribute_type_routemap,
|
|
|
|
no_rip_redistribute_type_routemap_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"no redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
2006-06-30 18:58:53 +02:00
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2002-12-13 21:15:29 +01:00
|
|
|
"Route map reference\n"
|
|
|
|
"Pointer to route-map entries\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
if (rip_routemap_unset (redist_type[i].type,argv[1]))
|
|
|
|
return CMD_WARNING;
|
|
|
|
rip_redistribute_unset (redist_type[i].type);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (rip_redistribute_type_metric,
|
|
|
|
rip_redistribute_type_metric_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
|
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2002-12-13 21:15:29 +01:00
|
|
|
"Metric\n"
|
|
|
|
"Metric value\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int metric;
|
|
|
|
|
|
|
|
metric = atoi (argv[1]);
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++) {
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
rip_redistribute_metric_set (redist_type[i].type, metric);
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
|
|
|
|
redist_type[i].type, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_rip_redistribute_type_metric,
|
|
|
|
no_rip_redistribute_type_metric_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"no redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
2006-06-30 18:58:53 +02:00
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2002-12-13 21:15:29 +01:00
|
|
|
"Metric\n"
|
|
|
|
"Metric value\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
|
|
|
|
return CMD_WARNING;
|
|
|
|
rip_redistribute_unset (redist_type[i].type);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
2003-05-25 16:49:19 +02:00
|
|
|
DEFUN (rip_redistribute_type_metric_routemap,
|
|
|
|
rip_redistribute_type_metric_routemap_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16> route-map WORD",
|
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2003-05-25 16:49:19 +02:00
|
|
|
"Metric\n"
|
|
|
|
"Metric value\n"
|
|
|
|
"Route map reference\n"
|
|
|
|
"Pointer to route-map entries\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int metric;
|
|
|
|
|
|
|
|
metric = atoi (argv[1]);
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++) {
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
rip_redistribute_metric_set (redist_type[i].type, metric);
|
|
|
|
rip_routemap_set (redist_type[i].type, argv[2]);
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP,
|
|
|
|
redist_type[i].type, 0);
|
2003-05-25 16:49:19 +02:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
DEFUN (no_rip_redistribute_type_metric_routemap,
|
|
|
|
no_rip_redistribute_type_metric_routemap_cmd,
|
2006-06-30 18:58:53 +02:00
|
|
|
"no redistribute " QUAGGA_REDIST_STR_RIPD
|
|
|
|
" metric <0-16> route-map WORD",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
2006-06-30 18:58:53 +02:00
|
|
|
REDIST_STR
|
|
|
|
QUAGGA_REDIST_HELP_STR_RIPD
|
2002-12-13 21:15:29 +01:00
|
|
|
"Metric\n"
|
|
|
|
"Metric value\n"
|
|
|
|
"Route map reference\n"
|
|
|
|
"Pointer to route-map entries\n")
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; redist_type[i].str; i++)
|
|
|
|
{
|
|
|
|
if (strncmp(redist_type[i].str, argv[0],
|
|
|
|
redist_type[i].str_min_len) == 0)
|
|
|
|
{
|
|
|
|
if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
|
|
|
|
return CMD_WARNING;
|
|
|
|
if (rip_routemap_unset (redist_type[i].type, argv[2]))
|
|
|
|
{
|
|
|
|
rip_redistribute_metric_set(redist_type[i].type, atoi(argv[1]));
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
|
|
|
rip_redistribute_unset (redist_type[i].type);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "Invalid type %s%s", argv[0],
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
return CMD_WARNING;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Default information originate. */
|
|
|
|
|
|
|
|
DEFUN (rip_default_information_originate,
|
|
|
|
rip_default_information_originate_cmd,
|
|
|
|
"default-information originate",
|
|
|
|
"Control distribution of default route\n"
|
|
|
|
"Distribute a default route\n")
|
|
|
|
{
|
|
|
|
struct prefix_ipv4 p;
|
|
|
|
|
|
|
|
if (! rip->default_information)
|
|
|
|
{
|
|
|
|
memset (&p, 0, sizeof (struct prefix_ipv4));
|
|
|
|
p.family = AF_INET;
|
|
|
|
|
|
|
|
rip->default_information = 1;
|
|
|
|
|
2005-09-29 13:25:50 +02:00
|
|
|
rip_redistribute_add (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0,
|
|
|
|
NULL, 0, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_rip_default_information_originate,
|
|
|
|
no_rip_default_information_originate_cmd,
|
|
|
|
"no default-information originate",
|
|
|
|
NO_STR
|
|
|
|
"Control distribution of default route\n"
|
|
|
|
"Distribute a default route\n")
|
|
|
|
{
|
|
|
|
struct prefix_ipv4 p;
|
|
|
|
|
|
|
|
if (rip->default_information)
|
|
|
|
{
|
|
|
|
memset (&p, 0, sizeof (struct prefix_ipv4));
|
|
|
|
p.family = AF_INET;
|
|
|
|
|
|
|
|
rip->default_information = 0;
|
|
|
|
|
2003-05-25 16:49:19 +02:00
|
|
|
rip_redistribute_delete (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* RIP configuration write function. */
|
2005-10-26 01:31:05 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
config_write_zebra (struct vty *vty)
|
|
|
|
{
|
|
|
|
if (! zclient->enable)
|
|
|
|
{
|
|
|
|
vty_out (vty, "no router zebra%s", VTY_NEWLINE);
|
|
|
|
return 1;
|
|
|
|
}
|
2015-05-20 03:03:45 +02:00
|
|
|
else if (! zclient->redist[AFI_IP][ZEBRA_ROUTE_RIP].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
vty_out (vty, "router zebra%s", VTY_NEWLINE);
|
|
|
|
vty_out (vty, " no redistribute rip%s", VTY_NEWLINE);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
config_write_rip_redistribute (struct vty *vty, int config_mode)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
if (i != zclient->redist_default &&
|
2015-05-20 03:03:45 +02:00
|
|
|
zclient->redist[AFI_IP][i].enabled)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (config_mode)
|
|
|
|
{
|
|
|
|
if (rip->route_map[i].metric_config)
|
|
|
|
{
|
|
|
|
if (rip->route_map[i].name)
|
|
|
|
vty_out (vty, " redistribute %s metric %d route-map %s%s",
|
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* zebra.h: Declare new functions zebra_route_string() and
zebra_route_char().
* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New
functions to map zebra route numbers to strings.
* zebra_vty.c: (route_type_str) Remove obsolete function: use new
library function zebra_route_string() instead. Note that there
are a few differences: for IPv6 routes, we now get "ripng" and
"ospf6" instead of the old behavior ("rip" and "ospf").
(route_type_char) Remove obsolete function: ues new library function
zebra_route_char() instead. Note that there is one difference:
the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route,
whereas the new one returns 'X'.
(vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace
route_type_str() with zebra_route_string().
(vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()
with zebra_route_char().
* bgp_vty.c: (bgp_config_write_redistribute) Use new library function
zebra_route_string instead of a local hard-coded table.
* ospf6_asbr.c: Remove local hard-coded tables zroute_name and
zroute_abname. Change the ZROUTE_NAME macro to use new library
function zebra_route_string(). Remove the ZROUTE_ABNAME macro.
(ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with
a call to zebra_route_char(), and be sure to fix the format string,
since we now have a char instead of a char *.
* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and
zebra_route_abname. Note that the zebra_route_name[] table
contained mixed-case strings, whereas the zebra_route_string()
function returns lower-case strings.
(ospf6_zebra_read_ipv6): Change debug message to use new library
function zebra_route_string() instead of zebra_route_name[].
(show_zebra): Use new library function zebra_route_string() instead
of zebra_route_name[].
* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.
(ospf_redist_string) New function implemented using new library
function zebra_route_string(). Note that there are a few differences
in the output that will result: the new function returns strings
that are lower-case, whereas the old table was mixed case. Also,
the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the
new function returns "ospf6".
* ospfd.h: Remove extern struct message ospf_redistributed_proto[],
and add extern const char *ospf_redist_string(u_int route_type)
instead.
* ospf_asbr.c: (ospf_external_info_add) In two messages, use
ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).
* ospf_vty.c: Remove local hard-coded table distribute_str.
(config_write_ospf_redistribute,config_write_ospf_distribute): Use
new library function zebra_route_string() instead of distribute_str[].
* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,
ospf_redistribute_default_set,ospf_redistribute_check)
In debug messages, use ospf_redist_string() instead of
LOOKUP(ospf_redistributed_proto).
* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded
table str[]. Replace str[] with calls to new library function
zebra_route_string().
* ripd.c: Remove local hard-coded table route_info[].
(show_ip_rip) Replace uses of str[] with calls to new library
functions zebra_route_char and zebra_route_string.
* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded
table str[]. Replace str[i] with new library function
zebra_route_string(i).
* ripngd.c: Remove local hard-coded table route_info[].
(show_ipv6_ripng) Use new library function zebra_route_char() instead
of table route_info[].
2005-10-01 19:38:06 +02:00
|
|
|
zebra_route_string(i), rip->route_map[i].metric,
|
2002-12-13 21:15:29 +01:00
|
|
|
rip->route_map[i].name,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
else
|
|
|
|
vty_out (vty, " redistribute %s metric %d%s",
|
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* zebra.h: Declare new functions zebra_route_string() and
zebra_route_char().
* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New
functions to map zebra route numbers to strings.
* zebra_vty.c: (route_type_str) Remove obsolete function: use new
library function zebra_route_string() instead. Note that there
are a few differences: for IPv6 routes, we now get "ripng" and
"ospf6" instead of the old behavior ("rip" and "ospf").
(route_type_char) Remove obsolete function: ues new library function
zebra_route_char() instead. Note that there is one difference:
the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route,
whereas the new one returns 'X'.
(vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace
route_type_str() with zebra_route_string().
(vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()
with zebra_route_char().
* bgp_vty.c: (bgp_config_write_redistribute) Use new library function
zebra_route_string instead of a local hard-coded table.
* ospf6_asbr.c: Remove local hard-coded tables zroute_name and
zroute_abname. Change the ZROUTE_NAME macro to use new library
function zebra_route_string(). Remove the ZROUTE_ABNAME macro.
(ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with
a call to zebra_route_char(), and be sure to fix the format string,
since we now have a char instead of a char *.
* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and
zebra_route_abname. Note that the zebra_route_name[] table
contained mixed-case strings, whereas the zebra_route_string()
function returns lower-case strings.
(ospf6_zebra_read_ipv6): Change debug message to use new library
function zebra_route_string() instead of zebra_route_name[].
(show_zebra): Use new library function zebra_route_string() instead
of zebra_route_name[].
* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.
(ospf_redist_string) New function implemented using new library
function zebra_route_string(). Note that there are a few differences
in the output that will result: the new function returns strings
that are lower-case, whereas the old table was mixed case. Also,
the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the
new function returns "ospf6".
* ospfd.h: Remove extern struct message ospf_redistributed_proto[],
and add extern const char *ospf_redist_string(u_int route_type)
instead.
* ospf_asbr.c: (ospf_external_info_add) In two messages, use
ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).
* ospf_vty.c: Remove local hard-coded table distribute_str.
(config_write_ospf_redistribute,config_write_ospf_distribute): Use
new library function zebra_route_string() instead of distribute_str[].
* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,
ospf_redistribute_default_set,ospf_redistribute_check)
In debug messages, use ospf_redist_string() instead of
LOOKUP(ospf_redistributed_proto).
* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded
table str[]. Replace str[] with calls to new library function
zebra_route_string().
* ripd.c: Remove local hard-coded table route_info[].
(show_ip_rip) Replace uses of str[] with calls to new library
functions zebra_route_char and zebra_route_string.
* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded
table str[]. Replace str[i] with new library function
zebra_route_string(i).
* ripngd.c: Remove local hard-coded table route_info[].
(show_ipv6_ripng) Use new library function zebra_route_char() instead
of table route_info[].
2005-10-01 19:38:06 +02:00
|
|
|
zebra_route_string(i), rip->route_map[i].metric,
|
2002-12-13 21:15:29 +01:00
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (rip->route_map[i].name)
|
|
|
|
vty_out (vty, " redistribute %s route-map %s%s",
|
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* zebra.h: Declare new functions zebra_route_string() and
zebra_route_char().
* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New
functions to map zebra route numbers to strings.
* zebra_vty.c: (route_type_str) Remove obsolete function: use new
library function zebra_route_string() instead. Note that there
are a few differences: for IPv6 routes, we now get "ripng" and
"ospf6" instead of the old behavior ("rip" and "ospf").
(route_type_char) Remove obsolete function: ues new library function
zebra_route_char() instead. Note that there is one difference:
the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route,
whereas the new one returns 'X'.
(vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace
route_type_str() with zebra_route_string().
(vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()
with zebra_route_char().
* bgp_vty.c: (bgp_config_write_redistribute) Use new library function
zebra_route_string instead of a local hard-coded table.
* ospf6_asbr.c: Remove local hard-coded tables zroute_name and
zroute_abname. Change the ZROUTE_NAME macro to use new library
function zebra_route_string(). Remove the ZROUTE_ABNAME macro.
(ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with
a call to zebra_route_char(), and be sure to fix the format string,
since we now have a char instead of a char *.
* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and
zebra_route_abname. Note that the zebra_route_name[] table
contained mixed-case strings, whereas the zebra_route_string()
function returns lower-case strings.
(ospf6_zebra_read_ipv6): Change debug message to use new library
function zebra_route_string() instead of zebra_route_name[].
(show_zebra): Use new library function zebra_route_string() instead
of zebra_route_name[].
* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.
(ospf_redist_string) New function implemented using new library
function zebra_route_string(). Note that there are a few differences
in the output that will result: the new function returns strings
that are lower-case, whereas the old table was mixed case. Also,
the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the
new function returns "ospf6".
* ospfd.h: Remove extern struct message ospf_redistributed_proto[],
and add extern const char *ospf_redist_string(u_int route_type)
instead.
* ospf_asbr.c: (ospf_external_info_add) In two messages, use
ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).
* ospf_vty.c: Remove local hard-coded table distribute_str.
(config_write_ospf_redistribute,config_write_ospf_distribute): Use
new library function zebra_route_string() instead of distribute_str[].
* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,
ospf_redistribute_default_set,ospf_redistribute_check)
In debug messages, use ospf_redist_string() instead of
LOOKUP(ospf_redistributed_proto).
* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded
table str[]. Replace str[] with calls to new library function
zebra_route_string().
* ripd.c: Remove local hard-coded table route_info[].
(show_ip_rip) Replace uses of str[] with calls to new library
functions zebra_route_char and zebra_route_string.
* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded
table str[]. Replace str[i] with new library function
zebra_route_string(i).
* ripngd.c: Remove local hard-coded table route_info[].
(show_ipv6_ripng) Use new library function zebra_route_char() instead
of table route_info[].
2005-10-01 19:38:06 +02:00
|
|
|
zebra_route_string(i), rip->route_map[i].name,
|
2002-12-13 21:15:29 +01:00
|
|
|
VTY_NEWLINE);
|
|
|
|
else
|
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* zebra.h: Declare new functions zebra_route_string() and
zebra_route_char().
* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New
functions to map zebra route numbers to strings.
* zebra_vty.c: (route_type_str) Remove obsolete function: use new
library function zebra_route_string() instead. Note that there
are a few differences: for IPv6 routes, we now get "ripng" and
"ospf6" instead of the old behavior ("rip" and "ospf").
(route_type_char) Remove obsolete function: ues new library function
zebra_route_char() instead. Note that there is one difference:
the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route,
whereas the new one returns 'X'.
(vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace
route_type_str() with zebra_route_string().
(vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()
with zebra_route_char().
* bgp_vty.c: (bgp_config_write_redistribute) Use new library function
zebra_route_string instead of a local hard-coded table.
* ospf6_asbr.c: Remove local hard-coded tables zroute_name and
zroute_abname. Change the ZROUTE_NAME macro to use new library
function zebra_route_string(). Remove the ZROUTE_ABNAME macro.
(ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with
a call to zebra_route_char(), and be sure to fix the format string,
since we now have a char instead of a char *.
* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and
zebra_route_abname. Note that the zebra_route_name[] table
contained mixed-case strings, whereas the zebra_route_string()
function returns lower-case strings.
(ospf6_zebra_read_ipv6): Change debug message to use new library
function zebra_route_string() instead of zebra_route_name[].
(show_zebra): Use new library function zebra_route_string() instead
of zebra_route_name[].
* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.
(ospf_redist_string) New function implemented using new library
function zebra_route_string(). Note that there are a few differences
in the output that will result: the new function returns strings
that are lower-case, whereas the old table was mixed case. Also,
the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the
new function returns "ospf6".
* ospfd.h: Remove extern struct message ospf_redistributed_proto[],
and add extern const char *ospf_redist_string(u_int route_type)
instead.
* ospf_asbr.c: (ospf_external_info_add) In two messages, use
ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).
* ospf_vty.c: Remove local hard-coded table distribute_str.
(config_write_ospf_redistribute,config_write_ospf_distribute): Use
new library function zebra_route_string() instead of distribute_str[].
* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,
ospf_redistribute_default_set,ospf_redistribute_check)
In debug messages, use ospf_redist_string() instead of
LOOKUP(ospf_redistributed_proto).
* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded
table str[]. Replace str[] with calls to new library function
zebra_route_string().
* ripd.c: Remove local hard-coded table route_info[].
(show_ip_rip) Replace uses of str[] with calls to new library
functions zebra_route_char and zebra_route_string.
* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded
table str[]. Replace str[i] with new library function
zebra_route_string(i).
* ripngd.c: Remove local hard-coded table route_info[].
(show_ipv6_ripng) Use new library function zebra_route_char() instead
of table route_info[].
2005-10-01 19:38:06 +02:00
|
|
|
vty_out (vty, " redistribute %s%s", zebra_route_string(i),
|
2002-12-13 21:15:29 +01:00
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* zebra.h: Declare new functions zebra_route_string() and
zebra_route_char().
* log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New
functions to map zebra route numbers to strings.
* zebra_vty.c: (route_type_str) Remove obsolete function: use new
library function zebra_route_string() instead. Note that there
are a few differences: for IPv6 routes, we now get "ripng" and
"ospf6" instead of the old behavior ("rip" and "ospf").
(route_type_char) Remove obsolete function: ues new library function
zebra_route_char() instead. Note that there is one difference:
the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route,
whereas the new one returns 'X'.
(vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace
route_type_str() with zebra_route_string().
(vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char()
with zebra_route_char().
* bgp_vty.c: (bgp_config_write_redistribute) Use new library function
zebra_route_string instead of a local hard-coded table.
* ospf6_asbr.c: Remove local hard-coded tables zroute_name and
zroute_abname. Change the ZROUTE_NAME macro to use new library
function zebra_route_string(). Remove the ZROUTE_ABNAME macro.
(ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with
a call to zebra_route_char(), and be sure to fix the format string,
since we now have a char instead of a char *.
* ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and
zebra_route_abname. Note that the zebra_route_name[] table
contained mixed-case strings, whereas the zebra_route_string()
function returns lower-case strings.
(ospf6_zebra_read_ipv6): Change debug message to use new library
function zebra_route_string() instead of zebra_route_name[].
(show_zebra): Use new library function zebra_route_string() instead
of zebra_route_name[].
* ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto.
(ospf_redist_string) New function implemented using new library
function zebra_route_string(). Note that there are a few differences
in the output that will result: the new function returns strings
that are lower-case, whereas the old table was mixed case. Also,
the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the
new function returns "ospf6".
* ospfd.h: Remove extern struct message ospf_redistributed_proto[],
and add extern const char *ospf_redist_string(u_int route_type)
instead.
* ospf_asbr.c: (ospf_external_info_add) In two messages, use
ospf_redist_string instead of LOOKUP(ospf_redistributed_proto).
* ospf_vty.c: Remove local hard-coded table distribute_str.
(config_write_ospf_redistribute,config_write_ospf_distribute): Use
new library function zebra_route_string() instead of distribute_str[].
* ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset,
ospf_redistribute_default_set,ospf_redistribute_check)
In debug messages, use ospf_redist_string() instead of
LOOKUP(ospf_redistributed_proto).
* rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded
table str[]. Replace str[] with calls to new library function
zebra_route_string().
* ripd.c: Remove local hard-coded table route_info[].
(show_ip_rip) Replace uses of str[] with calls to new library
functions zebra_route_char and zebra_route_string.
* ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded
table str[]. Replace str[i] with new library function
zebra_route_string(i).
* ripngd.c: Remove local hard-coded table route_info[].
(show_ipv6_ripng) Use new library function zebra_route_char() instead
of table route_info[].
2005-10-01 19:38:06 +02:00
|
|
|
vty_out (vty, " %s", zebra_route_string(i));
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Zebra node structure. */
|
2008-12-01 20:10:34 +01:00
|
|
|
static struct cmd_node zebra_node =
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
ZEBRA_NODE,
|
|
|
|
"%s(config-router)# ",
|
|
|
|
};
|
|
|
|
|
|
|
|
void
|
2015-09-23 22:26:56 +02:00
|
|
|
rip_zclient_init (struct thread_master *master)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
/* Set default value to the zebra client structure. */
|
2015-09-23 22:26:56 +02:00
|
|
|
zclient = zclient_new(master);
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
zclient_init (zclient, ZEBRA_ROUTE_RIP, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
zclient->interface_add = rip_interface_add;
|
|
|
|
zclient->interface_delete = rip_interface_delete;
|
|
|
|
zclient->interface_address_add = rip_interface_address_add;
|
|
|
|
zclient->interface_address_delete = rip_interface_address_delete;
|
|
|
|
zclient->ipv4_route_add = rip_zebra_read_ipv4;
|
|
|
|
zclient->ipv4_route_delete = rip_zebra_read_ipv4;
|
|
|
|
zclient->interface_up = rip_interface_up;
|
|
|
|
zclient->interface_down = rip_interface_down;
|
2015-10-21 06:38:38 +02:00
|
|
|
zclient->redistribute_route_ipv4_add = rip_zebra_read_ipv4;
|
|
|
|
zclient->redistribute_route_ipv4_del = rip_zebra_read_ipv4;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Install zebra node. */
|
|
|
|
install_node (&zebra_node, config_write_zebra);
|
|
|
|
|
|
|
|
/* Install command elements to zebra node. */
|
|
|
|
install_element (CONFIG_NODE, &router_zebra_cmd);
|
|
|
|
install_element (CONFIG_NODE, &no_router_zebra_cmd);
|
|
|
|
install_default (ZEBRA_NODE);
|
|
|
|
install_element (ZEBRA_NODE, &rip_redistribute_rip_cmd);
|
|
|
|
install_element (ZEBRA_NODE, &no_rip_redistribute_rip_cmd);
|
|
|
|
|
|
|
|
/* Install command elements to rip node. */
|
|
|
|
install_element (RIP_NODE, &rip_redistribute_type_cmd);
|
|
|
|
install_element (RIP_NODE, &rip_redistribute_type_routemap_cmd);
|
|
|
|
install_element (RIP_NODE, &rip_redistribute_type_metric_cmd);
|
2003-05-25 16:49:19 +02:00
|
|
|
install_element (RIP_NODE, &rip_redistribute_type_metric_routemap_cmd);
|
2002-12-13 21:15:29 +01:00
|
|
|
install_element (RIP_NODE, &no_rip_redistribute_type_cmd);
|
|
|
|
install_element (RIP_NODE, &no_rip_redistribute_type_routemap_cmd);
|
|
|
|
install_element (RIP_NODE, &no_rip_redistribute_type_metric_cmd);
|
|
|
|
install_element (RIP_NODE, &no_rip_redistribute_type_metric_routemap_cmd);
|
|
|
|
install_element (RIP_NODE, &rip_default_information_originate_cmd);
|
|
|
|
install_element (RIP_NODE, &no_rip_default_information_originate_cmd);
|
|
|
|
}
|