File: babel_interface.h

package info (click to toggle)
frr 10.5.1-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 77,024 kB
  • sloc: ansic: 687,126; python: 226,152; perl: 6,379; sh: 2,685; cpp: 1,883; makefile: 670; yacc: 397; lex: 363; lisp: 66; xml: 35; javascript: 8
file content (119 lines) | stat: -rw-r--r-- 3,671 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// 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) && 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);
void babel_if_terminate(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