Browse Source

babeld: Remove babeld from Quagga

This commit removes babeld from Quagga because the Quagga project is unable
to meet the wishes of the babeld authors.
Paul Jakma 4 years ago
parent
commit
336724d628

+ 2 - 2
Makefile.am

@@ -1,10 +1,10 @@
 ## Process this file with automake to produce Makefile.in.
 
-SUBDIRS = lib @ZEBRA@ @BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ @BABELD@ \
+SUBDIRS = lib @ZEBRA@ @BGPD@ @RIPD@ @RIPNGD@ @OSPFD@ @OSPF6D@ \
          @ISISD@ @PIMD@ @WATCHQUAGGA@ @VTYSH@ @OSPFCLIENT@ @DOC@ m4 @pkgsrcdir@ \
          redhat @SOLARIS@ tests
 
-DIST_SUBDIRS = lib zebra bgpd ripd ripngd ospfd ospf6d babeld \
+DIST_SUBDIRS = lib zebra bgpd ripd ripngd ospfd ospf6d \
 	  isisd watchquagga vtysh ospfclient doc m4 pkgsrc redhat tests \
 	  solaris pimd
 

+ 0 - 7
babeld/.gitignore

@@ -1,7 +0,0 @@
-*
-!*.c
-!*.h
-!LICENCE
-!Makefile.am
-!babeld.conf.sample
-!.gitignore

+ 0 - 36
babeld/LICENCE

@@ -1,36 +0,0 @@
-Code in this directory is made available under the following licence:
-
-  ---------------------------------------------------------------------------
-  Copyright (c) 2007, 2008 by Juliusz Chroboczek
-  
-  Permission is hereby granted, free of charge, to any person obtaining a copy
-  of this software and associated documentation files (the "Software"), to deal
-  in the Software without restriction, including without limitation the rights
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-  copies of the Software, and to permit persons to whom the Software is
-  furnished to do so, subject to the following conditions:
-  
-  The above copyright notice and this permission notice shall be included in
-  all copies or substantial portions of the Software.
-  
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-  THE SOFTWARE.
-  ---------------------------------------------------------------------------
-
-The code also makes calls to and links with the "libzebra" code of Quagga,
-in the lib/ directory of this project, which is subject to the GPL licence
-as given in the top-level COPYING file included with Quagga.
-
-Contributors to the code in babeld/ are asked to make their work available
-under the same MIT/X11 licence as given immediately above.  Please indicate
-your assent to this by updating this file and appending the appropriate
-
-  Copyright <year> <Author name>, <author contact details>
-
-line to the existing copyright assertion lines in the MIT/X11 licence text
-above in this file.

+ 0 - 29
babeld/Makefile.am

@@ -1,29 +0,0 @@
-## Process this file with automake to produce Makefile.in.
-
-AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib
-DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\"
-INSTALL_SDATA=@INSTALL@ -m 600
-
-AM_CFLAGS = $(PICFLAGS) $(WERROR)
-AM_LDFLAGS = $(PILDFLAGS)
-
-noinst_LIBRARIES = libbabel.a
-sbin_PROGRAMS = babeld
-
-libbabel_a_SOURCES = \
-	babel_zebra.c net.c kernel.c util.c source.c neighbour.c	\
-	route.c xroute.c message.c resend.c babel_interface.c babeld.c	\
-	babel_filter.c
-
-noinst_HEADERS = \
-	babel_zebra.h net.h kernel.h util.h source.h neighbour.h	\
-	route.h xroute.h message.h resend.h babel_interface.h babeld.h	\
-	babel_filter.h babel_main.h
-
-babeld_SOURCES = \
-	babel_main.c $(libbabel_a_SOURCES)
-
-babeld_LDADD = ../lib/libzebra.la @LIBCAP@
-
-examplesdir = $(exampledir)
-dist_examples_DATA = babeld.conf.sample

+ 0 - 124
babeld/babel_filter.c

@@ -1,124 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include "babel_filter.h"
-#include "vty.h"
-#include "filter.h"
-#include "log.h"
-#include "plist.h"
-#include "distribute.h"
-#include "util.h"
-
-int
-babel_filter(int output, const unsigned char *prefix, unsigned short plen,
-             unsigned int ifindex)
-{
-    struct interface *ifp = if_lookup_by_index(ifindex);
-    babel_interface_nfo *babel_ifp = ifp ? babel_get_if_nfo(ifp) : NULL;
-    struct prefix p;
-    struct distribute *dist;
-    struct access_list *alist;
-    struct prefix_list *plist;
-    int filter = output ? BABEL_FILTER_OUT : BABEL_FILTER_IN;
-    int distribute = output ? DISTRIBUTE_OUT : DISTRIBUTE_IN;
-
-    p.family = v4mapped(prefix) ? AF_INET : AF_INET6;
-    p.prefixlen = v4mapped(prefix) ? plen - 96 : plen;
-    if (p.family == AF_INET)
-        uchar_to_inaddr(&p.u.prefix4, prefix);
-    else
-        uchar_to_in6addr(&p.u.prefix6, prefix);
-
-    if (babel_ifp != NULL && babel_ifp->list[filter]) {
-        if (access_list_apply (babel_ifp->list[filter], &p)
-            == FILTER_DENY) {
-            debugf(BABEL_DEBUG_FILTER,
-                   "%s/%d filtered by distribute in",
-                   p.family == AF_INET ?
-                   inet_ntoa(p.u.prefix4) :
-                   inet6_ntoa (p.u.prefix6),
-                   p.prefixlen);
-            return INFINITY;
-	}
-    }
-    if (babel_ifp != NULL && babel_ifp->prefix[filter]) {
-        if (prefix_list_apply (babel_ifp->prefix[filter], &p)
-            == PREFIX_DENY) {
-            debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
-                        p.family == AF_INET ?
-                        inet_ntoa(p.u.prefix4) :
-                        inet6_ntoa (p.u.prefix6),
-                        p.prefixlen);
-            return INFINITY;
-	}
-    }
-
-    /* All interface filter check. */
-    dist = distribute_lookup (NULL);
-    if (dist) {
-        if (dist->list[distribute]) {
-            alist = access_list_lookup (AFI_IP6, dist->list[distribute]);
-
-            if (alist) {
-                if (access_list_apply (alist, &p) == FILTER_DENY) {
-                    debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
-                                p.family == AF_INET ?
-                                inet_ntoa(p.u.prefix4) :
-                                inet6_ntoa (p.u.prefix6),
-                                p.prefixlen);
-                    return INFINITY;
-		}
-	    }
-	}
-        if (dist->prefix[distribute]) {
-            plist = prefix_list_lookup (AFI_IP6, dist->prefix[distribute]);
-            if (plist) {
-                if (prefix_list_apply (plist, &p) == PREFIX_DENY) {
-                    debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
-                                p.family == AF_INET ?
-                                inet_ntoa(p.u.prefix4) :
-                                inet6_ntoa (p.u.prefix6),
-                                p.prefixlen);
-                    return INFINITY;
-		}
-	    }
-	}
-    }
-    return 0;
-}

+ 0 - 49
babeld/babel_filter.h

@@ -1,49 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef BABELD_BABEL_FILTER_H
-#define BABELD_BABEL_FILTER_H
-
-#include <zebra.h>
-#include "prefix.h"
-#include "babel_interface.h"
-
-int babel_filter(int output, const unsigned char *prefix, unsigned short plen,
-                 unsigned int index);
-
-#endif /* BABELD_BABEL_FILTER_H */

File diff suppressed because it is too large
+ 0 - 1022
babeld/babel_interface.c


+ 0 - 152
babeld/babel_interface.h

@@ -1,152 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef BABEL_INTERFACE_H
-#define BABEL_INTERFACE_H
-
-#include <zebra.h>
-#include "zclient.h"
-#include "vty.h"
-
-#define CONFIG_DEFAULT 0
-#define CONFIG_NO 1
-#define CONFIG_YES 2
-
-/* babeld interface informations */
-struct babel_interface {
-    unsigned short flags;                     /* see below */
-    unsigned short cost;
-    int channel;
-    struct timeval hello_timeout;
-    struct timeval update_timeout;
-    struct timeval flush_timeout;
-    struct timeval update_flush_timeout;
-    unsigned char *ipv4;
-    int buffered;
-    int bufsize;
-    char have_buffered_hello;
-    char have_buffered_id;
-    char have_buffered_nh;
-    char have_buffered_prefix;
-    unsigned char buffered_id[16];
-    unsigned char buffered_nh[4];
-    unsigned char buffered_prefix[16];
-    unsigned char *sendbuf;
-    struct buffered_update *buffered_updates;
-    int num_buffered_updates;
-    int update_bufsize;
-    time_t bucket_time;
-    unsigned int bucket;
-    time_t last_update_time;
-    unsigned short hello_seqno;
-    unsigned hello_interval;
-    unsigned update_interval;
-
-    /* For filter type slot. */
-#define BABEL_FILTER_IN  0
-#define BABEL_FILTER_OUT 1
-#define BABEL_FILTER_MAX 2
-    struct access_list *list[BABEL_FILTER_MAX];               /* Access-list. */
-    struct prefix_list *prefix[BABEL_FILTER_MAX];             /* Prefix-list. */
-};
-
-typedef struct babel_interface babel_interface_nfo;
-static inline babel_interface_nfo* babel_get_if_nfo(struct interface *ifp)
-{
-    return ((babel_interface_nfo*) ifp->info);
-}
-
-/* babel_interface_nfo flags */
-#define BABEL_IF_IS_UP         (1 << 0)
-#define BABEL_IF_WIRED         (1 << 1)
-#define BABEL_IF_SPLIT_HORIZON (1 << 2)
-#define BABEL_IF_LQ            (1 << 3)
-#define BABEL_IF_FARAWAY       (1 << 4)
-
-/* Only INTERFERING can appear on the wire. */
-#define BABEL_IF_CHANNEL_UNKNOWN 0
-#define BABEL_IF_CHANNEL_INTERFERING 255
-#define BABEL_IF_CHANNEL_NONINTERFERING -2
-
-static inline int
-if_up(struct interface *ifp)
-{
-    return (if_is_operative(ifp) &&
-            ifp->connected != NULL &&
-            (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_UP));
-}
-
-/* types:
- struct interface _ifp, struct listnode node */
-#define FOR_ALL_INTERFACES(_ifp, _node)                                              \
-    for(ALL_LIST_ELEMENTS_RO(iflist, _node, _ifp))
-
-/* types:
- struct interface *ifp, struct connected *_connected, struct listnode *node */
-#define FOR_ALL_INTERFACES_ADDRESSES(ifp, _connected, _node)                   \
-    for(ALL_LIST_ELEMENTS_RO(ifp->connected, _node, _connected))
-
-struct buffered_update {
-    unsigned char id[8];
-    unsigned char prefix[16];
-    unsigned char plen;
-    unsigned char pad[3];
-};
-
-
-/* init function */
-void babel_if_init(void);
-
-/* Callback functions for zebra client */
-int babel_interface_up (int, struct zclient *, zebra_size_t);
-int babel_interface_down (int, struct zclient *, zebra_size_t);
-int babel_interface_add (int, struct zclient *, zebra_size_t);
-int babel_interface_delete (int, struct zclient *, zebra_size_t);
-int babel_interface_address_add (int, struct zclient *, zebra_size_t);
-int babel_interface_address_delete (int, struct zclient *, zebra_size_t);
-
-unsigned jitter(babel_interface_nfo *, int);
-unsigned update_jitter(babel_interface_nfo *babel_ifp, int urgent);
-/* return "true" if "address" is one of our ipv6 addresses */
-int is_interface_ll_address(struct interface *ifp, const unsigned char *address);
-/* Send retraction to all, and reset all interfaces statistics. */
-void babel_interface_close_all(void);
-extern int babel_enable_if_config_write (struct vty *);
-
-
-#endif

