summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/ospf6d/kroute.c44
-rw-r--r--usr.sbin/ospf6d/ospf6d.h8
-rw-r--r--usr.sbin/ospf6d/rde.c67
3 files changed, 56 insertions, 63 deletions
diff --git a/usr.sbin/ospf6d/kroute.c b/usr.sbin/ospf6d/kroute.c
index 3b5a6d0db76..091cd9aa3d0 100644
--- a/usr.sbin/ospf6d/kroute.c
+++ b/usr.sbin/ospf6d/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.49 2016/12/22 23:01:58 jca Exp $ */
+/* $OpenBSD: kroute.c,v 1.50 2016/12/27 17:18:56 jca Exp $ */
/*
* Copyright (c) 2004 Esben Norby <norby@openbsd.org>
@@ -51,12 +51,12 @@ struct {
struct kroute_node {
RB_ENTRY(kroute_node) entry;
- struct kroute r;
struct kroute_node *next;
+ struct kroute r;
};
void kr_redist_remove(struct kroute_node *, struct kroute_node *);
-int kr_redist_eval(struct kroute *, struct rroute *);
+int kr_redist_eval(struct kroute *, struct kroute *);
void kr_redistribute(struct kroute_node *);
int kroute_compare(struct kroute_node *, struct kroute_node *);
@@ -344,7 +344,7 @@ kr_show_route(struct imsg *imsg)
void
kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn)
{
- struct rroute rr;
+ struct kroute *kr;
/* was the route redistributed? */
if ((kn->r.flags & F_REDISTRIBUTED) == 0)
@@ -352,8 +352,7 @@ kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn)
/* remove redistributed flag */
kn->r.flags &= ~F_REDISTRIBUTED;
- rr.kr = kn->r;
- rr.metric = DEFAULT_REDIST_METRIC; /* some dummy value */
+ kr = &kn->r;
/* probably inform the RDE (check if no other path is redistributed) */
for (kn = kh; kn; kn = kn->next)
@@ -361,12 +360,12 @@ kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn)
break;
if (kn == NULL)
- main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &rr,
- sizeof(struct rroute));
+ main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, kr,
+ sizeof(struct kroute));
}
int
-kr_redist_eval(struct kroute *kr, struct rroute *rr)
+kr_redist_eval(struct kroute *kr, struct kroute *new_kr)
{
u_int32_t metric = 0;
@@ -411,9 +410,9 @@ kr_redist_eval(struct kroute *kr, struct rroute *rr)
* only one of all multipath routes can be redistributed so
* redistribute the best one.
*/
- if (rr->metric > metric) {
- rr->kr = *kr;
- rr->metric = metric;
+ if (new_kr->metric > metric) {
+ *new_kr = *kr;
+ new_kr->metric = metric;
}
return (1);
@@ -431,26 +430,25 @@ void
kr_redistribute(struct kroute_node *kh)
{
struct kroute_node *kn;
- struct rroute rr;
+ struct kroute kr;
int redistribute = 0;
- bzero(&rr, sizeof(rr));
- rr.metric = UINT_MAX;
+ bzero(&kr, sizeof(kr));
+ kr.metric = UINT_MAX;
for (kn = kh; kn; kn = kn->next)
- if (kr_redist_eval(&kn->r, &rr))
+ if (kr_redist_eval(&kn->r, &kr))
redistribute = 1;
if (!redistribute)
return;
- if (rr.kr.flags & F_REDISTRIBUTED) {
- main_imsg_compose_rde(IMSG_NETWORK_ADD, 0, &rr,
- sizeof(struct rroute));
+ if (kr.flags & F_REDISTRIBUTED) {
+ main_imsg_compose_rde(IMSG_NETWORK_ADD, 0, &kr,
+ sizeof(struct kroute));
} else {
- rr.metric = DEFAULT_REDIST_METRIC; /* some dummy value */
- rr.kr = kh->r;
- main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &rr,
- sizeof(struct rroute));
+ kr = kh->r;
+ main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &kr,
+ sizeof(struct kroute));
}
}
diff --git a/usr.sbin/ospf6d/ospf6d.h b/usr.sbin/ospf6d/ospf6d.h
index cb3beccc7a1..f94debefa96 100644
--- a/usr.sbin/ospf6d/ospf6d.h
+++ b/usr.sbin/ospf6d/ospf6d.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ospf6d.h,v 1.30 2016/09/02 14:06:35 benno Exp $ */
+/* $OpenBSD: ospf6d.h,v 1.31 2016/12/27 17:18:56 jca Exp $ */
/*
* Copyright (c) 2004, 2007 Esben Norby <norby@openbsd.org>
@@ -390,6 +390,7 @@ struct kroute {
struct in6_addr prefix;
struct in6_addr nexthop;
u_int32_t ext_tag;
+ u_int32_t metric;
unsigned int scope; /* scope of nexthop */
u_int16_t flags;
u_int16_t rtlabel;
@@ -397,11 +398,6 @@ struct kroute {
u_int8_t prefixlen;
};
-struct rroute {
- struct kroute kr;
- u_int32_t metric;
-};
-
/* name2id */
struct n2id_label {
TAILQ_ENTRY(n2id_label) entry;
diff --git a/usr.sbin/ospf6d/rde.c b/usr.sbin/ospf6d/rde.c
index 61e6aff298e..dbf9548bcf4 100644
--- a/usr.sbin/ospf6d/rde.c
+++ b/usr.sbin/ospf6d/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.68 2016/09/03 10:25:36 renato Exp $ */
+/* $OpenBSD: rde.c,v 1.69 2016/12/27 17:18:56 jca Exp $ */
/*
* Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org>
@@ -59,11 +59,11 @@ int rde_req_list_exists(struct rde_nbr *, struct lsa_hdr *);
void rde_req_list_del(struct rde_nbr *, struct lsa_hdr *);
void rde_req_list_free(struct rde_nbr *);
-struct lsa *rde_asext_get(struct rroute *);
-struct lsa *rde_asext_put(struct rroute *);
+struct lsa *rde_asext_get(struct kroute *);
+struct lsa *rde_asext_put(struct kroute *);
int comp_asext(struct lsa *, struct lsa *);
-struct lsa *orig_asext_lsa(struct rroute *, u_int16_t);
+struct lsa *orig_asext_lsa(struct kroute *, u_int16_t);
struct lsa *orig_sum_lsa(struct rt_node *, struct area *, u_int8_t, int);
struct lsa *orig_intra_lsa_net(struct area *, struct iface *,
struct vertex *);
@@ -629,7 +629,6 @@ rde_dispatch_parent(int fd, short event, void *bula)
struct iface_addr *ia, *nia;
struct imsg imsg;
struct kroute kr;
- struct rroute rr;
struct imsgev *iev = bula;
struct imsgbuf *ibuf = &iev->ibuf;
struct lsa *lsa;
@@ -660,14 +659,14 @@ rde_dispatch_parent(int fd, short event, void *bula)
switch (imsg.hdr.type) {
case IMSG_NETWORK_ADD:
- if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(rr)) {
+ if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) {
log_warnx("rde_dispatch_parent: "
"wrong imsg len");
break;
}
- memcpy(&rr, imsg.data, sizeof(rr));
+ memcpy(&kr, imsg.data, sizeof(kr));
- if ((lsa = rde_asext_get(&rr)) != NULL) {
+ if ((lsa = rde_asext_get(&kr)) != NULL) {
v = lsa_find(NULL, lsa->hdr.type,
lsa->hdr.ls_id, lsa->hdr.adv_rtr);
@@ -675,14 +674,14 @@ rde_dispatch_parent(int fd, short event, void *bula)
}
break;
case IMSG_NETWORK_DEL:
- if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(rr)) {
+ if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) {
log_warnx("rde_dispatch_parent: "
"wrong imsg len");
break;
}
- memcpy(&rr, imsg.data, sizeof(rr));
+ memcpy(&kr, imsg.data, sizeof(kr));
- if ((lsa = rde_asext_put(&rr)) != NULL) {
+ if ((lsa = rde_asext_put(&kr)) != NULL) {
v = lsa_find(NULL, lsa->hdr.type,
lsa->hdr.ls_id, lsa->hdr.adv_rtr);
@@ -1185,7 +1184,7 @@ rde_req_list_free(struct rde_nbr *nbr)
* as-external LSA handling
*/
struct lsa *
-rde_asext_get(struct rroute *rr)
+rde_asext_get(struct kroute *kr)
{
struct area *area;
struct iface *iface;
@@ -1199,25 +1198,25 @@ rde_asext_get(struct rroute *rr)
continue;
inet6applymask(&addr, &ia->addr,
- rr->kr.prefixlen);
- if (!memcmp(&addr, &rr->kr.prefix,
- sizeof(addr)) && rr->kr.prefixlen ==
+ kr->prefixlen);
+ if (!memcmp(&addr, &kr->prefix,
+ sizeof(addr)) && kr->prefixlen ==
ia->prefixlen) {
/* already announced as Prefix LSA */
log_debug("rde_asext_get: %s/%d is "
"part of prefix LSA",
- log_in6addr(&rr->kr.prefix),
- rr->kr.prefixlen);
+ log_in6addr(&kr->prefix),
+ kr->prefixlen);
return (NULL);
}
}
/* update of seqnum is done by lsa_merge */
- return (orig_asext_lsa(rr, DEFAULT_AGE));
+ return (orig_asext_lsa(kr, DEFAULT_AGE));
}
struct lsa *
-rde_asext_put(struct rroute *rr)
+rde_asext_put(struct kroute *kr)
{
/*
* just try to remove the LSA. If the prefix is announced as
@@ -1225,7 +1224,7 @@ rde_asext_put(struct rroute *rr)
*/
/* remove by reflooding with MAX_AGE */
- return (orig_asext_lsa(rr, MAX_AGE));
+ return (orig_asext_lsa(kr, MAX_AGE));
}
/*
@@ -1601,14 +1600,14 @@ comp_asext(struct lsa *a, struct lsa *b)
}
struct lsa *
-orig_asext_lsa(struct rroute *rr, u_int16_t age)
+orig_asext_lsa(struct kroute *kr, u_int16_t age)
{
struct lsa *lsa;
u_int32_t ext_tag;
u_int16_t len, ext_off;
len = sizeof(struct lsa_hdr) + sizeof(struct lsa_asext) +
- LSA_PREFIXSIZE(rr->kr.prefixlen);
+ LSA_PREFIXSIZE(kr->prefixlen);
/*
* nexthop -- on connected routes we are the nexthop,
@@ -1618,14 +1617,14 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age)
*/
ext_off = len;
- if (rr->kr.ext_tag) {
+ if (kr->ext_tag) {
len += sizeof(ext_tag);
}
if ((lsa = calloc(1, len)) == NULL)
fatal("orig_asext_lsa");
log_debug("orig_asext_lsa: %s/%d age %d",
- log_in6addr(&rr->kr.prefix), rr->kr.prefixlen, age);
+ log_in6addr(&kr->prefix), kr->prefixlen, age);
/* LSA header */
lsa->hdr.age = htons(age);
@@ -1634,9 +1633,9 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age)
lsa->hdr.seq_num = htonl(INIT_SEQ_NUM);
lsa->hdr.len = htons(len);
- lsa->data.asext.prefix.prefixlen = rr->kr.prefixlen;
+ lsa->data.asext.prefix.prefixlen = kr->prefixlen;
memcpy((char *)lsa + sizeof(struct lsa_hdr) + sizeof(struct lsa_asext),
- &rr->kr.prefix, LSA_PREFIXSIZE(rr->kr.prefixlen));
+ &kr->prefix, LSA_PREFIXSIZE(kr->prefixlen));
lsa->hdr.ls_id = lsa_find_lsid(&asext_tree, lsa->hdr.type,
lsa->hdr.adv_rtr, comp_asext, lsa);
@@ -1650,22 +1649,22 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age)
v = lsa_find(NULL, lsa->hdr.type, lsa->hdr.ls_id,
lsa->hdr.adv_rtr);
if (v != NULL) {
- rr->metric = ntohl(v->lsa->data.asext.metric);
- if (rr->metric & LSA_ASEXT_T_FLAG) {
+ kr->metric = ntohl(v->lsa->data.asext.metric);
+ if (kr->metric & LSA_ASEXT_T_FLAG) {
memcpy(&ext_tag, (char *)v->lsa + ext_off,
sizeof(ext_tag));
- rr->kr.ext_tag = ntohl(ext_tag);
+ kr->ext_tag = ntohl(ext_tag);
}
- rr->metric &= LSA_METRIC_MASK;
+ kr->metric &= LSA_METRIC_MASK;
}
}
- if (rr->kr.ext_tag) {
- lsa->data.asext.metric = htonl(rr->metric | LSA_ASEXT_T_FLAG);
- ext_tag = htonl(rr->kr.ext_tag);
+ if (kr->ext_tag) {
+ lsa->data.asext.metric = htonl(kr->metric | LSA_ASEXT_T_FLAG);
+ ext_tag = htonl(kr->ext_tag);
memcpy((char *)lsa + ext_off, &ext_tag, sizeof(ext_tag));
} else {
- lsa->data.asext.metric = htonl(rr->metric);
+ lsa->data.asext.metric = htonl(kr->metric);
}
lsa->hdr.ls_chksum = 0;