| /* |
| * $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; |
| } |