+ 0 - 529
babeld/babel_main.c

@@ -1,529 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/* include zebra library */
-#include <zebra.h>
-#include "getopt.h"
-#include "if.h"
-#include "log.h"
-#include "thread.h"
-#include "privs.h"
-#include "sigevent.h"
-#include "version.h"
-#include "command.h"
-#include "vty.h"
-#include "memory.h"
-
-#include "babel_main.h"
-#include "babeld.h"
-#include "util.h"
-#include "kernel.h"
-#include "babel_interface.h"
-#include "neighbour.h"
-#include "route.h"
-#include "xroute.h"
-#include "message.h"
-#include "resend.h"
-#include "babel_zebra.h"
-
-
-static void babel_init (int argc, char **argv);
-static char *babel_get_progname(char *argv_0);
-static void babel_fail(void);
-static void babel_init_random(void);
-static void babel_replace_by_null(int fd);
-static void babel_init_signals(void);
-static void babel_exit_properly(void);
-static void babel_save_state_file(void);
-
-
-struct thread_master *master;     /* quagga's threads handler */
-struct timeval babel_now;         /* current time             */
-
-unsigned char myid[8];            /* unique id (mac address of an interface) */
-int debug = 0;
-
-int resend_delay = -1;
-static const char *pidfile = PATH_BABELD_PID;
-
-const unsigned char zeroes[16] = {0};
-const unsigned char ones[16] =
-    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
-
-static const char *state_file = DAEMON_VTY_DIR "/babel-state";
-
-unsigned char protocol_group[16]; /* babel's link-local multicast address */
-int protocol_port;                /* babel's port */
-int protocol_socket = -1;         /* socket: communicate with others babeld */
-
-static char babel_config_default[] = SYSCONFDIR BABEL_DEFAULT_CONFIG;
-static char *babel_config_file = NULL;
-static char *babel_vty_addr = NULL;
-static int babel_vty_port = BABEL_VTY_PORT;
-
-/* Babeld options. */
-struct option longopts[] =
-{
-    { "daemon",      no_argument,       NULL, 'd'},
-    { "config_file", required_argument, NULL, 'f'},
-    { "pid_file",    required_argument, NULL, 'i'},
-    { "socket",      required_argument, NULL, 'z'},
-    { "help",        no_argument,       NULL, 'h'},
-    { "vty_addr",    required_argument, NULL, 'A'},
-    { "vty_port",    required_argument, NULL, 'P'},
-    { "user",        required_argument, NULL, 'u'},
-    { "group",       required_argument, NULL, 'g'},
-    { "version",     no_argument,       NULL, 'v'},
-    { 0 }
-};
-
-/* babeld privileges */
-static zebra_capabilities_t _caps_p [] =
-{
-    ZCAP_NET_RAW,
-    ZCAP_BIND
-};
-static struct zebra_privs_t babeld_privs =
-{
-#if defined(QUAGGA_USER)
-    .user = QUAGGA_USER,
-#endif
-#if defined QUAGGA_GROUP
-    .group = QUAGGA_GROUP,
-#endif
-#ifdef VTY_GROUP
-    .vty_group = VTY_GROUP,
-#endif
-    .caps_p = _caps_p,
-    .cap_num_p = 2,
-    .cap_num_i = 0
-};
-
-
-int
-main(int argc, char **argv)
-{
-    struct thread thread;
-    /* and print banner too */
-    babel_init(argc, argv);
-    while (thread_fetch (master, &thread)) {
-        thread_call (&thread);
-    }
-    return 0;
-}
-
-static void
-babel_usage (char *progname, int status)
-{
-  if (status != 0)
-    fprintf (stderr, "Try `%s --help' for more information.\n", progname);
-  else
-    {
-      printf ("Usage : %s [OPTION...]\n\
-Daemon which manages Babel routing protocol.\n\n\
--d, --daemon       Runs in daemon mode\n\
--f, --config_file  Set configuration file name\n\
--i, --pid_file     Set process identifier file name\n\
--z, --socket       Set path of zebra socket\n\
--A, --vty_addr     Set vty's bind address\n\
--P, --vty_port     Set vty's port number\n\
--u, --user         User to run as\n\
--g, --group        Group to run as\n\
--v, --version      Print program version\n\
--h, --help         Display this help and exit\n\
-\n\
-Report bugs to %s\n", progname, ZEBRA_BUG_ADDRESS);
-    }
-  exit (status);
-}
-
-/* make initialisations witch don't need infos about kernel(interfaces, etc.) */
-static void
-babel_init(int argc, char **argv)
-{
-    int rc, opt;
-    int do_daemonise = 0;
-    char *progname = NULL;
-
-    /* Set umask before anything for security */
-    umask (0027);
-    progname = babel_get_progname(argv[0]);
-
-    /* set default log (lib/log.h) */
-    zlog_default = openzlog(progname, ZLOG_BABEL,
-                            LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
-    /* set log destination as stdout until the config file is read */
-    zlog_set_level(NULL, ZLOG_DEST_STDOUT, LOG_WARNING);
-
-    babel_init_random();
-
-    /* set the Babel's default link-local multicast address and Babel's port */
-    parse_address("ff02:0:0:0:0:0:1:6", protocol_group, NULL);
-    protocol_port = 6696;
-
-    /* get options */
-    while(1) {
-        opt = getopt_long(argc, argv, "df:i:z:hA:P:u:g:v", longopts, 0);
-        if(opt < 0)
-            break;
-
-        switch(opt) {
-            case 0:
-                break;
-            case 'd':
-                do_daemonise = -1;
-                break;
-            case 'f':
-                babel_config_file = optarg;
-                break;
-            case 'i':
-                pidfile = optarg;
-                break;
-            case 'z':
-                zclient_serv_path_set (optarg);
-                break;
-            case 'A':
-                babel_vty_addr = optarg;
-                break;
-            case 'P':
-                babel_vty_port = atoi (optarg);
-                if (babel_vty_port <= 0 || babel_vty_port > 0xffff)
-                    babel_vty_port = BABEL_VTY_PORT;
-                break;
-            case 'u':
-                babeld_privs.user = optarg;
-                break;
-            case 'g':
-                babeld_privs.group = optarg;
-                break;
-            case 'v':
-                print_version (progname);
-                exit (0);
-                break;
-            case 'h':
-                babel_usage (progname, 0);
-                break;
-            default:
-                babel_usage (progname, 1);
-                break;
-        }
-    }
-
-    /* create the threads handler */
-    master = thread_master_create ();
-
-    /* Library inits. */
-    zprivs_init (&babeld_privs);
-    babel_init_signals();
-    cmd_init (1);
-    vty_init (master);
-    memory_init ();
-
-    resend_delay = BABEL_DEFAULT_RESEND_DELAY;
-
-    babel_replace_by_null(STDIN_FILENO);
-
-    if (do_daemonise && daemonise() < 0) {
-        zlog_err("daemonise: %s", safe_strerror(errno));
-        exit (1);
-    }
-
-    /* write pid file */
-    if (pid_output(pidfile) < 0) {
-        zlog_err("error while writing pidfile");
-        exit (1);
-    };
-
-    /* init some quagga's dependencies, and babeld's commands */
-    babeld_quagga_init();
-    /* init zebra client's structure and it's commands */
-    /* this replace kernel_setup && kernel_setup_socket */
-    babelz_zebra_init ();
-
-    /* Get zebra configuration file. */
-    zlog_set_level (NULL, ZLOG_DEST_STDOUT, ZLOG_DISABLED);
-    vty_read_config (babel_config_file, babel_config_default);
-
-    /* Create VTY socket */
-    vty_serv_sock (babel_vty_addr, babel_vty_port, BABEL_VTYSH_PATH);
-
-    /* init buffer */
-    rc = resize_receive_buffer(1500);
-    if(rc < 0)
-        babel_fail();
-
-    schedule_neighbours_check(5000, 1);
-
-    zlog_notice ("BABELd %s starting: vty@%d", BABEL_VERSION, babel_vty_port);
-}
-
-/* return the progname (without path, example: "./x/progname" --> "progname") */
-static char *
-babel_get_progname(char *argv_0) {
-    char *p = strrchr (argv_0, '/');
-    return (p ? ++p : argv_0);
-}
-
-static void
-babel_fail(void)
-{
-    exit(1);
-}
-
-/* initialize random value, and set 'babel_now' by the way. */
-static void
-babel_init_random(void)
-{
-    gettime(&babel_now);
-    int rc;
-    unsigned int seed;
-
-    rc = read_random_bytes(&seed, sizeof(seed));
-    if(rc < 0) {
-        zlog_err("read(random): %s", safe_strerror(errno));
-        seed = 42;
-    }
-
-    seed ^= (babel_now.tv_sec ^ babel_now.tv_usec);
-    srandom(seed);
-}
-
-/*
- close fd, and replace it by "/dev/null"
- exit if error
- */
-static void
-babel_replace_by_null(int fd)
-{
-    int fd_null;
-    int rc;
-
-    fd_null = open("/dev/null", O_RDONLY);
-    if(fd_null < 0) {
-        zlog_err("open(null): %s", safe_strerror(errno));
-        exit(1);
-    }
-
-    rc = dup2(fd_null, fd);
-    if(rc < 0) {
-        zlog_err("dup2(null, 0): %s", safe_strerror(errno));
-        exit(1);
-    }
-
-    close(fd_null);
-}
-
-/*
- Load the state file: check last babeld's running state, usefull in case of
- "/etc/init.d/babeld restart"
- */
-void
-babel_load_state_file(void)
-{
-    int fd;
-    int rc;
-
-    fd = open(state_file, O_RDONLY);
-    if(fd < 0 && errno != ENOENT)
-        zlog_err("open(babel-state: %s)", safe_strerror(errno));
-    rc = unlink(state_file);
-    if(fd >= 0 && rc < 0) {
-        zlog_err("unlink(babel-state): %s", safe_strerror(errno));
-        /* If we couldn't unlink it, it's probably stale. */
-        close(fd);
-        fd = -1;
-    }
-    if(fd >= 0) {
-        char buf[100];
-        char buf2[100];
-        int s;
-        long t;
-        rc = read(fd, buf, 99);
-        if(rc < 0) {
-            zlog_err("read(babel-state): %s", safe_strerror(errno));
-        } else {
-            buf[rc] = '\0';
-            rc = sscanf(buf, "%99s %d %ld\n", buf2, &s, &t);
-            if(rc == 3 && s >= 0 && s <= 0xFFFF) {
-                unsigned char sid[8];
-                rc = parse_eui64(buf2, sid);
-                if(rc < 0) {
-                    zlog_err("Couldn't parse babel-state.");
-                } else {
-                    struct timeval realnow;
-                    debugf(BABEL_DEBUG_COMMON,
-                           "Got %s %d %ld from babel-state.",
-                           format_eui64(sid), s, t);
-                    gettimeofday(&realnow, NULL);
-                    if(memcmp(sid, myid, 8) == 0)
-                        myseqno = seqno_plus(s, 1);
-                    else
-                        zlog_err("ID mismatch in babel-state. id=%s; old=%s",
-                                 format_eui64(myid),
-                                 format_eui64(sid));
-                }
-            } else {
-                zlog_err("Couldn't parse babel-state.");
-            }
-        }
-        close(fd);
-        fd = -1;
-    }
-}
-
-static void
-babel_sigexit(void)
-{
-    zlog_notice("Terminating on signal");
-
-    babel_exit_properly();
-}
-
-static void
-babel_sigusr1 (void)
-{
-    zlog_rotate (NULL);
-}
-
-static void
-babel_init_signals(void)
-{
-    static struct quagga_signal_t babel_signals[] =
-    {
-        {
-            .signal = SIGUSR1,
-            .handler = &babel_sigusr1,
-        },
-        {
-            .signal = SIGINT,
-            .handler = &babel_sigexit,
-        },
-        {
-            .signal = SIGTERM,
-            .handler = &babel_sigexit,
-        },
-    };
-
-    signal_init (master, array_size(babel_signals), babel_signals);
-}
-
-static void
-babel_exit_properly(void)
-{
-    debugf(BABEL_DEBUG_COMMON, "Exiting...");
-    usleep(roughly(10000));
-    gettime(&babel_now);
-
-    /* Uninstall and flush all routes. */
-    debugf(BABEL_DEBUG_COMMON, "Uninstall routes.");
-    flush_all_routes();
-    babel_interface_close_all();
-    babel_zebra_close_connexion();
-    babel_save_state_file();
-    debugf(BABEL_DEBUG_COMMON, "Remove pid file.");
-    if(pidfile)
-        unlink(pidfile);
-    debugf(BABEL_DEBUG_COMMON, "Done.");
-
-    exit(0);
-}
-
-static void
-babel_save_state_file(void)
-{
-    int fd;
-    int rc;
-
-    debugf(BABEL_DEBUG_COMMON, "Save state file.");
-    fd = open(state_file, O_WRONLY | O_TRUNC | O_CREAT, 0644);
-    if(fd < 0) {
-        zlog_err("creat(babel-state): %s", safe_strerror(errno));
-        unlink(state_file);
-    } else {
-        struct timeval realnow;
-        char buf[100];
-        gettimeofday(&realnow, NULL);
-        rc = snprintf(buf, 100, "%s %d %ld\n",
-                      format_eui64(myid), (int)myseqno,
-                      (long)realnow.tv_sec);
-        if(rc < 0 || rc >= 100) {
-            zlog_err("write(babel-state): overflow.");
-            unlink(state_file);
-        } else {
-            rc = write(fd, buf, rc);
-            if(rc < 0) {
-                zlog_err("write(babel-state): %s", safe_strerror(errno));
-                unlink(state_file);
-            }
-            fsync(fd);
-        }
-        close(fd);
-    }
-}
-
-void
-show_babel_main_configuration (struct vty *vty)
-{
-    vty_out(vty,
-            "pid file                = %s%s"
-            "state file              = %s%s"
-            "configuration file      = %s%s"
-            "protocol informations:%s"
-            "  multicast address     = %s%s"
-            "  port                  = %d%s"
-            "vty address             = %s%s"
-            "vty port                = %d%s"
-            "id                      = %s%s"
-            "allow_duplicates        = %s%s"
-            "kernel_metric           = %d%s",
-            pidfile, VTY_NEWLINE,
-            state_file, VTY_NEWLINE,
-            babel_config_file ? babel_config_file : babel_config_default,
-            VTY_NEWLINE,
-            VTY_NEWLINE,
-            format_address(protocol_group), VTY_NEWLINE,
-            protocol_port, VTY_NEWLINE,
-            babel_vty_addr ? babel_vty_addr : "None",
-            VTY_NEWLINE,
-            babel_vty_port, VTY_NEWLINE,
-            format_eui64(myid), VTY_NEWLINE,
-            format_bool(allow_duplicates), VTY_NEWLINE,
-            kernel_metric, VTY_NEWLINE);
-}

+ 0 - 57
babeld/babel_main.h

@@ -1,57 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include "vty.h"
-
-extern struct timeval babel_now;         /* current time             */
-extern struct thread_master *master;     /* quagga's threads handler */
-extern int debug;
-extern int resend_delay;
-
-extern unsigned char myid[8];
-
-extern const unsigned char zeroes[16], ones[16];
-
-extern int protocol_port;
-extern unsigned char protocol_group[16];
-extern int protocol_socket;
-extern int kernel_socket;
-extern int max_request_hopcount;
-
-void babel_load_state_file(void);
-void show_babel_main_configuration (struct vty *vty);

+ 0 - 378
babeld/babel_zebra.c

@@ -1,378 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/* quagga's includes */
-#include <zebra.h>
-#include "command.h"
-#include "zclient.h"
-#include "stream.h"
-
-/* babel's includes*/
-#include "babel_zebra.h"
-#include "babel_interface.h"
-#include "xroute.h"
-#include "util.h"
-
-void babelz_zebra_init(void);
-
-
-/* we must use a pointer because of zclient.c's functions (new, free). */
-struct zclient *zclient;
-static int zebra_config_write (struct vty *vty);
-
-/* Debug types */
-static struct {
-    int type;
-    int str_min_len;
-    const char *str;
-} debug_type[] = {
-    {BABEL_DEBUG_COMMON,  1, "common"},
-    {BABEL_DEBUG_KERNEL,  1, "kernel"},
-    {BABEL_DEBUG_FILTER,  1, "filter"},
-    {BABEL_DEBUG_TIMEOUT, 1, "timeout"},
-    {BABEL_DEBUG_IF,      1, "interface"},
-    {BABEL_DEBUG_ROUTE,   1, "route"},
-    {BABEL_DEBUG_ALL,     1, "all"},
-    {0, 0, NULL}
-};
-
-/* Zebra node structure. */
-struct cmd_node zebra_node =
-{
-    ZEBRA_NODE,
-    "%s(config-router)# ",
-    1 /* vtysh? yes */
-};
-
-
-/* Zebra route add and delete treatment (ipv6). */
-static int
-babel_zebra_read_ipv6 (int command, struct zclient *zclient,
-		       zebra_size_t length)
-{
-    struct stream *s;
-    struct zapi_ipv6 api;
-    unsigned long ifindex = -1;
-    struct in6_addr nexthop;
-    struct prefix_ipv6 prefix;
-
-    s = zclient->ibuf;
-    ifindex = 0;
-    memset (&nexthop, 0, sizeof (struct in6_addr));
-    memset (&api, 0, sizeof(struct zapi_ipv6));
-    memset (&prefix, 0, sizeof (struct prefix_ipv6));
-
-    /* Type, flags, message. */
-    api.type = stream_getc (s);
-    api.flags = stream_getc (s);
-    api.message = stream_getc (s);
-
-    /* IPv6 prefix. */
-    prefix.family = AF_INET6;
-    prefix.prefixlen = stream_getc (s);
-    stream_get (&prefix.prefix, s, PSIZE (prefix.prefixlen));
-
-    /* Nexthop, ifindex, distance, metric. */
-    if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP)) {
-        api.nexthop_num = stream_getc (s);
-        stream_get (&nexthop, s, sizeof(nexthop));
-    }
-    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);
-    else
-        api.distance = 0;
-    if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
-        api.metric = stream_getl (s);
-    else
-        api.metric = 0;
-
-    if (command == ZEBRA_IPV6_ROUTE_ADD)
-        babel_ipv6_route_add(&api, &prefix, ifindex, &nexthop);
-    else
-        babel_ipv6_route_delete(&api, &prefix, ifindex);
-
-    return 0;
-}
-
-static int
-babel_zebra_read_ipv4 (int command, struct zclient *zclient,
-		       zebra_size_t length)
-{
-    struct stream *s;
-    struct zapi_ipv4 api;
-    unsigned long ifindex = -1;
-    struct in_addr nexthop;
-    struct prefix_ipv4 prefix;
-
-    s = zclient->ibuf;
-    ifindex = 0;
-    memset (&nexthop, 0, sizeof (struct in_addr));
-    memset (&api, 0, sizeof(struct zapi_ipv4));
-    memset (&prefix, 0, sizeof (struct prefix_ipv4));
-
-    /* Type, flags, message. */
-    api.type = stream_getc (s);
-    api.flags = stream_getc (s);
-    api.message = stream_getc (s);
-
-    /* IPv6 prefix. */
-    prefix.family = AF_INET;
-    prefix.prefixlen = stream_getc (s);
-    stream_get (&prefix.prefix, s, PSIZE (prefix.prefixlen));
-
-    /* Nexthop, ifindex, distance, metric. */
-    if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP)) {
-        api.nexthop_num = stream_getc (s);
-        stream_get (&nexthop, s, sizeof(nexthop));
-    }
-    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);
-    else
-        api.distance = 0;
-    if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
-        api.metric = stream_getl (s);
-    else
-        api.metric = 0;
-
-    if (command == ZEBRA_IPV6_ROUTE_ADD) {
-        babel_ipv4_route_add(&api, &prefix, ifindex, &nexthop);
-    } else {
-        babel_ipv4_route_delete(&api, &prefix, ifindex);
-    }
-
-    return 0;
-}
-
-/* [Babel Command] */
-DEFUN (babel_redistribute_type,
-       babel_redistribute_type_cmd,
-       "redistribute " QUAGGA_REDIST_STR_BABELD,
-       "Redistribute\n"
-       QUAGGA_REDIST_HELP_STR_BABELD)
-{
-    int type;
-
-    type = proto_redistnum(AFI_IP6, argv[0]);
-
-    if (type < 0)
-        type = proto_redistnum(AFI_IP, argv[0]);
-
-    if (type < 0) {
-        vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
-        return CMD_WARNING;
-    }
-
-    zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type);
-    return CMD_SUCCESS;
-}
-
-/* [Babel Command] */
-DEFUN (no_babel_redistribute_type,
-       no_babel_redistribute_type_cmd,
-       "no redistribute " QUAGGA_REDIST_STR_BABELD,
-       NO_STR
-       "Redistribute\n"
-       QUAGGA_REDIST_HELP_STR_BABELD)
-{
-    int type;
-
-    type = proto_redistnum(AFI_IP6, argv[0]);
-
-    if (type < 0)
-        type = proto_redistnum(AFI_IP, argv[0]);
-
-    if (type < 0) {
-        vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
-        return CMD_WARNING;
-    }
-
-    zclient_redistribute (ZEBRA_REDISTRIBUTE_DELETE, zclient, type);
-    /* perhaps should we remove xroutes having the same type... */
-    return CMD_SUCCESS;
-}
-
-#ifndef NO_DEBUG
-/* [Babel Command] */
-DEFUN (debug_babel,
-       debug_babel_cmd,
-       "debug babel (common|kernel|filter|timeout|interface|route|all)",
-       "Enable debug messages for specific or all part.\n"
-       "Babel information\n"
-       "Common messages (default)\n"
-       "Kernel messages\n"
-       "Filter messages\n"
-       "Timeout messages\n"
-       "Interface messages\n"
-       "Route messages\n"
-       "All messages\n")
-{
-    int i;
-
-    for(i = 0; debug_type[i].str != NULL; i++) {
-        if (strncmp (debug_type[i].str, argv[0],
-                     debug_type[i].str_min_len) == 0) {
-            debug |= debug_type[i].type;
-            return CMD_SUCCESS;
-        }
-    }
-
-    vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
-
-    return CMD_WARNING;
-}
-
-/* [Babel Command] */
-DEFUN (no_debug_babel,
-       no_debug_babel_cmd,
-       "no debug babel (common|kernel|filter|timeout|interface|route|all)",
-       NO_STR
-       "Disable debug messages for specific or all part.\n"
-       "Babel information\n"
-       "Common messages (default)\n"
-       "Kernel messages\n"
-       "Filter messages\n"
-       "Timeout messages\n"
-       "Interface messages\n"
-       "Route messages\n"
-       "All messages\n")
-{
-    int i;
-
-    for (i = 0; debug_type[i].str; i++) {
-        if (strncmp(debug_type[i].str, argv[0],
-                    debug_type[i].str_min_len) == 0) {
-            debug &= ~debug_type[i].type;
-            return CMD_SUCCESS;
-        }
-    }
-
-    vty_out(vty, "Invalid type %s%s", argv[0], VTY_NEWLINE);
-
-    return CMD_WARNING;
-}
-#endif /* NO_DEBUG */
-
-/* Output "debug" statement lines, if necessary. */
-int
-debug_babel_config_write (struct vty * vty)
-{
-#ifdef NO_DEBUG
-    return 0;
-#else
-    int i, lines = 0;
-
-    if (debug == BABEL_DEBUG_ALL)
-    {
-        vty_out (vty, "debug babel all%s", VTY_NEWLINE);
-        lines++;
-    }
-    else
-        for (i = 0; debug_type[i].str != NULL; i++)
-            if
-            (
-                debug_type[i].type != BABEL_DEBUG_ALL
-                && CHECK_FLAG (debug, debug_type[i].type)
-            )
-            {
-                vty_out (vty, "debug babel %s%s", debug_type[i].str, VTY_NEWLINE);
-                lines++;
-            }
-    if (lines)
-    {
-        vty_out (vty, "!%s", VTY_NEWLINE);
-        lines++;
-    }
-    return lines;
-#endif /* NO_DEBUG */
-}
-
-void babelz_zebra_init(void)
-{
-    zclient = zclient_new();
-    zclient_init(zclient, ZEBRA_ROUTE_BABEL);
-
-    zclient->interface_add = babel_interface_add;
-    zclient->interface_delete = babel_interface_delete;
-    zclient->interface_up = babel_interface_up;
-    zclient->interface_down = babel_interface_down;
-    zclient->interface_address_add = babel_interface_address_add;
-    zclient->interface_address_delete = babel_interface_address_delete;
-    zclient->ipv4_route_add = babel_zebra_read_ipv4;
-    zclient->ipv4_route_delete = babel_zebra_read_ipv4;
-    zclient->ipv6_route_add = babel_zebra_read_ipv6;
-    zclient->ipv6_route_delete = babel_zebra_read_ipv6;
-
-    install_node (&zebra_node, zebra_config_write);
-    install_element(BABEL_NODE, &babel_redistribute_type_cmd);
-    install_element(BABEL_NODE, &no_babel_redistribute_type_cmd);
-    install_element(ENABLE_NODE, &debug_babel_cmd);
-    install_element(ENABLE_NODE, &no_debug_babel_cmd);
-    install_element(CONFIG_NODE, &debug_babel_cmd);
-    install_element(CONFIG_NODE, &no_debug_babel_cmd);
-}
-
-static int
-zebra_config_write (struct vty *vty)
-{
-    if (! zclient->enable)
-    {
-        vty_out (vty, "no router zebra%s", VTY_NEWLINE);
-        return 1;
-    }
-    else if (! zclient->redist[ZEBRA_ROUTE_BABEL])
-    {
-        vty_out (vty, "router zebra%s", VTY_NEWLINE);
-        vty_out (vty, " no redistribute babel%s", VTY_NEWLINE);
-        return 1;
-    }
-    return 0;
-}
-
-void
-babel_zebra_close_connexion(void)
-{
-    zclient_stop(zclient);
-}

