Skip to content

Commit

Permalink
sharpd: Add Super Happy Advanced Routing Protocol
Browse files Browse the repository at this point in the history
Add a daemon that will allow us to test the zapi
as well as test route install/removal times from
the kernel.

The current commands are:

install route <starting ip address> nexthop <nexthop> (1-1000000)

This command starts installing at <starting ip address>/32
(1-100000) routes that it auto-increments by 1
Installation start time is noted in the log and finish
time is noted as well.

remove routes <starting ip address> (1-1000000)

This command removes routes at <starting ip address>/32
and removes (1-100000) routes created by the install route
command.

This code can be considered experimental and *is not*
something that should be run in a production environment.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
  • Loading branch information
donaldsharp committed Nov 27, 2017
1 parent ca89087 commit 8a71d93
Show file tree
Hide file tree
Showing 22 changed files with 591 additions and 4 deletions.
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ include nhrpd/subdir.am
include ldpd/subdir.am
include babeld/subdir.am
include eigrpd/subdir.am
include sharpd/subdir.am
include pimd/subdir.am

SUBDIRS = . @LIBRFP@ @RFPTEST@ \
Expand Down
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ else
fi
fi
AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
AM_CONDITIONAL([SHARPD], [test "x$enable_dev_build" = "xyes"])

dnl always want these CFLAGS
AC_C_FLAG([-fno-omit-frame-pointer])
Expand Down
4 changes: 4 additions & 0 deletions lib/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -1045,6 +1045,8 @@ int proto_redistnum(int afi, const char *s)
return ZEBRA_ROUTE_NHRP;
else if (strmatch(s, "babel"))
return ZEBRA_ROUTE_BABEL;
else if (strmatch(s, "sharp"))
return ZEBRA_ROUTE_SHARP;
}
if (afi == AFI_IP6) {
if (strmatch(s, "kernel"))
Expand All @@ -1071,6 +1073,8 @@ int proto_redistnum(int afi, const char *s)
return ZEBRA_ROUTE_NHRP;
else if (strmatch(s, "babel"))
return ZEBRA_ROUTE_BABEL;
else if (strmatch(s, "sharp"))
return ZEBRA_ROUTE_SHARP;
}
return -1;
}
Expand Down
2 changes: 2 additions & 0 deletions lib/route_types.txt
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ ZEBRA_ROUTE_BGP_DIRECT, bgp-direct, NULL, 'b', 0, 0, "BGP-Direct"
# bgp unicast -> vnc
ZEBRA_ROUTE_BGP_DIRECT_EXT, bgp-direct-to-nve-groups, NULL, 'e', 0, 0, "BGP2VNC"
ZEBRA_ROUTE_BABEL, babel, babeld, 'A', 1, 1, "Babel"
ZEBRA_ROUTE_SHARP, sharp, sharpd, 'D', 1, 1, "SHARP"
ZEBRA_ROUTE_ALL, wildcard, none, '-', 0, 0, "-"


Expand All @@ -101,3 +102,4 @@ ZEBRA_ROUTE_TABLE, "Non-main Kernel Routing Table"
ZEBRA_ROUTE_LDP, "Label Distribution Protocol (LDP)"
ZEBRA_ROUTE_VNC_DIRECT, "VNC direct (not via zebra) routes"
ZEBRA_ROUTE_BABEL, "Babel routing protocol (Babel)"
ZEBRA_ROUTE_SHARP, "Super Happy Advanced Routing Protocol (sharpd)"
2 changes: 2 additions & 0 deletions redhat/daemons
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ pimd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
#
# Command line options for the daemons
#
Expand All @@ -64,6 +65,7 @@ pimd_options=("-A 127.0.0.1")
nhrpd_options=("-A 127.0.0.1")
eigrpd_options=("-A 127.0.0.1")
babeld_options=("-A 127.0.0.1")
sharpd_options=("-A 127.0.0.1")

#
# If the vtysh_enable is yes, then the unified config is read
Expand Down
162 changes: 162 additions & 0 deletions sharpd/sharp_main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/*
* SHARP - main code
* Copyright (C) Cumulus Networks, Inc.
* Donald Sharp
*
* This file is part of FRR.
*
* FRR 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.
*
* FRR 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 this program; see the file COPYING; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>

#include <lib/version.h>
#include "getopt.h"
#include "thread.h"
#include "prefix.h"
#include "linklist.h"
#include "if.h"
#include "vector.h"
#include "vty.h"
#include "command.h"
#include "filter.h"
#include "plist.h"
#include "stream.h"
#include "log.h"
#include "memory.h"
#include "privs.h"
#include "sigevent.h"
#include "zclient.h"
#include "keychain.h"
#include "distribute.h"
#include "libfrr.h"
#include "routemap.h"

#include "sharp_zebra.h"
#include "sharp_vty.h"

uint32_t total_routes = 0;
uint32_t installed_routes = 0;
uint32_t removed_routes = 0;

zebra_capabilities_t _caps_p[] = {
ZCAP_NET_RAW, ZCAP_BIND, ZCAP_NET_ADMIN,
};

struct zebra_privs_t sharp_privs = {
#if defined(FRR_USER) && defined(FRR_GROUP)
.user = FRR_USER,
.group = FRR_GROUP,
#endif
#if defined(VTY_GROUP)
.vty_group = VTY_GROUP,
#endif
.caps_p = _caps_p,
.cap_num_p = array_size(_caps_p),
.cap_num_i = 0};

struct option longopts[] = {{0}};

/* Master of threads. */
struct thread_master *master;

