1
0
mirror of https://gitlab.labs.nic.cz/labs/bird.git synced 2024-05-11 16:54:54 +00:00

The MRT protocol

The new MRT protocol is responsible for periodic RIB table dumps in the
MRT format (RFC 6396). Also the existing code for BGP4MP MRT dumps is
refactored and splitted between BGP to MRT protocols, will be more
integrated into MRT in the future.

Example:

protocol mrt {
        table "*";
        filename "%N_%F_%T.mrt";
        period 60;
}

It is partially based on the old MRT code from Pavel Tvrdik.
This commit is contained in:
Ondrej Zajicek (work)
2018-11-20 17:38:19 +01:00
parent 6712e77271
commit 863ecfc785
21 changed files with 1294 additions and 140 deletions

View File

@@ -305,7 +305,8 @@ tm_format_time(char *x, struct timeformat *fmt, btime t)
btime rt = current_real_time() - dt;
int v1 = !fmt->limit || (dt < fmt->limit);
tm_format_real_time(x, v1 ? fmt->fmt1 : fmt->fmt2, rt);
if (!tm_format_real_time(x, TM_DATETIME_BUFFER_SIZE, v1 ? fmt->fmt1 : fmt->fmt2, rt))
strcpy(x, "<error>");
}
/* Replace %f in format string with usec scaled to requested precision */
@@ -353,8 +354,8 @@ strfusec(char *buf, int size, const char *fmt, uint usec)
return str - buf;
}
void
tm_format_real_time(char *x, const char *fmt, btime t)
int
tm_format_real_time(char *x, size_t max, const char *fmt, btime t)
{
s64 t1 = t TO_S;
s64 t2 = t - t1 S;
@@ -362,17 +363,14 @@ tm_format_real_time(char *x, const char *fmt, btime t)
time_t ts = t1;
struct tm tm;
if (!localtime_r(&ts, &tm))
goto err;
return 0;
byte tbuf[TM_DATETIME_BUFFER_SIZE];
if (!strfusec(tbuf, TM_DATETIME_BUFFER_SIZE, fmt, t2))
goto err;
if (!strfusec(tbuf, max, fmt, t2))
return 0;
if (!strftime(x, TM_DATETIME_BUFFER_SIZE, tbuf, &tm))
goto err;
if (!strftime(x, max, tbuf, &tm))
return 0;
return;
err:
strcpy(x, "<error>");
return 1;
}

View File

@@ -122,6 +122,6 @@ struct timeformat {
btime tm_parse_time(char *x);
void tm_format_time(char *x, struct timeformat *fmt, btime t);
void tm_format_real_time(char *x, const char *fmt, btime t);
int tm_format_real_time(char *x, size_t max, const char *fmt, btime t);
#endif

View File

@@ -20,6 +20,12 @@
#include "sysdep/unix/endian.h"
#include "lib/string.h"
static inline u8
get_u8(const void *p)
{
return * (u8 *) p;
}
static inline u16
get_u16(const void *p)
{
@@ -52,6 +58,12 @@ get_u64(const void *p)
return (((u64) ntohl(xh)) << 32) | ntohl(xl);
}
static inline void
put_u8(void *p, u8 x)
{
memcpy(p, &x, 1);
}
static inline void
put_u16(void *p, u16 x)
{