+ 0 - 50
babeld/babel_zebra.h

@@ -1,50 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef BABEL_ZEBRA_H
-#define BABEL_ZEBRA_H
-
-#include "vty.h"
-
-extern struct zclient *zclient;
-
-void babelz_zebra_init(void);
-void babel_zebra_close_connexion(void);
-extern int debug_babel_config_write (struct vty *);
-
-#endif

+ 0 - 728
babeld/babeld.c

@@ -1,728 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <zebra.h>
-#include "command.h"
-#include "prefix.h"
-#include "memory.h"
-#include "memtypes.h"
-#include "table.h"
-#include "distribute.h"
-#include "prefix.h"
-#include "filter.h"
-#include "plist.h"
-
-#include "babel_main.h"
-#include "babeld.h"
-#include "util.h"
-#include "net.h"
-#include "kernel.h"
-#include "babel_interface.h"
-#include "neighbour.h"
-#include "route.h"
-#include "message.h"
-#include "resend.h"
-#include "babel_filter.h"
-#include "babel_zebra.h"
-
-
-static int babel_init_routing_process(struct thread *thread);
-static void babel_get_myid(void);
-static void babel_initial_noise(void);
-static int babel_read_protocol (struct thread *thread);
-static int babel_main_loop(struct thread *thread);
-static void babel_set_timer(struct timeval *timeout);
-static void babel_fill_with_next_timeout(struct timeval *tv);
-
-
-/* Informations relative to the babel running daemon. */
-static struct babel *babel_routing_process = NULL;
-static unsigned char *receive_buffer = NULL;
-static int receive_buffer_size = 0;
-
-/* timeouts */
-struct timeval check_neighbours_timeout;
-static time_t expiry_time;
-static time_t source_expiry_time;
-
-/* Babel node structure. */
-static struct cmd_node cmd_babel_node =
-{
-    .node   = BABEL_NODE,
-    .prompt = "%s(config-router)# ",
-    .vtysh  = 1,
-};
-
-/* print current babel configuration on vty */
-static int
-babel_config_write (struct vty *vty)
-{
-    int lines = 0;
-    int i;
-
-    /* list enabled debug modes */
-    lines += debug_babel_config_write (vty);
-
-    if (!babel_routing_process)
-        return lines;
-    vty_out (vty, "router babel%s", VTY_NEWLINE);
-    if (resend_delay != BABEL_DEFAULT_RESEND_DELAY)
-    {
-        vty_out (vty, " babel resend-delay %u%s", resend_delay, VTY_NEWLINE);
-        lines++;
-    }
-    /* list enabled interfaces */
-    lines = 1 + babel_enable_if_config_write (vty);
-    /* list redistributed protocols */
-    for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
-        if (i != zclient->redist_default && zclient->redist[i])
-        {
-            vty_out (vty, " redistribute %s%s", zebra_route_string (i), VTY_NEWLINE);
-            lines++;
-        }
-
-    return lines;
-}
-
-
-static int
-babel_create_routing_process (void)
-{
-    assert (babel_routing_process == NULL);
-
-    /* Allocaste Babel instance. */
-    babel_routing_process = XCALLOC (MTYPE_BABEL, sizeof (struct babel));
-
-    /* Initialize timeouts */
-    gettime(&babel_now);
-    expiry_time = babel_now.tv_sec + roughly(30);
-    source_expiry_time = babel_now.tv_sec + roughly(300);
-
-    /* Make socket for Babel protocol. */
-    protocol_socket = babel_socket(protocol_port);
-    if (protocol_socket < 0) {
-        zlog_err("Couldn't create link local socket: %s", safe_strerror(errno));
-        goto fail;
-    }
-
-    /* Threads. */
-    babel_routing_process->t_read =
-    thread_add_read(master, &babel_read_protocol, NULL, protocol_socket);
-    /* wait a little: zebra will announce interfaces, addresses, routes... */
-    babel_routing_process->t_update =
-    thread_add_timer_msec(master, &babel_init_routing_process, NULL, 200L);
-    return 0;
-
-fail:
-    XFREE(MTYPE_BABEL, babel_routing_process);
-    babel_routing_process = NULL;
-    return -1;
-}
-
-/* thread reading entries form others babel daemons */
-static int
-babel_read_protocol (struct thread *thread)
-{
-    int rc;
-    struct interface *ifp = NULL;
-    struct sockaddr_in6 sin6;
-    struct listnode *linklist_node = NULL;
-
-    assert(babel_routing_process != NULL);
-    assert(protocol_socket >= 0);
-
-    rc = babel_recv(protocol_socket,
-                    receive_buffer, receive_buffer_size,
-                    (struct sockaddr*)&sin6, sizeof(sin6));
-    if(rc < 0) {
-        if(errno != EAGAIN && errno != EINTR) {
-            zlog_err("recv: %s", safe_strerror(errno));
-        }
-    } else {
-        FOR_ALL_INTERFACES(ifp, linklist_node) {
-            if(!if_up(ifp))
-                continue;
-            if(ifp->ifindex == sin6.sin6_scope_id) {
-                parse_packet((unsigned char*)&sin6.sin6_addr, ifp,
-                             receive_buffer, rc);
-                break;
-            }
-        }
-    }
-
-    /* re-add thread */
-    babel_routing_process->t_read =
-    thread_add_read(master, &babel_read_protocol, NULL, protocol_socket);
-    return 0;
-}
-
-/* Zebra will give some information, especially about interfaces. This function
- must be call with a litte timeout wich may give zebra the time to do his job,
- making these inits have sense. */
-static int
-babel_init_routing_process(struct thread *thread)
-{
-    myseqno = (random() & 0xFFFF);
-    babel_get_myid();
-    babel_load_state_file();
-    debugf(BABEL_DEBUG_COMMON, "My ID is : %s.", format_eui64(myid));
-    babel_initial_noise();
-    babel_main_loop(thread);/* this function self-add to the t_update thread */
-    return 0;
-}
-
-/* fill "myid" with an unique id (only if myid != {0}). */
-static void
-babel_get_myid(void)
-{
-    struct interface *ifp = NULL;
-    struct listnode *linklist_node = NULL;
-    int rc;
-    int i;
-
-    /* if we already have an id (from state file), we return. */
-    if (memcmp(myid, zeroes, 8) != 0) {
-        return;
-    }
-
-    FOR_ALL_INTERFACES(ifp, linklist_node) {
-        /* ifp->ifindex is not necessarily valid at this point */
-        int ifindex = if_nametoindex(ifp->name);
-        if(ifindex > 0) {
-            unsigned char eui[8];
-            rc = if_eui64(ifp->name, ifindex, eui);
-            if(rc < 0)
-                continue;
-            memcpy(myid, eui, 8);
-            return;
-        }
-    }
-
-    /* We failed to get a global EUI64 from the interfaces we were given.
-     Let's try to find an interface with a MAC address. */
-    for(i = 1; i < 256; i++) {
-        char buf[IF_NAMESIZE], *ifname;
-        unsigned char eui[8];
-        ifname = if_indextoname(i, buf);
-        if(ifname == NULL)
-            continue;
-        rc = if_eui64(ifname, i, eui);
-        if(rc < 0)
-            continue;
-        memcpy(myid, eui, 8);
-        return;
-    }
-
-    zlog_err("Warning: couldn't find router id -- using random value.");
-
-    rc = read_random_bytes(myid, 8);
-    if(rc < 0) {
-        zlog_err("read(random): %s (cannot assign an ID)",safe_strerror(errno));
-        exit(1);
-    }
-    /* Clear group and global bits */
-    myid[0] &= ~3;
-}
-
-/* Make some noise so that others notice us, and send retractions in
- case we were restarted recently */
-static void
-babel_initial_noise(void)
-{
-    struct interface *ifp = NULL;
-    struct listnode *linklist_node = NULL;
-
-    FOR_ALL_INTERFACES(ifp, linklist_node) {
-        if(!if_up(ifp))
-            continue;
-        /* Apply jitter before we send the first message. */
-        usleep(roughly(10000));
-        gettime(&babel_now);
-        send_hello(ifp);
-        send_wildcard_retraction(ifp);
-    }
-
-    FOR_ALL_INTERFACES(ifp, linklist_node) {
-        if(!if_up(ifp))
-            continue;
-        usleep(roughly(10000));
-        gettime(&babel_now);
-        send_hello(ifp);
-        send_wildcard_retraction(ifp);
-        send_self_update(ifp);
-        send_request(ifp, NULL, 0);
-        flushupdates(ifp);
-        flushbuf(ifp);
-    }
-}
-
-/* Delete all the added babel routes, make babeld only speak to zebra. */
-static void
-babel_clean_routing_process()
-{
-    flush_all_routes();
-    babel_interface_close_all();
-
-    /* cancel threads */
-    if (babel_routing_process->t_read != NULL) {
-        thread_cancel(babel_routing_process->t_read);
-    }
-    if (babel_routing_process->t_update != NULL) {
-        thread_cancel(babel_routing_process->t_update);
-    }
-
-    XFREE(MTYPE_BABEL, babel_routing_process);
-    babel_routing_process = NULL;
-}
-
-/* Function used with timeout. */
-static int
-babel_main_loop(struct thread *thread)
-{
-    struct timeval tv;
-    struct interface *ifp = NULL;
-    struct listnode *linklist_node = NULL;
-
-    while(1) {
-        gettime(&babel_now);
-
-        /* timeouts --------------------------------------------------------- */
-        /* get the next timeout */
-        babel_fill_with_next_timeout(&tv);
-        /* if there is no timeout, we must wait. */
-        if(timeval_compare(&tv, &babel_now) > 0) {
-            timeval_minus(&tv, &tv, &babel_now);
-            debugf(BABEL_DEBUG_TIMEOUT, "babel main loop : timeout: %lld msecs",
-                   tv.tv_sec * 1000LL + tv.tv_usec / 1000LL);
-            /* it happens often to have less than 1 ms, it's bad. */
-            timeval_add_msec(&tv, &tv, 300);
-            babel_set_timer(&tv);
-            return 0;
-        }
-
-        gettime(&babel_now);
-
-        /* update database -------------------------------------------------- */
-        if(timeval_compare(&check_neighbours_timeout, &babel_now) < 0) {
-            int msecs;
-            msecs = check_neighbours();
-            msecs = MAX(msecs, 10);
-            schedule_neighbours_check(msecs, 1);
-        }
-
-        if(babel_now.tv_sec >= expiry_time) {
-            expire_routes();
-            expire_resend();
-            expiry_time = babel_now.tv_sec + roughly(30);
-        }
-
-        if(babel_now.tv_sec >= source_expiry_time) {
-            expire_sources();
-            source_expiry_time = babel_now.tv_sec + roughly(300);
-        }
-
-        FOR_ALL_INTERFACES(ifp, linklist_node) {
-            babel_interface_nfo *babel_ifp = NULL;
-            if(!if_up(ifp))
-                continue;
-            babel_ifp = babel_get_if_nfo(ifp);
-            if(timeval_compare(&babel_now, &babel_ifp->hello_timeout) >= 0)
-                send_hello(ifp);
-            if(timeval_compare(&babel_now, &babel_ifp->update_timeout) >= 0)
-                send_update(ifp, 0, NULL, 0);
-            if(timeval_compare(&babel_now,
-                               &babel_ifp->update_flush_timeout) >= 0)
-                flushupdates(ifp);
-        }
-
-        if(resend_time.tv_sec != 0) {
-            if(timeval_compare(&babel_now, &resend_time) >= 0)
-                do_resend();
-        }
-
-        if(unicast_flush_timeout.tv_sec != 0) {
-            if(timeval_compare(&babel_now, &unicast_flush_timeout) >= 0)
-                flush_unicast(1);
-        }
-
-        FOR_ALL_INTERFACES(ifp, linklist_node) {
-            babel_interface_nfo *babel_ifp = NULL;
-            if(!if_up(ifp))
-                continue;
-            babel_ifp = babel_get_if_nfo(ifp);
-            if(babel_ifp->flush_timeout.tv_sec != 0) {
-                if(timeval_compare(&babel_now, &babel_ifp->flush_timeout) >= 0)
-                    flushbuf(ifp);
-            }
-        }
-    }
-
-    assert(0); /* this line should never be reach */
-}
-
-static void
-printIfMin(struct timeval *tv, int cmd, const char *tag, const char *ifname)
-{
-    static struct timeval curr_tv;
-    static char buffer[200];
-    static const char *curr_tag = NULL;
-
-    switch (cmd) {
-        case 0: /* reset timeval */
-            curr_tv = *tv;
-            if(ifname != NULL) {
-                snprintf(buffer, 200L, "interface: %s; %s", ifname, tag);
-                curr_tag = buffer;
-            } else {
-                curr_tag = tag;
-            }
-            break;
-        case 1: /* take the min */
-            if (tv->tv_sec == 0 && tv->tv_usec == 0) { /* if (tv == ∞) */
-                break;
-            }
-            if (tv->tv_sec < curr_tv.tv_sec ||(tv->tv_sec == curr_tv.tv_sec &&
-                                               tv->tv_usec < curr_tv.tv_usec)) {
-                curr_tv = *tv;
-                if(ifname != NULL) {
-                    snprintf(buffer, 200L, "interface: %s; %s", ifname, tag);
-                    curr_tag = buffer;
-                } else {
-                    curr_tag = tag;
-                }
-            }
-            break;
-        case 2: /* print message */
-            debugf(BABEL_DEBUG_TIMEOUT, "next timeout due to: %s", curr_tag);
-            break;
-        default:
-            break;
-    }
-}
-
-static void
-babel_fill_with_next_timeout(struct timeval *tv)
-{
-#if (defined NO_DEBUG)
-#define printIfMin(a,b,c,d)
-#else
-#define printIfMin(a,b,c,d) \
-  if (UNLIKELY(debug & BABEL_DEBUG_TIMEOUT)) {printIfMin(a,b,c,d);}
-
-    struct interface *ifp = NULL;
-    struct listnode *linklist_node = NULL;
-
-    *tv = check_neighbours_timeout;
-    printIfMin(tv, 0, "check_neighbours_timeout", NULL);
-    timeval_min_sec(tv, expiry_time);
-    printIfMin(tv, 1, "expiry_time", NULL);
-    timeval_min_sec(tv, source_expiry_time);
-    printIfMin(tv, 1, "source_expiry_time", NULL);
-    timeval_min(tv, &resend_time);
-    printIfMin(tv, 1, "resend_time", NULL);
-    FOR_ALL_INTERFACES(ifp, linklist_node) {
-        babel_interface_nfo *babel_ifp = NULL;
-        if(!if_up(ifp))
-            continue;
-        babel_ifp = babel_get_if_nfo(ifp);
-        timeval_min(tv, &babel_ifp->flush_timeout);
-        printIfMin(tv, 1, "flush_timeout", ifp->name);
-        timeval_min(tv, &babel_ifp->hello_timeout);
-        printIfMin(tv, 1, "hello_timeout", ifp->name);
-        timeval_min(tv, &babel_ifp->update_timeout);
-        printIfMin(tv, 1, "update_timeout", ifp->name);
-        timeval_min(tv, &babel_ifp->update_flush_timeout);
-        printIfMin(tv, 1, "update_flush_timeout",ifp->name);
-    }
-    timeval_min(tv, &unicast_flush_timeout);
-    printIfMin(tv, 1, "unicast_flush_timeout", NULL);
-    printIfMin(tv, 2, NULL, NULL);
-#undef printIfMin
-#endif
-}
-
-/* set the t_update thread of the babel routing process to be launch in
- 'timeout' (approximate at the milisecond) */
-static void
-babel_set_timer(struct timeval *timeout)
-{
-    long msecs = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
-    if (babel_routing_process->t_update != NULL) {
-        thread_cancel(babel_routing_process->t_update);
-    }
-    babel_routing_process->t_update =
-    thread_add_timer_msec(master, &babel_main_loop, NULL, msecs);
-}
-
-/* Schedule a neighbours check after roughly 3/2 times msecs have elapsed. */
-void
-schedule_neighbours_check(int msecs, int override)
-{
-    struct timeval timeout;
-
-    timeval_add_msec(&timeout, &babel_now, roughly(msecs * 3 / 2));
-    if(override)
-        check_neighbours_timeout = timeout;
-    else
-        timeval_min(&check_neighbours_timeout, &timeout);
-}
-
-int
-resize_receive_buffer(int size)
-{
-    if(size <= receive_buffer_size)
-        return 0;
-
-    if(receive_buffer == NULL) {
-        receive_buffer = malloc(size);
-        if(receive_buffer == NULL) {
-            zlog_err("malloc(receive_buffer): %s", safe_strerror(errno));
-            return -1;
-        }
-        receive_buffer_size = size;
-    } else {
-        unsigned char *new;
-        new = realloc(receive_buffer, size);
-        if(new == NULL) {
-            zlog_err("realloc(receive_buffer): %s", safe_strerror(errno));
-            return -1;
-        }
-        receive_buffer = new;
-        receive_buffer_size = size;
-    }
-    return 1;
-}
-
-static void
-babel_distribute_update (struct distribute *dist)
-{
-    struct interface *ifp;
-    babel_interface_nfo *babel_ifp;
-    struct access_list *alist;
-    struct prefix_list *plist;
-
-    if (! dist->ifname)
-        return;
-
-    ifp = if_lookup_by_name (dist->ifname);
-    if (ifp == NULL)
-        return;
-
-    babel_ifp = babel_get_if_nfo(ifp);
-
-    if (dist->list[DISTRIBUTE_IN]) {
-        alist = access_list_lookup (AFI_IP6, dist->list[DISTRIBUTE_IN]);
-        if (alist)
-            babel_ifp->list[BABEL_FILTER_IN] = alist;
-        else
-            babel_ifp->list[BABEL_FILTER_IN] = NULL;
-    } else {
-        babel_ifp->list[BABEL_FILTER_IN] = NULL;
-    }
-
-    if (dist->list[DISTRIBUTE_OUT]) {
-        alist = access_list_lookup (AFI_IP6, dist->list[DISTRIBUTE_OUT]);
-        if (alist)
-            babel_ifp->list[BABEL_FILTER_OUT] = alist;
-        else
-            babel_ifp->list[BABEL_FILTER_OUT] = NULL;
-    } else {
-        babel_ifp->list[BABEL_FILTER_OUT] = NULL;
-    }
-
-    if (dist->prefix[DISTRIBUTE_IN]) {
-        plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_IN]);
-        if (plist)
-            babel_ifp->prefix[BABEL_FILTER_IN] = plist;
-        else
-            babel_ifp->prefix[BABEL_FILTER_IN] = NULL;
-    } else {
-        babel_ifp->prefix[BABEL_FILTER_IN] = NULL;
-    }
-
-    if (dist->prefix[DISTRIBUTE_OUT]) {
-        plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_OUT]);
-        if (plist)
-            babel_ifp->prefix[BABEL_FILTER_OUT] = plist;
-        else
-            babel_ifp->prefix[BABEL_FILTER_OUT] = NULL;
-    } else {
-        babel_ifp->prefix[BABEL_FILTER_OUT] = NULL;
-    }
-}
-
-static void
-babel_distribute_update_interface (struct interface *ifp)
-{
-    struct distribute *dist;
-
-    dist = distribute_lookup (ifp->name);
-    if (dist)
-        babel_distribute_update (dist);
-}
-
-/* Update all interface's distribute list. */
-static void
-babel_distribute_update_all (struct prefix_list *notused)
-{
-    struct interface *ifp;
-    struct listnode *node;
-
-    for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
-        babel_distribute_update_interface (ifp);
-}
-
-static void
-babel_distribute_update_all_wrapper (struct access_list *notused)
-{
-    babel_distribute_update_all(NULL);
-}
-
-
-/* [Command] */
-DEFUN (router_babel,
-       router_babel_cmd,
-       "router babel",
-       "Enable a routing process\n"
-       "Make Babel instance command\n"
-       "No attributes\n")
-{
-    int ret;
-
-    vty->node = BABEL_NODE;
-
-    if (!babel_routing_process) {
-        ret = babel_create_routing_process ();
-
-        /* Notice to user we couldn't create Babel. */
-        if (ret < 0) {
-            zlog_warn ("can't create Babel");
-            return CMD_WARNING;
-        }
-    }
-
-    return CMD_SUCCESS;
-}
-
-/* [Command] */
-DEFUN (no_router_babel,
-       no_router_babel_cmd,
-       "no router babel",
-       NO_STR
-       "Disable a routing process\n"
-       "Remove Babel instance command\n"
-       "No attributes\n")
-{
-    if(babel_routing_process)
-        babel_clean_routing_process();
-    return CMD_SUCCESS;
-}
-
-/* [Babel Command] */
-DEFUN (babel_set_resend_delay,
-       babel_set_resend_delay_cmd,
-       "babel resend-delay <20-655340>",
-       "Babel commands\n"
-       "Time before resending a message\n"
-       "Milliseconds\n")
-{
-    int interval;
-
-    VTY_GET_INTEGER_RANGE("milliseconds", interval, argv[0], 20, 10 * 0xFFFE);
-
-    resend_delay = interval;
-    return CMD_SUCCESS;
-}
-
-void
-babeld_quagga_init(void)
-{
-
-    install_node(&cmd_babel_node, &babel_config_write);
-
-    install_element(CONFIG_NODE, &router_babel_cmd);
-    install_element(CONFIG_NODE, &no_router_babel_cmd);
-
-    install_default(BABEL_NODE);
-    install_element(BABEL_NODE, &babel_set_resend_delay_cmd);
-
-    babel_if_init();
-
-    /* Access list install. */
-    access_list_init ();
-    access_list_add_hook (babel_distribute_update_all_wrapper);
-    access_list_delete_hook (babel_distribute_update_all_wrapper);
-
-    /* Prefix list initialize.*/
-    prefix_list_init ();
-    prefix_list_add_hook (babel_distribute_update_all);
-    prefix_list_delete_hook (babel_distribute_update_all);
-
-    /* Distribute list install. */
-    distribute_list_init (BABEL_NODE);
-    distribute_list_add_hook (babel_distribute_update);
-    distribute_list_delete_hook (babel_distribute_update);
-}
-
-/* Stubs to adapt Babel's filtering calls to Quagga's infrastructure. */
-
-int
-input_filter(const unsigned char *id,
-             const unsigned char *prefix, unsigned short plen,
-             const unsigned char *neigh, unsigned int ifindex)
-{
-    return babel_filter(0, prefix, plen, ifindex);
-}
-
-int
-output_filter(const unsigned char *id, const unsigned char *prefix,
-              unsigned short plen, unsigned int ifindex)
-{
-    return babel_filter(1, prefix, plen, ifindex);
-}
-
-/* There's no redistribute filter in Quagga -- the zebra daemon does its
-   own filtering. */
-int
-redistribute_filter(const unsigned char *prefix, unsigned short plen,
-                    unsigned int ifindex, int proto)
-{
-    return 0;
-}
-

