summaryrefslogtreecommitdiff
path: root/sysdep
diff options
context:
space:
mode:
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/bsd/krt-sock.c3
-rw-r--r--sysdep/linux/krt-sys.h38
-rw-r--r--sysdep/linux/netlink.c23
-rw-r--r--sysdep/unix/krt.Y4
-rw-r--r--sysdep/unix/krt.c40
-rw-r--r--sysdep/unix/krt.h6
6 files changed, 55 insertions, 59 deletions
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index e56dd616..8522e415 100644
--- a/sysdep/bsd/krt-sock.c
+++ b/sysdep/bsd/krt-sock.c
@@ -347,8 +347,7 @@ krt_send_route(struct krt_proto *p, int cmd, rte *e)
}
void
-krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old,
- struct ea_list *eattrs UNUSED)
+krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old)
{
int err = 0;
diff --git a/sysdep/linux/krt-sys.h b/sysdep/linux/krt-sys.h
index 76ae29b7..2b8cdaa7 100644
--- a/sysdep/linux/krt-sys.h
+++ b/sysdep/linux/krt-sys.h
@@ -34,9 +34,9 @@ static inline struct ifa * kif_get_primary_ip(struct iface *i UNUSED) { return N
#define KRT_ALLOW_MERGE_PATHS 1
-#define EA_KRT_PREFSRC EA_CODE(EAP_KRT, 0x10)
-#define EA_KRT_REALM EA_CODE(EAP_KRT, 0x11)
-#define EA_KRT_SCOPE EA_CODE(EAP_KRT, 0x12)
+#define EA_KRT_PREFSRC EA_CODE(PROTOCOL_KERNEL, 0x10)
+#define EA_KRT_REALM EA_CODE(PROTOCOL_KERNEL, 0x11)
+#define EA_KRT_SCOPE EA_CODE(PROTOCOL_KERNEL, 0x12)
#define KRT_METRICS_MAX 0x10 /* RTAX_QUICKACK+1 */
@@ -48,22 +48,22 @@ static inline struct ifa * kif_get_primary_ip(struct iface *i UNUSED) { return N
* Following attributes are parts of RTA_METRICS kernel route attribute, their
* ids must be consistent with their RTAX_* constants (+ KRT_METRICS_OFFSET)
*/
-#define EA_KRT_METRICS EA_CODE(EAP_KRT, 0x20) /* Dummy one */
-#define EA_KRT_LOCK EA_CODE(EAP_KRT, 0x21)
-#define EA_KRT_MTU EA_CODE(EAP_KRT, 0x22)
-#define EA_KRT_WINDOW EA_CODE(EAP_KRT, 0x23)
-#define EA_KRT_RTT EA_CODE(EAP_KRT, 0x24)
-#define EA_KRT_RTTVAR EA_CODE(EAP_KRT, 0x25)
-#define EA_KRT_SSTRESH EA_CODE(EAP_KRT, 0x26)
-#define EA_KRT_CWND EA_CODE(EAP_KRT, 0x27)
-#define EA_KRT_ADVMSS EA_CODE(EAP_KRT, 0x28)
-#define EA_KRT_REORDERING EA_CODE(EAP_KRT, 0x29)
-#define EA_KRT_HOPLIMIT EA_CODE(EAP_KRT, 0x2a)
-#define EA_KRT_INITCWND EA_CODE(EAP_KRT, 0x2b)
-#define EA_KRT_FEATURES EA_CODE(EAP_KRT, 0x2c)
-#define EA_KRT_RTO_MIN EA_CODE(EAP_KRT, 0x2d)
-#define EA_KRT_INITRWND EA_CODE(EAP_KRT, 0x2e)
-#define EA_KRT_QUICKACK EA_CODE(EAP_KRT, 0x2f)
+#define EA_KRT_METRICS EA_CODE(PROTOCOL_KERNEL, 0x20) /* Dummy one */
+#define EA_KRT_LOCK EA_CODE(PROTOCOL_KERNEL, 0x21)
+#define EA_KRT_MTU EA_CODE(PROTOCOL_KERNEL, 0x22)
+#define EA_KRT_WINDOW EA_CODE(PROTOCOL_KERNEL, 0x23)
+#define EA_KRT_RTT EA_CODE(PROTOCOL_KERNEL, 0x24)
+#define EA_KRT_RTTVAR EA_CODE(PROTOCOL_KERNEL, 0x25)
+#define EA_KRT_SSTRESH EA_CODE(PROTOCOL_KERNEL, 0x26)
+#define EA_KRT_CWND EA_CODE(PROTOCOL_KERNEL, 0x27)
+#define EA_KRT_ADVMSS EA_CODE(PROTOCOL_KERNEL, 0x28)
+#define EA_KRT_REORDERING EA_CODE(PROTOCOL_KERNEL, 0x29)
+#define EA_KRT_HOPLIMIT EA_CODE(PROTOCOL_KERNEL, 0x2a)
+#define EA_KRT_INITCWND EA_CODE(PROTOCOL_KERNEL, 0x2b)
+#define EA_KRT_FEATURES EA_CODE(PROTOCOL_KERNEL, 0x2c)
+#define EA_KRT_RTO_MIN EA_CODE(PROTOCOL_KERNEL, 0x2d)
+#define EA_KRT_INITRWND EA_CODE(PROTOCOL_KERNEL, 0x2e)
+#define EA_KRT_QUICKACK EA_CODE(PROTOCOL_KERNEL, 0x2f)
/* Bits of EA_KRT_LOCK, also based on RTAX_* constants */
#define EA_KRT_LOCK_MTU EA_KRT_LOCK | EA_BIT(0x2)
diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index 84591eb2..73f77147 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -1177,11 +1177,12 @@ nh_bufsize(struct nexthop *nh)
}
static int
-nl_send_route(struct krt_proto *p, rte *e, struct ea_list *eattrs, int op, int dest, struct nexthop *nh)
+nl_send_route(struct krt_proto *p, rte *e, int op, int dest, struct nexthop *nh)
{
eattr *ea;
net *net = e->net;
rta *a = e->attrs;
+ ea_list *eattrs = a->eattrs;
int bufsize = 128 + KRT_METRICS_MAX*8 + nh_bufsize(&(a->nh));
u32 priority = 0;
@@ -1328,7 +1329,7 @@ dest:
}
static inline int
-nl_add_rte(struct krt_proto *p, rte *e, struct ea_list *eattrs)
+nl_add_rte(struct krt_proto *p, rte *e)
{
rta *a = e->attrs;
int err = 0;
@@ -1337,34 +1338,34 @@ nl_add_rte(struct krt_proto *p, rte *e, struct ea_list *eattrs)
{
struct nexthop *nh = &(a->nh);
- err = nl_send_route(p, e, eattrs, NL_OP_ADD, RTD_UNICAST, nh);
+ err = nl_send_route(p, e, NL_OP_ADD, RTD_UNICAST, nh);
if (err < 0)
return err;
for (nh = nh->next; nh; nh = nh->next)
- err += nl_send_route(p, e, eattrs, NL_OP_APPEND, RTD_UNICAST, nh);
+ err += nl_send_route(p, e, NL_OP_APPEND, RTD_UNICAST, nh);
return err;
}
- return nl_send_route(p, e, eattrs, NL_OP_ADD, a->dest, &(a->nh));
+ return nl_send_route(p, e, NL_OP_ADD, a->dest, &(a->nh));
}
static inline int
-nl_delete_rte(struct krt_proto *p, rte *e, struct ea_list *eattrs)
+nl_delete_rte(struct krt_proto *p, rte *e)
{
int err = 0;
/* For IPv6, we just repeatedly request DELETE until we get error */
do
- err = nl_send_route(p, e, eattrs, NL_OP_DELETE, RTD_NONE, NULL);
+ err = nl_send_route(p, e, NL_OP_DELETE, RTD_NONE, NULL);
while (krt_ecmp6(p) && !err);
return err;
}
void
-krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old, struct ea_list *eattrs)
+krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old)
{
int err = 0;
@@ -1380,10 +1381,10 @@ krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old, struct ea_list
*/
if (old)
- nl_delete_rte(p, old, eattrs);
+ nl_delete_rte(p, old);
if (new)
- err = nl_add_rte(p, new, eattrs);
+ err = nl_add_rte(p, new);
if (err < 0)
n->n.flags |= KRF_SYNC_ERROR;
@@ -1751,7 +1752,7 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h)
for (t = 1; t < KRT_METRICS_MAX; t++)
if (metrics[0] & (1 << t))
{
- ea->attrs[n].id = EA_CODE(EAP_KRT, KRT_METRICS_OFFSET + t);
+ ea->attrs[n].id = EA_CODE(PROTOCOL_KERNEL, KRT_METRICS_OFFSET + t);
ea->attrs[n].flags = 0;
ea->attrs[n].type = EAF_TYPE_INT; /* FIXME: Some are EAF_TYPE_BITFIELD */
ea->attrs[n].u.data = metrics[t];
diff --git a/sysdep/unix/krt.Y b/sysdep/unix/krt.Y
index 9aac8668..98740b70 100644
--- a/sysdep/unix/krt.Y
+++ b/sysdep/unix/krt.Y
@@ -122,8 +122,8 @@ kif_iface:
kif_iface_start iface_patt_list_nopx kif_iface_opt_list;
-CF_ADDTO(dynamic_attr, KRT_SOURCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_KRT_SOURCE); })
-CF_ADDTO(dynamic_attr, KRT_METRIC { $$ = f_new_dynamic_attr(EAF_TYPE_INT | EAF_TEMP, T_INT, EA_KRT_METRIC); })
+CF_ADDTO(dynamic_attr, KRT_SOURCE { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_SOURCE); })
+CF_ADDTO(dynamic_attr, KRT_METRIC { $$ = f_new_dynamic_attr(EAF_TYPE_INT, T_INT, EA_KRT_METRIC); })
CF_CODE
diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
index b4fb1967..a79df54e 100644
--- a/sysdep/unix/krt.c
+++ b/sysdep/unix/krt.c
@@ -232,6 +232,7 @@ kif_copy_config(struct proto_config *dest, struct proto_config *src)
struct protocol proto_unix_iface = {
.name = "Device",
.template = "device%d",
+ .class = PROTOCOL_DEVICE,
.proto_size = sizeof(struct kif_proto),
.config_size = sizeof(struct kif_config),
.preconfig = kif_preconfig,
@@ -550,7 +551,7 @@ krt_flush_routes(struct krt_proto *p)
if (rte_is_valid(e) && (n->n.flags & KRF_INSTALLED))
{
/* FIXME: this does not work if gw is changed in export filter */
- krt_replace_rte(p, e->net, NULL, e, NULL);
+ krt_replace_rte(p, e->net, NULL, e);
n->n.flags &= ~KRF_INSTALLED;
}
}
@@ -558,14 +559,14 @@ krt_flush_routes(struct krt_proto *p)
}
static struct rte *
-krt_export_net(struct krt_proto *p, net *net, rte **rt_free, ea_list **tmpa)
+krt_export_net(struct krt_proto *p, net *net, rte **rt_free)
{
struct channel *c = p->p.main_channel;
struct filter *filter = c->out_filter;
rte *rt;
if (c->ra_mode == RA_MERGED)
- return rt_export_merged(c, net, rt_free, tmpa, krt_filter_lp, 1);
+ return rt_export_merged(c, net, rt_free, krt_filter_lp, 1);
rt = net->routes;
*rt_free = NULL;
@@ -576,15 +577,14 @@ krt_export_net(struct krt_proto *p, net *net, rte **rt_free, ea_list **tmpa)
if (filter == FILTER_REJECT)
return NULL;
- struct proto *src = rt->attrs->src->proto;
- *tmpa = src->make_tmp_attrs ? src->make_tmp_attrs(rt, krt_filter_lp) : NULL;
+ rte_make_tmp_attrs(&rt, krt_filter_lp);
/* We could run krt_import_control() here, but it is already handled by KRF_INSTALLED */
if (filter == FILTER_ACCEPT)
goto accept;
- if (f_run(filter, &rt, tmpa, krt_filter_lp, FF_FORCE_TMPATTR | FF_SILENT) > F_ACCEPT)
+ if (f_run(filter, &rt, krt_filter_lp, FF_SILENT) > F_ACCEPT)
goto reject;
@@ -666,9 +666,8 @@ krt_got_route(struct krt_proto *p, rte *e)
if (net->n.flags & KRF_INSTALLED)
{
rte *new, *rt_free;
- ea_list *tmpa;
- new = krt_export_net(p, net, &rt_free, &tmpa);
+ new = krt_export_net(p, net, &rt_free);
/* TODO: There also may be changes in route eattrs, we ignore that for now. */
@@ -713,7 +712,6 @@ krt_prune(struct krt_proto *p)
{
int verdict = n->n.flags & KRF_VERDICT_MASK;
rte *new, *old, *rt_free = NULL;
- ea_list *tmpa = NULL;
if (verdict == KRF_UPDATE || verdict == KRF_DELETE)
{
@@ -727,12 +725,10 @@ krt_prune(struct krt_proto *p)
if (verdict == KRF_CREATE || verdict == KRF_UPDATE)
{
/* We have to run export filter to get proper 'new' route */
- new = krt_export_net(p, n, &rt_free, &tmpa);
+ new = krt_export_net(p, n, &rt_free);
if (!new)
verdict = (verdict == KRF_CREATE) ? KRF_IGNORE : KRF_DELETE;
- else
- tmpa = ea_append(tmpa, new->attrs->eattrs);
}
else
new = NULL;
@@ -743,7 +739,7 @@ krt_prune(struct krt_proto *p)
if (new && (n->n.flags & KRF_INSTALLED))
{
krt_trace_in(p, new, "reinstalling");
- krt_replace_rte(p, n, new, NULL, tmpa);
+ krt_replace_rte(p, n, new, NULL);
}
break;
case KRF_SEEN:
@@ -752,11 +748,11 @@ krt_prune(struct krt_proto *p)
break;
case KRF_UPDATE:
krt_trace_in(p, new, "updating");
- krt_replace_rte(p, n, new, old, tmpa);
+ krt_replace_rte(p, n, new, old);
break;
case KRF_DELETE:
krt_trace_in(p, old, "deleting");
- krt_replace_rte(p, n, NULL, old, NULL);
+ krt_replace_rte(p, n, NULL, old);
break;
default:
bug("krt_prune: invalid route status");
@@ -794,7 +790,7 @@ krt_got_route_async(struct krt_proto *p, rte *e, int new)
if (new)
{
krt_trace_in(p, e, "[redirect] deleting");
- krt_replace_rte(p, net, NULL, e, NULL);
+ krt_replace_rte(p, net, NULL, e);
}
/* If !new, it is probably echo of our deletion */
break;
@@ -936,14 +932,14 @@ krt_make_tmp_attrs(rte *rt, struct linpool *pool)
}
static void
-krt_store_tmp_attrs(rte *rt, struct ea_list *attrs)
+krt_store_tmp_attrs(rte *rt)
{
/* EA_KRT_SOURCE is read-only */
- rt->u.krt.metric = ea_get_int(attrs, EA_KRT_METRIC, 0);
+ rt->u.krt.metric = ea_get_int(rt->attrs->eattrs, EA_KRT_METRIC, 0);
}
static int
-krt_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct linpool *pool UNUSED)
+krt_import_control(struct proto *P, rte **new, struct linpool *pool UNUSED)
{
// struct krt_proto *p = (struct krt_proto *) P;
rte *e = *new;
@@ -974,7 +970,7 @@ krt_import_control(struct proto *P, rte **new, ea_list **attrs UNUSED, struct li
static void
krt_rt_notify(struct proto *P, struct channel *ch UNUSED, net *net,
- rte *new, rte *old, struct ea_list *eattrs)
+ rte *new, rte *old)
{
struct krt_proto *p = (struct krt_proto *) P;
@@ -987,7 +983,7 @@ krt_rt_notify(struct proto *P, struct channel *ch UNUSED, net *net,
else
net->n.flags &= ~KRF_INSTALLED;
if (p->initialized) /* Before first scan we don't touch the routes */
- krt_replace_rte(p, net, new, old, eattrs);
+ krt_replace_rte(p, net, new, old);
}
static void
@@ -1235,7 +1231,7 @@ krt_get_attr(eattr *a, byte *buf, int buflen)
struct protocol proto_unix_kernel = {
.name = "Kernel",
.template = "kernel%d",
- .attr_class = EAP_KRT,
+ .class = PROTOCOL_KERNEL,
.preference = DEF_PREF_INHERITED,
.channel_mask = NB_IP | MAYBE_IP6_SADR | MAYBE_MPLS,
.proto_size = sizeof(struct krt_proto),
diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h
index b627882d..6ace2a86 100644
--- a/sysdep/unix/krt.h
+++ b/sysdep/unix/krt.h
@@ -30,8 +30,8 @@ struct kif_proto;
#define KRT_DEFAULT_ECMP_LIMIT 16
-#define EA_KRT_SOURCE EA_CODE(EAP_KRT, 0)
-#define EA_KRT_METRIC EA_CODE(EAP_KRT, 1)
+#define EA_KRT_SOURCE EA_CODE(PROTOCOL_KERNEL, 0)
+#define EA_KRT_METRIC EA_CODE(PROTOCOL_KERNEL, 1)
/* Whenever we recognize our own routes, we allow learing of foreign routes */
@@ -139,7 +139,7 @@ void krt_sys_copy_config(struct krt_config *, struct krt_config *);
int krt_capable(rte *e);
void krt_do_scan(struct krt_proto *);
-void krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old, struct ea_list *eattrs);
+void krt_replace_rte(struct krt_proto *p, net *n, rte *new, rte *old);
int krt_sys_get_attr(eattr *a, byte *buf, int buflen);