diff options
Diffstat (limited to 'sysdep')
-rw-r--r-- | sysdep/bsd/krt-sock.c | 3 | ||||
-rw-r--r-- | sysdep/linux/krt-sys.h | 38 | ||||
-rw-r--r-- | sysdep/linux/netlink.c | 23 | ||||
-rw-r--r-- | sysdep/unix/krt.Y | 4 | ||||
-rw-r--r-- | sysdep/unix/krt.c | 40 | ||||
-rw-r--r-- | sysdep/unix/krt.h | 6 |
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); |