+ 0 - 30
babeld/babeld.conf.sample

@@ -1,30 +0,0 @@
-debug babel common
-!debug babel kernel
-!debug babel filter
-!debug babel timeout
-!debug babel interface
-!debug babel route
-!debug babel all
-
-router babel
-! network wlan0
-! network eth0
-! redistribute kernel
-! no redistribute static
-
-! The defaults are fine for a wireless interface
-
-!interface wlan0
-
-! A few optimisation tweaks are optional but recommended on a wired interface
-! Disable link quality estimation, enable split horizon processing, and
-! increase the hello and update intervals.
-
-!interface eth0
-! babel wired
-! babel split-horizon
-! babel hello-interval 12000
-! babel update-interval 36000
-
-! log file /var/log/quagga/babeld.log
-log stdout

+ 0 - 141
babeld/babeld.h

@@ -1,141 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright (c) 2007, 2008 by Juliusz Chroboczek
-Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef BABEL_BABELD_H
-#define BABEL_BABELD_H
-
-#include <zebra.h>
-#include "vty.h"
-
-#define INFINITY ((unsigned short)(~0))
-
-#ifndef RTPROT_BABEL
-#define RTPROT_BABEL 42
-#endif
-
-#define RTPROT_BABEL_LOCAL -2
-
-#undef MAX
-#undef MIN
-
-#define MAX(x,y) ((x)<=(y)?(y):(x))
-#define MIN(x,y) ((x)<=(y)?(x):(y))
-
-#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-/* nothing */
-#elif defined(__GNUC__)
-#define inline __inline
-#if  (__GNUC__ >= 3)
-#define restrict __restrict
-#else
-#define restrict /**/
-#endif
-#else
-#define inline /**/
-#define restrict /**/
-#endif
-
-#if defined(__GNUC__) && (__GNUC__ >= 3)
-#define ATTRIBUTE(x) __attribute__ (x)
-#define LIKELY(_x) __builtin_expect(!!(_x), 1)
-#define UNLIKELY(_x) __builtin_expect(!!(_x), 0)
-#else
-#define ATTRIBUTE(x) /**/
-#define LIKELY(_x) !!(_x)
-#define UNLIKELY(_x) !!(_x)
-#endif
-
-#if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)
-#define COLD __attribute__ ((cold))
-#else
-#define COLD /**/
-#endif
-
-#ifndef IF_NAMESIZE
-#include <sys/socket.h>
-#include <net/if.h>
-#endif
-
-#ifdef HAVE_VALGRIND
-#include <valgrind/memcheck.h>
-#else
-#ifndef VALGRIND_MAKE_MEM_UNDEFINED
-#define VALGRIND_MAKE_MEM_UNDEFINED(a, b) do {} while(0)
-#endif
-#ifndef VALGRIND_CHECK_MEM_IS_DEFINED
-#define VALGRIND_CHECK_MEM_IS_DEFINED(a, b) do {} while(0)
-#endif
-#endif
-
-
-#define BABEL_VTY_PORT 2609
-#define BABEL_DEFAULT_CONFIG "babeld.conf"
-#define BABEL_VERSION "0.1 for quagga"
-
-/* Values in milliseconds */
-#define BABEL_DEFAULT_HELLO_INTERVAL 4000
-#define BABEL_DEFAULT_UPDATE_INTERVAL 16000
-#define BABEL_DEFAULT_RESEND_DELAY 2000
-
-
-/* Babel socket. */
-extern int protocol_socket;
-
-/* Babel structure. */
-struct babel
-{
-    /* Babel threads. */
-    struct thread *t_read;    /* on Babel protocol's socket */
-    struct thread *t_update;  /* timers */
-};
-
-
-extern void babeld_quagga_init(void);
-extern int input_filter(const unsigned char *id,
-                        const unsigned char *prefix, unsigned short plen,
-                        const unsigned char *neigh, unsigned int ifindex);
-extern int output_filter(const unsigned char *id, const unsigned char *prefix,
-                         unsigned short plen, unsigned int ifindex);
-extern int redistribute_filter(const unsigned char *prefix, unsigned short plen,
-                               unsigned int ifindex, int proto);
-extern int resize_receive_buffer(int size);
-extern void schedule_neighbours_check(int msecs, int override);
-
-
-#endif /* BABEL_BABELD_H */

