blob: 75c8867739cec2441f6fb38cbad22ec7de035de6 [file] [log] [blame]
/*
* $Quagga: $Format:%an, %ai, %h$ $
*
* GNU Zebra client test main routine.
* Copyright (C) 1997 Kunihiro Ishiguro
*
* 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 "prefix.h"
#include "stream.h"
#include "zclient.h"
#include "thread.h"
#include "table.h"
#include "zebra/rib.h"
#include "zebra/zserv.h"
struct thread *master;
/* Zebra client structure. */
struct zclient *zclient = NULL;
/* Zebra socket. */
int sock;
/* IPv4 route add and delete test. */
void
zebra_test_ipv4 (int command, int type, char *prefix, char *gateway,
u_char distance)
{
struct zapi_ipv4 api;
struct prefix_ipv4 p;
struct in_addr gate;
struct in_addr *gpnt;
str2prefix_ipv4 (prefix, &p);
inet_aton (gateway, &gate);
gpnt = &gate;
api.vrf_id = VRF_DEFAULT;
api.type = type;
api.flags = 0;
api.message = 0;
SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
api.nexthop_num = 1;
api.nexthop = &gpnt;
api.ifindex_num = 0;
if (distance)
{
SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
api.distance = distance;
}
switch (command)
{
case ZEBRA_IPV4_ROUTE_ADD:
zapi_ipv4_add (zclient, &p, &api);
break;
case ZEBRA_IPV4_ROUTE_DELETE:
zapi_ipv4_delete (zclient, &p, &api);
break;
}
}
#ifdef HAVE_IPV6
/* IPv6 route add and delete test. */
void
zebra_test_v6 (int sock)
{
struct prefix_ipv6 p;
struct in6_addr nexthop;
str2prefix_ipv6 ("3ffe:506::2/128", &p);
inet_pton (AF_INET6, "::1", &nexthop);
/* zebra_ipv6_add (sock, ZEBRA_ROUTE_STATIC, 0, &p, &nexthop, 1); */
sleep (5);
/* zebra_ipv6_delete (sock, ZEBRA_ROUTE_STATIC, 0, &p, &nexthop, 1); */
}
#endif /* HAVE_IPV6 */
/* Print out usage and exit. */
void
usage_exit ()
{
fprintf (stderr, "Usage: client filename\n");
exit (1);
}
struct zebra_info
{
char *str;
int type;
} zebra_type[] =
{
{ "static", ZEBRA_ROUTE_STATIC },
{ "rip", ZEBRA_ROUTE_RIP },
{ "ripng", ZEBRA_ROUTE_RIPNG },
{ "babel", ZEBRA_ROUTE_BABEL },
{ "ospf", ZEBRA_ROUTE_OSPF },
{ "ospf6", ZEBRA_ROUTE_OSPF6 },
{ "bgp", ZEBRA_ROUTE_BGP },
{ "nhrp", ZEBRA_ROUTE_NHRP },
{ NULL, 0 }
};
/* Zebra route simulator. */
void
zebra_sim (FILE *fp)
{
char buf[BUFSIZ];
char distance_str[BUFSIZ];
u_char distance;
while (fgets (buf, sizeof buf, fp))
{
int i;
int ret;
int type;
char str[BUFSIZ], command[BUFSIZ], prefix[BUFSIZ], gateway[BUFSIZ];
distance = 0;
if (*buf == '#')
continue;
type = ZEBRA_ROUTE_STATIC;
ret = sscanf (buf, "%s %s %s %s %s\n", command, str, prefix, gateway,
distance_str);
if (ret == 5)
{
distance = atoi (distance_str);
}
else
{
ret = sscanf (buf, "%s %s %s %s\n", command, str, prefix, gateway);
if (ret != 4)
continue;
}
for (i = 0; i < 10; i++)
{
if (!zebra_type[i].str)
break;
if (strcmp (zebra_type[i].str, str) == 0)
{
type = zebra_type[i].type;
break;
}
}
if (strcmp (command, "add") == 0)
{
zebra_test_ipv4 (ZEBRA_IPV4_ROUTE_ADD, type, prefix, gateway,
distance);
printf ("%s", buf);
continue;
}
if (strcmp (command, "del") == 0)
{
zebra_test_ipv4 (ZEBRA_IPV4_ROUTE_DELETE, type, prefix, gateway,
distance);
printf ("%s", buf);
continue;
}
}
}
/* Test zebra client main routine. */
int
main (int argc, char **argv)
{
struct thread_master *master;
FILE *fp;
if (argc == 1)
usage_exit ();
master = thread_master_create ();
/* Establish connection to zebra. */
zclient = zclient_new (master);
zclient->enable = 1;
#ifdef HAVE_TCP_ZEBRA
zclient->sock = zclient_socket ();
#else
zclient->sock = zclient_socket_un (ZEBRA_SERV_PATH);
#endif /* HAVE_TCP_ZEBRA */
/* Open simulation file. */
fp = fopen (argv[1], "r");
if (fp == NULL)
{
fprintf (stderr, "can't open %s\n", argv[1]);
exit (1);
}
/* Do main work. */
zebra_sim (fp);
sleep (100);
fclose (fp);
close (sock);
return 0;
}