diff options
author | markj <markj@FreeBSD.org> | 2016-02-12 21:06:48 +0000 |
---|---|---|
committer | markj <markj@FreeBSD.org> | 2016-02-12 21:06:48 +0000 |
commit | e659a689f9d8783176a86c10c3cd713f6eea1085 (patch) | |
tree | 194f278c9cafb1caa49ddd7c7a6f564db2b0229c /sys/netinet6/nd6_rtr.c | |
parent | 151140ce44d0ffb4a2d43476e512f32f05c0e07a (diff) | |
download | FreeBSD-src-e659a689f9d8783176a86c10c3cd713f6eea1085.zip FreeBSD-src-e659a689f9d8783176a86c10c3cd713f6eea1085.tar.gz |
Simplify defrtrlist_update() slightly in preparation for future changes.
No functional change intended.
MFC after: 1 week
Diffstat (limited to 'sys/netinet6/nd6_rtr.c')
-rw-r--r-- | sys/netinet6/nd6_rtr.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index d9af24c..a51fa7d 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -734,42 +734,37 @@ static struct nd_defrouter * defrtrlist_update(struct nd_defrouter *new) { struct nd_defrouter *dr, *n; + int oldpref; if ((dr = defrouter_lookup(&new->rtaddr, new->ifp)) != NULL) { /* entry exists */ if (new->rtlifetime == 0) { defrtrlist_del(dr); - dr = NULL; - } else { - int oldpref = rtpref(dr); + return (NULL); + } - /* override */ - dr->flags = new->flags; /* xxx flag check */ - dr->rtlifetime = new->rtlifetime; - dr->expire = new->expire; + oldpref = rtpref(dr); - /* - * If the preference does not change, there's no need - * to sort the entries. Also make sure the selected - * router is still installed in the kernel. - */ - if (dr->installed && rtpref(new) == oldpref) - return (dr); + /* override */ + dr->flags = new->flags; /* xxx flag check */ + dr->rtlifetime = new->rtlifetime; + dr->expire = new->expire; - /* - * preferred router may be changed, so relocate - * this router. - * XXX: calling TAILQ_REMOVE directly is a bad manner. - * However, since defrtrlist_del() has many side - * effects, we intentionally do so here. - * defrouter_select() below will handle routing - * changes later. - */ - TAILQ_REMOVE(&V_nd_defrouter, dr, dr_entry); - n = dr; - goto insert; - } - return (dr); + /* + * If the preference does not change, there's no need + * to sort the entries. Also make sure the selected + * router is still installed in the kernel. + */ + if (dr->installed && rtpref(new) == oldpref) + return (dr); + + /* + * The preferred router may have changed, so relocate this + * router. + */ + TAILQ_REMOVE(&V_nd_defrouter, dr, dr_entry); + n = dr; + goto insert; } /* entry does not exist */ |