+ 0 - 314
babeld/kernel.c

@@ -1,314 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-
-Copyright 2007, 2008 by Grégoire Henry, Julien Cristau and Juliusz Chroboczek
-Copyright 2011, 2012 by Matthieu Boutier and Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <sys/time.h>
-#include <sys/param.h>
-#include <time.h>
-
-#include "babeld.h"
-
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-
-#include <zebra.h>
-#include "prefix.h"
-#include "zclient.h"
-#include "kernel.h"
-#include "privs.h"
-#include "command.h"
-#include "vty.h"
-#include "memory.h"
-#include "thread.h"
-
-#include "util.h"
-#include "babel_interface.h"
-#include "babel_zebra.h"
-
-
-static int
-kernel_route_v4(int add, const unsigned char *pref, unsigned short plen,
-                const unsigned char *gate, int ifindex,
-                unsigned int metric);
-static int
-kernel_route_v6(int add, const unsigned char *pref, unsigned short plen,
-                const unsigned char *gate, int ifindex,
-                unsigned int metric);
-
-int
-kernel_interface_operational(struct interface *interface)
-{
-    return if_is_operative(interface);
-}
-
-int
-kernel_interface_mtu(struct interface *interface)
-{
-    return MIN(interface->mtu, interface->mtu6);
-}
-
-int
-kernel_interface_wireless(struct interface *interface)
-{
-    return 0;
-}
-
-int
-kernel_route(int operation, const unsigned char *pref, unsigned short plen,
-             const unsigned char *gate, int ifindex, unsigned int metric,
-             const unsigned char *newgate, int newifindex,
-             unsigned int newmetric)
-{
-    int rc;
-    int ipv4;
-
-    /* Check that the protocol family is consistent. */
-    if(plen >= 96 && v4mapped(pref)) {
-        if(!v4mapped(gate)) {
-            errno = EINVAL;
-            return -1;
-        }
-        ipv4 = 1;
-    } else {
-        if(v4mapped(gate)) {
-            errno = EINVAL;
-            return -1;
-        }
-        ipv4 = 0;
-    }
-
-    switch (operation) {
-        case ROUTE_ADD:
-            return ipv4 ?
-                   kernel_route_v4(1, pref, plen, gate, ifindex, metric):
-                   kernel_route_v6(1, pref, plen, gate, ifindex, metric);
-            break;
-        case ROUTE_FLUSH:
-            return ipv4 ?
-                   kernel_route_v4(0, pref, plen, gate, ifindex, metric):
-                   kernel_route_v6(0, pref, plen, gate, ifindex, metric);
-            break;
-        case ROUTE_MODIFY:
-            if(newmetric == metric && memcmp(newgate, gate, 16) == 0 &&
-               newifindex == ifindex)
-                return 0;
-            debugf(BABEL_DEBUG_ROUTE, "Modify route: delete old; add new.");
-            rc = ipv4 ?
-                kernel_route_v4(0, pref, plen, gate, ifindex, metric):
-                kernel_route_v6(0, pref, plen, gate, ifindex, metric);
-
-            if (rc < 0)
-                return -1;
-
-            rc = ipv4 ?
-                kernel_route_v4(1, pref, plen, newgate, newifindex, newmetric):
-                kernel_route_v6(1, pref, plen, newgate, newifindex, newmetric);
-
-            return rc;
-            break;
-        default:
-            zlog_err("this should never appens (false value - kernel_route)");
-            assert(0);
-            exit(1);
-            break;
-    }
-}
-
-static int
-kernel_route_v4(int add,
-                const unsigned char *pref, unsigned short plen,
-                const unsigned char *gate, int ifindex, unsigned int metric)
-{
-    struct zapi_ipv4 api;               /* quagga's communication system */
-    struct prefix_ipv4 quagga_prefix;   /* quagga's prefix */
-    struct in_addr babel_prefix_addr;   /* babeld's prefix addr */
-    struct in_addr nexthop;             /* next router to go */
-    struct in_addr *nexthop_pointer = &nexthop; /* it's an array! */
-
-    /* convert to be understandable by quagga */
-    /* convert given addresses */
-    uchar_to_inaddr(&babel_prefix_addr, pref);
-    uchar_to_inaddr(&nexthop, gate);
-
-    /* make prefix structure */
-    memset (&quagga_prefix, 0, sizeof(quagga_prefix));
-    quagga_prefix.family = AF_INET;
-    IPV4_ADDR_COPY (&quagga_prefix.prefix, &babel_prefix_addr);
-    quagga_prefix.prefixlen = plen - 96; /* our plen is for v4mapped's addr */
-    apply_mask_ipv4(&quagga_prefix);
-
-    api.type  = ZEBRA_ROUTE_BABEL;
-    api.flags = 0;
-    api.message = 0;
-    api.safi = SAFI_UNICAST;
-
-    /* Unlike the native Linux and BSD interfaces, Quagga doesn't like
-       there to be both and IPv4 nexthop and an ifindex.  Omit the
-       ifindex, and assume that the connected prefixes be set up
-       correctly. */
-
-    SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
-    api.ifindex_num = 0;
-    if(metric >= KERNEL_INFINITY) {
-        api.flags = ZEBRA_FLAG_BLACKHOLE;
-        api.nexthop_num = 0;
-    } else {
-        api.nexthop_num = 1;
-        api.nexthop = &nexthop_pointer;
-        SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
-        api.metric = metric;
-    }
-
-    debugf(BABEL_DEBUG_ROUTE, "%s route (ipv4) to zebra",
-           add ? "adding" : "removing" );
-    return zapi_ipv4_route (add ? ZEBRA_IPV4_ROUTE_ADD :
-                                  ZEBRA_IPV4_ROUTE_DELETE,
-                            zclient, &quagga_prefix, &api);
-}
-
-static int
-kernel_route_v6(int add, const unsigned char *pref, unsigned short plen,
-                const unsigned char *gate, int ifindex, unsigned int metric)
-{
-    unsigned int tmp_ifindex = ifindex; /* (for typing) */
-    struct zapi_ipv6 api;               /* quagga's communication system */
-    struct prefix_ipv6 quagga_prefix;   /* quagga's prefix */
-    struct in6_addr babel_prefix_addr;  /* babeld's prefix addr */
-    struct in6_addr nexthop;            /* next router to go */
-    struct in6_addr *nexthop_pointer = &nexthop;
-
-    /* convert to be understandable by quagga */
-    /* convert given addresses */
-    uchar_to_in6addr(&babel_prefix_addr, pref);
-    uchar_to_in6addr(&nexthop, gate);
-
-    /* make prefix structure */
-    memset (&quagga_prefix, 0, sizeof(quagga_prefix));
-    quagga_prefix.family = AF_INET6;
-    IPV6_ADDR_COPY (&quagga_prefix.prefix, &babel_prefix_addr);
-    quagga_prefix.prefixlen = plen;
-    apply_mask_ipv6(&quagga_prefix);
-
-    api.type  = ZEBRA_ROUTE_BABEL;
-    api.flags = 0;
-    api.message = 0;
-    api.safi = SAFI_UNICAST;
-    SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
-    if(metric >= KERNEL_INFINITY) {
-        api.flags = ZEBRA_FLAG_BLACKHOLE;
-        api.nexthop_num = 0;
-        api.ifindex_num = 0;
-    } else {
-        api.nexthop_num = 1;
-        api.nexthop = &nexthop_pointer;
-        SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
-        api.ifindex_num = 1;
-        api.ifindex = &tmp_ifindex;
-        SET_FLAG(api.message, ZAPI_MESSAGE_METRIC);
-        api.metric = metric;
-    }
-
-    debugf(BABEL_DEBUG_ROUTE, "%s route (ipv6) to zebra",
-           add ? "adding" : "removing" );
-    return zapi_ipv6_route (add ? ZEBRA_IPV6_ROUTE_ADD :
-                                  ZEBRA_IPV6_ROUTE_DELETE,
-                            zclient, &quagga_prefix, &api);
-}
-
-int
-if_eui64(char *ifname, int ifindex, unsigned char *eui)
-{
-    struct interface *ifp = if_lookup_by_index(ifindex);
-    if (ifp == NULL) {
-        return -1;
-    }
-#ifdef HAVE_STRUCT_SOCKADDR_DL
-    u_char len = ifp->sdl.sdl_alen;
-    char *tmp = ifp->sdl.sdl_data + ifp->sdl.sdl_nlen;
-#else
-    u_char len = (u_char) ifp->hw_addr_len;
-    char *tmp = (void*) ifp->hw_addr;
-#endif
-    if (len == 8) {
-        memcpy(eui, tmp, 8);
-        eui[0] ^= 2;
-    } else if (len == 6) {
-        memcpy(eui,   tmp,   3);
-        eui[3] = 0xFF;
-        eui[4] = 0xFE;
-        memcpy(eui+5, tmp+3, 3);
-    } else {
-        return -1;
-    }
-    return 0;
-}
-
-/* Like gettimeofday, but returns monotonic time.  If POSIX clocks are not
-   available, falls back to gettimeofday but enforces monotonicity. */
-int
-gettime(struct timeval *tv)
-{
-    return quagga_gettime(QUAGGA_CLK_MONOTONIC, tv);
-}
-
-/* If /dev/urandom doesn't exist, this will fail with ENOENT, which the
-   caller will deal with gracefully. */
-
-int
-read_random_bytes(void *buf, size_t len)
-{
-    int fd;
-    int rc;
-
-    fd = open("/dev/urandom", O_RDONLY);
-    if(fd < 0) {
-        rc = -1;
-    } else {
-        rc = read(fd, buf, len);
-        if(rc < 0 || (unsigned) rc < len)
-            rc = -1;
-        close(fd);
-    }
-    return rc;
-}
-

