summaryrefslogtreecommitdiff
path: root/sysdep
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2023-01-23 19:46:26 +0100
committerMaria Matejka <mq@ucw.cz>2023-01-23 19:46:26 +0100
commit758aabd96c0f09709183dff4261ffbfdd72ae870 (patch)
tree75d17bb906331213d5107a6be6446f58f0251541 /sysdep
parent4821612c94f9e935a6e841f6bcace9465dd2ad78 (diff)
parent7fb23041a52d01754c53ba963e2282e524813364 (diff)
Merge commit '7fb23041a52d01754c53ba963e2282e524813364' into thread-next
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/bsd/krt-sock.Y10
-rw-r--r--sysdep/bsd/krt-sock.c33
-rw-r--r--sysdep/bsd/krt-sys.h2
-rw-r--r--sysdep/unix/io.c2
-rw-r--r--sysdep/unix/log.c22
5 files changed, 67 insertions, 2 deletions
diff --git a/sysdep/bsd/krt-sock.Y b/sysdep/bsd/krt-sock.Y
index 8581bd43..a03d6df5 100644
--- a/sysdep/bsd/krt-sock.Y
+++ b/sysdep/bsd/krt-sock.Y
@@ -10,7 +10,7 @@ CF_HDR
CF_DECLS
-CF_KEYWORDS(KERNEL, TABLE)
+CF_KEYWORDS(KERNEL, TABLE, METRIC)
CF_GRAMMAR
@@ -25,6 +25,14 @@ kern_sys_item:
THIS_KRT->sys.table_id = $3;
}
+ | METRIC expr {
+ if ($2 && !krt_max_metric)
+ cf_error("Kernel route metric not supported");
+ if ($2 > krt_max_metric)
+ cf_error("Kernel table id must be in range 0-%u", krt_max_metric);
+
+ THIS_KRT->sys.metric = $2;
+ }
;
CF_CODE
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index fcf9ac4d..8e457c79 100644
--- a/sysdep/bsd/krt-sock.c
+++ b/sysdep/bsd/krt-sock.c
@@ -47,6 +47,11 @@ const int rt_default_ecmp = 0;
* table_id is specified explicitly as sysctl scan argument, while in FreeBSD it
* is handled implicitly by changing default table using setfib() syscall.
*
+ * OpenBSD allows to use route metric. The behavior is controlled by these macro
+ * KRT_USE_METRIC, which enables use of rtm_priority in route send/recevive.
+ * There is also KRT_DEFAULT_METRIC and KRT_MAX_METRIC for default and maximum
+ * metric values.
+ *
* KRT_SHARED_SOCKET - use shared kernel socked instead of one for each krt_proto
* KRT_USE_SETFIB_SCAN - use setfib() for sysctl() route scan
* KRT_USE_SETFIB_SOCK - use SO_SETFIB socket option for kernel sockets
@@ -63,6 +68,9 @@ const int rt_default_ecmp = 0;
#ifdef __OpenBSD__
#define KRT_MAX_TABLES (RT_TABLEID_MAX+1)
+#define KRT_USE_METRIC
+#define KRT_MAX_METRIC 255
+#define KRT_DEFAULT_METRIC 56
#define KRT_SHARED_SOCKET
#define KRT_USE_SYSCTL_7
#endif
@@ -71,6 +79,14 @@ const int rt_default_ecmp = 0;
#define KRT_MAX_TABLES 1
#endif
+#ifndef KRT_MAX_METRIC
+#define KRT_MAX_METRIC 0
+#endif
+
+#ifndef KRT_DEFAULT_METRIC
+#define KRT_DEFAULT_METRIC 0
+#endif
+
/* Dynamic max number of tables */
@@ -143,6 +159,10 @@ static struct krt_proto *krt_table_map[KRT_MAX_TABLES][2];
#endif
+/* Make it available to parser code */
+const uint krt_max_metric = KRT_MAX_METRIC;
+
+
/* Route socket message processing */
int
@@ -238,6 +258,10 @@ krt_send_route(struct krt_proto *p, int cmd, const rte *e)
msg.rtm.rtm_tableid = KRT_CF->sys.table_id;
#endif
+#ifdef KRT_USE_METRIC
+ msg.rtm.rtm_priority = KRT_CF->sys.metric;
+#endif
+
#ifdef RTF_REJECT
if(dest == RTD_UNREACHABLE)
msg.rtm.rtm_flags |= RTF_REJECT;
@@ -603,6 +627,11 @@ krt_read_route(struct ks_msg *msg, struct krt_proto *p, int scan)
ea_set_attr(&e0.attrs,
EA_LITERAL_EMBEDDED(&ea_krt_source, 0, src2));
+#ifdef KRT_USE_METRIC
+ ea_set_attr(&e0.attrs,
+ EA_LITERAL_EMBEDDED(&ea_krt_metric, 0, msg->rtm.rtm_priority));
+#endif
+
if (scan)
krt_got_route(p, &e0, src);
else
@@ -1163,7 +1192,7 @@ krt_sys_shutdown(struct krt_proto *p)
int
krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o)
{
- return n->sys.table_id == o->sys.table_id;
+ return (n->sys.table_id == o->sys.table_id) && (n->sys.metric == o->sys.metric);
}
void
@@ -1176,11 +1205,13 @@ krt_sys_preconfig(struct config *c UNUSED)
void krt_sys_init_config(struct krt_config *c)
{
c->sys.table_id = 0; /* Default table */
+ c->sys.metric = KRT_DEFAULT_METRIC;
}
void krt_sys_copy_config(struct krt_config *d, struct krt_config *s)
{
d->sys.table_id = s->sys.table_id;
+ d->sys.metric = s->sys.metric;
}
diff --git a/sysdep/bsd/krt-sys.h b/sysdep/bsd/krt-sys.h
index 57501884..198373c0 100644
--- a/sysdep/bsd/krt-sys.h
+++ b/sysdep/bsd/krt-sys.h
@@ -32,9 +32,11 @@ static inline void kif_sys_copy_config(struct kif_config *d UNUSED, struct kif_c
/* Kernel routes */
extern uint krt_max_tables;
+extern const uint krt_max_metric;
struct krt_params {
int table_id; /* Kernel table ID we sync with */
+ u32 metric; /* Kernel metric used for all routes */
};
struct krt_state {
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index c1466b56..fc1586ff 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -2154,6 +2154,8 @@ watchdog_sigalrm(int sig UNUSED)
config->latency_limit = 0xffffffff;
io_update_time();
+ debug_safe("Watchdog timer timed out\n");
+
/* We want core dump */
abort();
}
diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c
index 185231e8..d09481bc 100644
--- a/sysdep/unix/log.c
+++ b/sysdep/unix/log.c
@@ -32,6 +32,7 @@
#include "lib/lists.h"
#include "sysdep/unix/unix.h"
+static int dbg_fd = -1;
static FILE *dbgf;
static list *current_log_list;
static char *current_syslog_name; /* NULL -> syslog closed */
@@ -341,6 +342,21 @@ debug(const char *msg, ...)
va_end(args);
}
+/**
+ * debug_safe - async-safe write to debug output
+ * @msg: a string message
+ *
+ * This function prints the message @msg to the debugging output in a
+ * way that is async safe and can be used in signal handlers. No newline
+ * character is appended.
+ */
+void
+debug_safe(const char *msg)
+{
+ if (dbg_fd >= 0)
+ write(dbg_fd, msg, strlen(msg));
+}
+
static list *
default_log_list(int initial, const char **syslog_name)
{
@@ -441,8 +457,10 @@ log_init_debug(char *f)
{
clock_gettime(CLOCK_MONOTONIC, &dbg_time_start);
+ dbg_fd = -1;
if (dbgf && dbgf != stderr)
fclose(dbgf);
+
if (!f)
dbgf = NULL;
else if (!*f)
@@ -453,6 +471,10 @@ log_init_debug(char *f)
fprintf(stderr, "bird: Unable to open debug file %s: %s\n", f, strerror(errno));
exit(1);
}
+
if (dbgf)
+ {
setvbuf(dbgf, NULL, _IONBF, 0);
+ dbg_fd = fileno(dbgf);
+ }
}