/* SIGHUP handler. */
static void sighup(void)
{
zlog_info("SIGHUP received");
}

/* SIGINT / SIGTERM handler. */
static void sigint(void)
{
zlog_notice("Terminating on signal");

exit(0);
}

/* SIGUSR1 handler. */
static void sigusr1(void)
{
zlog_rotate();
}

struct quagga_signal_t sharp_signals[] = {
{
.signal = SIGHUP,
.handler = &sighup,
},
{
.signal = SIGUSR1,
.handler = &sigusr1,
},
{
.signal = SIGINT,
.handler = &sigint,
},
{
.signal = SIGTERM,
.handler = &sigint,
},
};

#define SHARP_VTY_PORT 2614

FRR_DAEMON_INFO(sharpd, SHARP, .vty_port = SHARP_VTY_PORT,

.proghelp = "Implementation of a Sharp of routes daemon.",

.signals = sharp_signals,
.n_signals = array_size(sharp_signals),

.privs = &sharp_privs, )

extern void sharp_vty_init(void);

int main(int argc, char **argv, char **envp)
{
frr_preinit(&sharpd_di, argc, argv);
frr_opt_add("", longopts, "");

while (1) {
int opt;

opt = frr_getopt(argc, argv, NULL);

if (opt == EOF)
break;

switch (opt) {
case 0:
break;
default:
frr_help_exit(1);
break;
}
}

master = frr_init();

vrf_init(NULL, NULL, NULL, NULL);

sharp_zebra_init();

/* Get configuration file. */
sharp_vty_init();

frr_config_fork();
frr_run(master);

/* Not reached. */
return 0;
}
114 changes: 114 additions & 0 deletions sharpd/sharp_vty.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* SHARP - vty code
* Copyright (C) Cumulus Networks, Inc.
* Donald Sharp
*
* This file is part of FRR.
*
* FRR 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.
*
* FRR 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 this program; see the file COPYING; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>

#include "vty.h"
#include "command.h"
#include "prefix.h"
#include "nexthop.h"
#include "log.h"

#include "sharpd/sharp_zebra.h"
#include "sharpd/sharp_vty.h"
#include "sharpd/sharp_vty_clippy.c"

extern uint32_t total_routes;
extern uint32_t installed_routes;
extern uint32_t removed_routes;

DEFPY (install_routes,
install_routes_cmd,
"install routes A.B.C.D$start nexthop A.B.C.D$nexthop (1-1000000)$routes",
"install some routes\n"
"Routes to install\n"
"Address to start /32 generation at\n"
"Nexthop to use\n"
"Nexthop address\n"
"How many to create\n")
{
int i;
struct prefix p;
struct nexthop nhop;
uint32_t temp;

total_routes = routes;
installed_routes = 0;

memset(&p, 0, sizeof(p));
memset(&nhop, 0, sizeof(nhop));

p.family = AF_INET;
p.prefixlen = 32;
p.u.prefix4 = start;

nhop.gate.ipv4 = nexthop;
nhop.type = NEXTHOP_TYPE_IPV4;

zlog_debug("Inserting %ld routes", routes);

temp = ntohl(p.u.prefix4.s_addr);
for (i = 0 ; i < routes ; i++) {
route_add(&p, &nhop);
p.u.prefix4.s_addr = htonl(++temp);
}

return CMD_SUCCESS;
}

DEFPY (remove_routes,
remove_routes_cmd,
"remove routes A.B.C.D$start (1-1000000)$routes",
"Remove some routes\n"
"Routes to remove\n"
"Starting spot\n"
"Routes to uniinstall\n")
{
int i;
struct prefix p;
uint32_t temp;

total_routes = routes;
removed_routes = 0;

memset(&p, 0, sizeof(p));

p.family = AF_INET;
p.prefixlen = 32;
p.u.prefix4 = start;

zlog_debug("Removing %ld routes", routes);

temp = ntohl(p.u.prefix4.s_addr);
for (i = 0; i < routes ; i++) {
route_delete(&p);
p.u.prefix4.s_addr = htonl(++temp);
}

return CMD_SUCCESS;
}

void sharp_vty_init(void)
{
install_element(ENABLE_NODE, &install_routes_cmd);
install_element(ENABLE_NODE, &remove_routes_cmd);
return;
}
26 changes: 26 additions & 0 deletions sharpd/sharp_vty.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* VTY library for SHARP
* Copyright (C) Cumulus Networks, Inc.
* Donald Sharp
*
* This file is part of FRR.
*
* FRR 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.
*
* FRR 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 this program; see the file COPYING; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __SHARP_VTY_H__
#define __SHARP_VTY_H__

extern void sharp_vty_init(void);
#endif
Loading

0 comments on commit 8a71d93

Please sign in to comment.