+ 0 - 69
babeld/kernel.h

@@ -1,69 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright (c) 2007, 2008 by Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <netinet/in.h>
-#include "babel_main.h"
-#include "if.h"
-
-#define KERNEL_INFINITY 0xFFFF
-
-struct kernel_route {
-    unsigned char prefix[16];
-    int plen;
-    int metric;
-    unsigned int ifindex;
-    int proto;
-    unsigned char gw[16];
-};
-
-#define ROUTE_FLUSH 0
-#define ROUTE_ADD 1
-#define ROUTE_MODIFY 2
-
-extern int export_table, import_table;
-
-int kernel_interface_operational(struct interface *interface);
-int kernel_interface_mtu(struct interface *interface);
-int kernel_interface_wireless(struct interface *interface);
-int kernel_route(int operation, const unsigned char *dest, unsigned short plen,
-                 const unsigned char *gate, int ifindex, unsigned int metric,
-                 const unsigned char *newgate, int newifindex,
-                 unsigned int newmetric);
-int if_eui64(char *ifname, int ifindex, unsigned char *eui);
-int gettime(struct timeval *tv);
-int read_random_bytes(void *buf, size_t len);

File diff suppressed because it is too large
+ 0 - 1561
babeld/message.c


+ 0 - 111
babeld/message.h

