summaryrefslogtreecommitdiffstats
path: root/babeld/babel_interface.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-09 13:16:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-09 13:16:35 +0000
commite2bbf175a2184bd76f6c54ccf8456babeb1a46fc (patch)
treef0b76550d6e6f500ada964a3a4ee933a45e5a6f1 /babeld/babel_interface.h
parentInitial commit. (diff)
downloadfrr-e2bbf175a2184bd76f6c54ccf8456babeb1a46fc.tar.xz
frr-e2bbf175a2184bd76f6c54ccf8456babeb1a46fc.zip
Adding upstream version 9.1.upstream/9.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'babeld/babel_interface.h')
-rw-r--r--babeld/babel_interface.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/babeld/babel_interface.h b/babeld/babel_interface.h
new file mode 100644
index 0000000..12fa6e2
--- /dev/null
+++ b/babeld/babel_interface.h
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: MIT
+/*
+Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
+*/
+
+#ifndef BABEL_INTERFACE_H
+#define BABEL_INTERFACE_H
+
+#include <zebra.h>
+#include "zclient.h"
+#include "vty.h"
+#include "distribute.h"
+
+#define CONFIG_DEFAULT 0
+#define CONFIG_NO 1
+#define CONFIG_YES 2
+
+/* babeld interface information */
+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;
+ /* Relative position of the Hello message in the send buffer, or
+ (-1) if there is none. */
+ int buffered_hello;
+ char have_buffered_id;
+ char have_buffered_nh;
+ char have_buffered_prefix;
+ unsigned char buffered_id[8];
+ 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;
+ /* A higher value means we forget old RTT samples faster. Must be
+ between 1 and 256, inclusive. */
+ unsigned int rtt_decay;
+ /* Parameters for computing the cost associated to RTT. */
+ unsigned int rtt_min;
+ unsigned int rtt_max;
+ unsigned int max_rtt_penalty;
+
+ /* For filter type slot. */
+ struct access_list *list[DISTRIBUTE_MAX]; /* Access-list. */
+ struct prefix_list *prefix[DISTRIBUTE_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)
+#define BABEL_IF_TIMESTAMPS (1 << 5)
+
+/* 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 &&
+ CHECK_FLAG(babel_get_if_nfo(ifp)->flags, BABEL_IF_IS_UP));
+}
+
+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, vrf_id_t);
+int babel_interface_down (int, struct zclient *, zebra_size_t, vrf_id_t);
+int babel_interface_add (int, struct zclient *, zebra_size_t, vrf_id_t);
+int babel_interface_delete (int, struct zclient *, zebra_size_t, vrf_id_t);
+int babel_interface_address_add (int, struct zclient *, zebra_size_t, vrf_id_t);
+int babel_interface_address_delete (int, struct zclient *, zebra_size_t, vrf_id_t);
+
+int babel_ifp_create(struct interface *ifp);
+int babel_ifp_up(struct interface *ifp);
+int babel_ifp_down(struct interface *ifp);
+int babel_ifp_destroy(struct interface *ifp);
+
+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