@@ -1,111 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *  
-Copyright (c) 2007, 2008 by Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#ifndef BABEL_MESSAGE_H
-#define BABEL_MESSAGE_H
-
-#include "babel_interface.h"
-
-#define MAX_BUFFERED_UPDATES 200
-
-#define BUCKET_TOKENS_MAX 200
-#define BUCKET_TOKENS_PER_SEC 40
-
-#define MESSAGE_PAD1 0
-#define MESSAGE_PADN 1
-#define MESSAGE_ACK_REQ 2
-#define MESSAGE_ACK 3
-#define MESSAGE_HELLO 4
-#define MESSAGE_IHU 5
-#define MESSAGE_ROUTER_ID 6
-#define MESSAGE_NH 7
-#define MESSAGE_UPDATE 8
-#define MESSAGE_REQUEST 9
-#define MESSAGE_MH_REQUEST 10
-
-
-extern unsigned short myseqno;
-extern struct timeval seqno_time;
-
-extern int broadcast_ihu;
-extern int split_horizon;
-
-extern unsigned char packet_header[4];
-
-extern struct neighbour *unicast_neighbour;
-extern struct timeval unicast_flush_timeout;
-
-void parse_packet(const unsigned char *from, struct interface *ifp,
-                  const unsigned char *packet, int packetlen);
-void flushbuf(struct interface *ifp);
-void flushupdates(struct interface *ifp);
-void send_ack(struct neighbour *neigh, unsigned short nonce,
-              unsigned short interval);
-void send_hello_noupdate(struct interface *ifp, unsigned interval);
-void send_hello(struct interface *ifp);
-void flush_unicast(int dofree);
-void send_update(struct interface *ifp, int urgent,
-                 const unsigned char *prefix, unsigned char plen);
-void send_update_resend(struct interface *ifp,
-                        const unsigned char *prefix, unsigned char plen);
-void send_wildcard_retraction(struct interface *ifp);
-void update_myseqno(void);
-void send_self_update(struct interface *ifp);
-void send_ihu(struct neighbour *neigh, struct interface *ifp);
-void send_marginal_ihu(struct interface *ifp);
-void send_request(struct interface *ifp,
-                  const unsigned char *prefix, unsigned char plen);
-void send_unicast_request(struct neighbour *neigh,
-                          const unsigned char *prefix, unsigned char plen);
-void send_multihop_request(struct interface *ifp,
-                           const unsigned char *prefix, unsigned char plen,
-                           unsigned short seqno, const unsigned char *id,
-                           unsigned short hop_count);
-void
-send_unicast_multihop_request(struct neighbour *neigh,
-                              const unsigned char *prefix, unsigned char plen,
-                              unsigned short seqno, const unsigned char *id,
-                              unsigned short hop_count);
-void send_request_resend(struct neighbour *neigh,
-                         const unsigned char *prefix, unsigned char plen,
-                         unsigned short seqno, unsigned char *id);
-void handle_request(struct neighbour *neigh, const unsigned char *prefix,
-                    unsigned char plen, unsigned char hop_count,
-                    unsigned short seqno, const unsigned char *id);
-
-#endif

+ 0 - 343
babeld/neighbour.c

@@ -1,343 +0,0 @@
-/*  
- *  This file is free software: you may copy, redistribute and/or modify it  
- *  under the terms of the GNU General Public License as published by the  
- *  Free Software Foundation, either version 2 of the License, or (at your  
- *  option) any later version.  
- *  
- *  This file 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.  If not, see <http://www.gnu.org/licenses/>.  
- *  
- * This file incorporates work covered by the following copyright and  
- * permission notice:  
- *
-Copyright (c) 2007, 2008 by Juliusz Chroboczek
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include <zebra.h>
-#include "if.h"
-
-#include "babel_main.h"
-#include "babeld.h"
-#include "util.h"
-#include "babel_interface.h"
-#include "neighbour.h"
-#include "source.h"
-#include "route.h"
-#include "message.h"
-#include "resend.h"
-
-struct neighbour *neighs = NULL;
-
-static struct neighbour *
-find_neighbour_nocreate(const unsigned char *address, struct interface *ifp)
-{
-    struct neighbour *neigh;
-    FOR_ALL_NEIGHBOURS(neigh) {
-        if(memcmp(address, neigh->address, 16) == 0 &&
-           neigh->ifp == ifp)
-            return neigh;
-    }
-    return NULL;
-}
-
-void
-flush_neighbour(struct neighbour *neigh)
-{
-    flush_neighbour_routes(neigh);
-    if(unicast_neighbour == neigh)
-        flush_unicast(1);
-    flush_resends(neigh);
-<