Merge remote-tracking branch 'savannah/sf/ospfd'
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/lib/vty.h b/lib/vty.h
index e515868..1798585 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -149,8 +149,8 @@
#define PRINTF_ATTRIBUTE(a,b)
#endif /* __GNUC__ */
-/* Utility macros to convert VTY argument to unsigned long or integer. */
-#define VTY_GET_LONG(NAME,V,STR) \
+/* Utility macros to convert VTY argument to unsigned long */
+#define VTY_GET_ULONG(NAME,V,STR) \
do { \
char *endptr = NULL; \
errno = 0; \
@@ -162,20 +162,38 @@
} \
} while (0)
-#define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX) \
-do { \
- unsigned long tmpl; \
- VTY_GET_LONG(NAME, tmpl, STR); \
- if ( (tmpl < (MIN)) || (tmpl > (MAX))) \
- { \
- vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE); \
- return CMD_WARNING; \
- } \
- (V) = tmpl; \
+/*
+ * The logic below ((TMPL) <= ((MIN) && (TMPL) != (MIN)) is
+ * done to circumvent the compiler complaining about
+ * comparing unsigned numbers against zero, if MIN is zero.
+ * NB: The compiler isn't smart enough to supress the warning
+ * if you write (MIN) != 0 && tmpl < (MIN).
+ */
+#define VTY_GET_INTEGER_RANGE_HEART(NAME,TMPL,STR,MIN,MAX) \
+do { \
+ VTY_GET_ULONG(NAME, (TMPL), STR); \
+ if ( ((TMPL) <= (MIN) && (TMPL) != (MIN)) || (TMPL) > (MAX) ) \
+ { \
+ vty_out (vty, "%% Invalid %s value%s", NAME, VTY_NEWLINE);\
+ return CMD_WARNING; \
+ } \
} while (0)
-#define VTY_GET_INTEGER(NAME,V,STR) \
- VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
+#define VTY_GET_INTEGER_RANGE(NAME,V,STR,MIN,MAX) \
+do { \
+ unsigned long tmpl; \
+ VTY_GET_INTEGER_RANGE_HEART(NAME,tmpl,STR,MIN,MAX); \
+ (V) = tmpl; \
+} while (0)
+
+#define VTY_CHECK_INTEGER_RANGE(NAME,STR,MIN,MAX) \
+do { \
+ unsigned long tmpl; \
+ VTY_GET_INTEGER_RANGE_HEART(NAME,tmpl,STR,MIN,MAX); \
+} while (0)
+
+#define VTY_GET_INTEGER(NAME,V,STR) \
+ VTY_GET_INTEGER_RANGE(NAME,V,STR,0U,UINT32_MAX)
#define VTY_GET_IPV4_ADDRESS(NAME,V,STR) \
do { \
diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c
index f5edc99..4770275 100644
--- a/ospfd/ospf_abr.c
+++ b/ospfd/ospf_abr.c
@@ -1140,7 +1140,8 @@
GET_METRIC (slsa->metric), cost);
}
- if (old && (GET_METRIC (slsa->metric) == cost))
+ if (old && (GET_METRIC (slsa->metric) == cost) &&
+ ((old->flags & OSPF_LSA_IN_MAXAGE) == 0))
{
if (IS_DEBUG_OSPF_EVENT)
zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary approved");
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c
index 84d70cc..db1ccda 100644
--- a/ospfd/ospf_apiserver.c
+++ b/ospfd/ospf_apiserver.c
@@ -299,13 +299,10 @@
ospf_apiserver_event (enum event event, int fd,
struct ospf_apiserver *apiserv)
{
- struct thread *apiserver_serv_thread;
-
switch (event)
{
case OSPF_APISERVER_ACCEPT:
- apiserver_serv_thread =
- thread_add_read (master, ospf_apiserver_accept, apiserv, fd);
+ (void)thread_add_read (master, ospf_apiserver_accept, apiserv, fd);
break;
case OSPF_APISERVER_SYNC_READ:
apiserv->t_sync_read =
diff --git a/ospfd/ospf_ism.c b/ospfd/ospf_ism.c
index db53882..fa7d97f 100644
--- a/ospfd/ospf_ism.c
+++ b/ospfd/ospf_ism.c
@@ -203,7 +203,6 @@
struct in_addr old_dr, old_bdr;
int old_state, new_state;
struct list *el_list;
- struct ospf_neighbor *dr, *bdr;
/* backup current values. */
old_dr = DR (oi);
@@ -216,8 +215,8 @@
ospf_dr_eligible_routers (oi->nbrs, el_list);
/* First election of DR and BDR. */
- bdr = ospf_elect_bdr (oi, el_list);
- dr = ospf_elect_dr (oi, el_list);
+ ospf_elect_bdr (oi, el_list);
+ ospf_elect_dr (oi, el_list);
new_state = ospf_ism_state (oi);
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index e778251..dfd1a61 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -1340,12 +1340,8 @@
ospf_summary_asbr_lsa_body_set (struct stream *s, struct prefix *p,
u_int32_t metric)
{
- struct in_addr mask;
-
- masklen2ip (p->prefixlen, &mask);
-
/* Put Network Mask. */
- stream_put_ipv4 (s, mask.s_addr);
+ stream_put_ipv4 (s, (u_int32_t) 0);
/* Set # TOS. */
stream_putc (s, (u_char) 0);
@@ -2737,7 +2733,9 @@
if (IS_LSA_SELF (lsa))
lsa->oi = oi; /* Specify outgoing ospf-interface for this LSA. */
else
- ; /* Incoming "oi" for this LSA has set at LSUpd reception. */
+ {
+ /* Incoming "oi" for this LSA has set at LSUpd reception. */
+ }
/* Fallthrough */
case OSPF_OPAQUE_AREA_LSA:
case OSPF_OPAQUE_AS_LSA:
@@ -2782,15 +2780,14 @@
If received LSA' ls_age is MaxAge, or lsa is being prematurely aged
(it's getting flushed out of the area), set LSA on MaxAge LSA list.
*/
- if ((lsa->flags & OSPF_LSA_PREMATURE_AGE) ||
- (IS_LSA_MAXAGE (new) && !IS_LSA_SELF (new)))
+ if (IS_LSA_MAXAGE (new))
{
if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
zlog_debug ("LSA[Type%d:%s]: Install LSA 0x%p, MaxAge",
new->data->type,
inet_ntoa (new->data->id),
lsa);
- ospf_lsa_flush (ospf, lsa);
+ ospf_lsa_maxage (ospf, lsa);
}
return new;
@@ -2828,7 +2825,7 @@
{
struct ospf *ospf = THREAD_ARG (thread);
struct ospf_lsa *lsa;
- struct listnode *node, *nnode;
+ struct route_node *rn;
int reschedule = 0;
ospf->t_maxage = NULL;
@@ -2839,8 +2836,13 @@
reschedule = !ospf_check_nbr_status (ospf);
if (!reschedule)
- for (ALL_LIST_ELEMENTS (ospf->maxage_lsa, node, nnode, lsa))
+ for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn))
{
+ if ((lsa = rn->info) == NULL)
+ {
+ continue;
+ }
+
if (lsa->retransmit_counter > 0)
{
reschedule = 1;
@@ -2893,13 +2895,22 @@
void
ospf_lsa_maxage_delete (struct ospf *ospf, struct ospf_lsa *lsa)
{
- struct listnode *n;
+ struct route_node *rn;
+ struct prefix_ls lsa_prefix;
- if ((n = listnode_lookup (ospf->maxage_lsa, lsa)))
+ ls_prefix_set (&lsa_prefix, lsa);
+
+ if ((rn = route_node_lookup(ospf->maxage_lsa,
+ (struct prefix *)&lsa_prefix)))
{
- list_delete_node (ospf->maxage_lsa, n);
- UNSET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
- ospf_lsa_unlock (&lsa); /* maxage_lsa */
+ if (rn->info == lsa)
+ {
+ UNSET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
+ ospf_lsa_unlock (&lsa); /* maxage_lsa */
+ rn->info = NULL;
+ route_unlock_node (rn); /* route_node_lookup */
+ }
+ route_unlock_node (rn); /* route_node_lookup */
}
}
@@ -2911,6 +2922,9 @@
void
ospf_lsa_maxage (struct ospf *ospf, struct ospf_lsa *lsa)
{
+ struct prefix_ls lsa_prefix;
+ struct route_node *rn;
+
/* When we saw a MaxAge LSA flooded to us, we put it on the list
and schedule the MaxAge LSA remover. */
if (CHECK_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE))
@@ -2921,8 +2935,25 @@
return;
}
- listnode_add (ospf->maxage_lsa, ospf_lsa_lock (lsa));
- SET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
+ ls_prefix_set (&lsa_prefix, lsa);
+ if ((rn = route_node_get (ospf->maxage_lsa,
+ (struct prefix *)&lsa_prefix)) != NULL)
+ {
+ if (rn->info != NULL)
+ {
+ route_unlock_node (rn);
+ }
+ else
+ {
+ rn->info = ospf_lsa_lock(lsa);
+ SET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
+ }
+ }
+ else
+ {
+ zlog_err("Unable to allocate memory for maxage lsa\n");
+ assert(0);
+ }
if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
zlog_debug ("LSA[%s]: MaxAge LSA remover scheduled.", dump_lsa_key (lsa));
diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h
index 6c95ff1..9ff2d92 100644
--- a/ospfd/ospf_lsa.h
+++ b/ospfd/ospf_lsa.h
@@ -243,6 +243,7 @@
extern int get_age (struct ospf_lsa *);
extern u_int16_t ospf_lsa_checksum (struct lsa_header *);
+extern int ospf_lsa_checksum_valid (struct lsa_header *);
extern int ospf_lsa_refresh_delay (struct ospf_lsa *);
extern const char *dump_lsa_key (struct ospf_lsa *);
diff --git a/ospfd/ospf_lsdb.c b/ospfd/ospf_lsdb.c
index ea9a352..aad979a 100644
--- a/ospfd/ospf_lsdb.c
+++ b/ospfd/ospf_lsdb.c
@@ -72,13 +72,16 @@
route_table_finish (lsdb->type[i].db);
}
-static void
-lsdb_prefix_set (struct prefix_ls *lp, struct ospf_lsa *lsa)
+void
+ls_prefix_set (struct prefix_ls *lp, struct ospf_lsa *lsa)
{
- lp->family = 0;
- lp->prefixlen = 64;
- lp->id = lsa->data->id;
- lp->adv_router = lsa->data->adv_router;
+ if (lp && lsa && lsa->data)
+ {
+ lp->family = 0;
+ lp->prefixlen = 64;
+ lp->id = lsa->data->id;
+ lp->adv_router = lsa->data->adv_router;
+ }
}
static void
@@ -115,7 +118,7 @@
struct route_node *rn;
table = lsdb->type[lsa->data->type].db;
- lsdb_prefix_set (&lp, lsa);
+ ls_prefix_set (&lp, lsa);
rn = route_node_get (table, (struct prefix *)&lp);
/* nothing to do? */
@@ -167,7 +170,7 @@
assert (lsa->data->type < OSPF_MAX_LSA);
table = lsdb->type[lsa->data->type].db;
- lsdb_prefix_set (&lp, lsa);
+ ls_prefix_set (&lp, lsa);
if ((rn = route_node_lookup (table, (struct prefix *) &lp)))
{
if (rn->info == lsa)
@@ -218,7 +221,7 @@
struct ospf_lsa *find;
table = lsdb->type[lsa->data->type].db;
- lsdb_prefix_set (&lp, lsa);
+ ls_prefix_set (&lp, lsa);
rn = route_node_lookup (table, (struct prefix *) &lp);
if (rn)
{
diff --git a/ospfd/ospf_lsdb.h b/ospfd/ospf_lsdb.h
index 4157b68..51ae45b 100644
--- a/ospfd/ospf_lsdb.h
+++ b/ospfd/ospf_lsdb.h
@@ -66,6 +66,7 @@
extern void ospf_lsdb_init (struct ospf_lsdb *);
extern void ospf_lsdb_free (struct ospf_lsdb *);
extern void ospf_lsdb_cleanup (struct ospf_lsdb *);
+extern void ls_prefix_set (struct prefix_ls *lp, struct ospf_lsa *lsa);
extern void ospf_lsdb_add (struct ospf_lsdb *, struct ospf_lsa *);
extern void ospf_lsdb_delete (struct ospf_lsdb *, struct ospf_lsa *);
extern void ospf_lsdb_delete_all (struct ospf_lsdb *);
diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c
index 1448c7d..6d58b4e 100644
--- a/ospfd/ospf_main.c
+++ b/ospfd/ospf_main.c
@@ -191,6 +191,11 @@
/* Set umask before anything for security */
umask (0027);
+#ifdef SUPPORT_OSPF_API
+ /* OSPF apiserver is disabled by default. */
+ ospf_apiserver_enable = 0;
+#endif /* SUPPORT_OSPF_API */
+
/* get program name */
progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
@@ -275,11 +280,6 @@
/* OSPF master init. */
ospf_master_init ();
-#ifdef SUPPORT_OSPF_API
- /* OSPF apiserver is disabled by default. */
- ospf_apiserver_enable = 0;
-#endif /* SUPPORT_OSPF_API */
-
/* Initializations. */
master = om->master;
diff --git a/ospfd/ospf_network.c b/ospfd/ospf_network.c
index 3e326a8..900a566 100644
--- a/ospfd/ospf_network.c
+++ b/ospfd/ospf_network.c
@@ -228,7 +228,7 @@
}
void
-ospf_adjust_sndbuflen (struct ospf * ospf, int buflen)
+ospf_adjust_sndbuflen (struct ospf * ospf, unsigned int buflen)
{
int ret, newbuflen;
/* Check if any work has to be done at all. */
@@ -249,11 +249,11 @@
*/
ret = setsockopt_so_sendbuf (ospf->fd, buflen);
newbuflen = getsockopt_so_sendbuf (ospf->fd);
- if (ret < 0 || newbuflen < buflen)
- zlog_warn ("%s: tried to set SO_SNDBUF to %d, but got %d",
+ if (ret < 0 || newbuflen < 0 || newbuflen < (int) buflen)
+ zlog_warn ("%s: tried to set SO_SNDBUF to %u, but got %d",
__func__, buflen, newbuflen);
if (newbuflen >= 0)
- ospf->maxsndbuflen = newbuflen;
+ ospf->maxsndbuflen = (unsigned int)newbuflen;
else
zlog_warn ("%s: failed to get SO_SNDBUF", __func__);
if (ospfd_privs.change (ZPRIVS_LOWER))
diff --git a/ospfd/ospf_network.h b/ospfd/ospf_network.h
index f690991..e0a5c69 100644
--- a/ospfd/ospf_network.h
+++ b/ospfd/ospf_network.h
@@ -34,6 +34,6 @@
unsigned int);
extern int ospf_if_ipmulticast (struct ospf *, struct prefix *, unsigned int);
extern int ospf_sock_init (void);
-extern void ospf_adjust_sndbuflen (struct ospf *, int);
+extern void ospf_adjust_sndbuflen (struct ospf *, unsigned int);
#endif /* _ZEBRA_OSPF_NETWORK_H */
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index cbc3171..fe4ddf5 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -72,14 +72,11 @@
static int
ospf_db_desc_timer (struct thread *thread)
{
- struct ospf_interface *oi;
struct ospf_neighbor *nbr;
nbr = THREAD_ARG (thread);
nbr->t_db_desc = NULL;
- oi = nbr->oi;
-
if (IS_DEBUG_OSPF (nsm, NSM_TIMERS))
zlog (NULL, LOG_DEBUG, "NSM[%s:%s]: Timer (DD Retransmit timer expire)",
IF_NAME (nbr->oi), inet_ntoa (nbr->src));
@@ -643,7 +640,7 @@
#endif
}
-void
+static void
nsm_change_state (struct ospf_neighbor *nbr, int state)
{
struct ospf_interface *oi = nbr->oi;
@@ -787,11 +784,9 @@
int event;
int next_state;
struct ospf_neighbor *nbr;
- struct in_addr router_id;
nbr = THREAD_ARG (thread);
event = THREAD_VAL (thread);
- router_id = nbr->router_id;
if (IS_DEBUG_OSPF (nsm, NSM_EVENTS))
zlog_debug ("NSM[%s:%s]: %s (%s)", IF_NAME (nbr->oi),
diff --git a/ospfd/ospf_nsm.h b/ospfd/ospf_nsm.h
index 4f2ae80..9b7e14a 100644
--- a/ospfd/ospf_nsm.h
+++ b/ospfd/ospf_nsm.h
@@ -81,7 +81,6 @@
/* Prototypes. */
extern int ospf_nsm_event (struct thread *);
-extern void nsm_change_state (struct ospf_neighbor *, int);
extern void ospf_check_nbr_loading (struct ospf_neighbor *);
extern int ospf_db_summary_isempty (struct ospf_neighbor *);
extern int ospf_db_summary_count (struct ospf_neighbor *);
diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c
index aa126e1..744952c 100644
--- a/ospfd/ospf_opaque.c
+++ b/ospfd/ospf_opaque.c
@@ -223,9 +223,15 @@
default:
if (OPAQUE_TYPE_RANGE_UNASSIGNED (opaque_type))
name = "Unassigned";
- /* XXX warning: comparison is always true due to limited range of data type */
- else if (OPAQUE_TYPE_RANGE_RESERVED (opaque_type))
- name = "Private/Experimental";
+ else
+ {
+ u_int32_t bigger_range = opaque_type;
+ /*
+ * Get around type-limits warning: comparison is always true due to limited range of data type
+ */
+ if (OPAQUE_TYPE_RANGE_RESERVED (bigger_range))
+ name = "Private/Experimental";
+ }
break;
}
return name;
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index ede5908..9a4587d 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -1761,7 +1761,11 @@
ospf_lsa_discard (L); \
continue; }
- /* Process each LSA received in the one packet. */
+ /* Process each LSA received in the one packet.
+ *
+ * Numbers in parentheses, e.g. (1), (2), etc., and the corresponding
+ * text below are from the steps in RFC 2328, Section 13.
+ */
for (ALL_LIST_ELEMENTS (lsas, node, nnode, lsa))
{
struct ospf_lsa *ls_ret, *current;
@@ -1785,11 +1789,11 @@
listnode_delete (lsas, lsa); /* We don't need it in list anymore */
- /* Validate Checksum - Done above by ospf_ls_upd_list_lsa() */
+ /* (1) Validate Checksum - Done above by ospf_ls_upd_list_lsa() */
- /* LSA Type - Done above by ospf_ls_upd_list_lsa() */
+ /* (2) LSA Type - Done above by ospf_ls_upd_list_lsa() */
- /* Do not take in AS External LSAs if we are a stub or NSSA. */
+ /* (3) Do not take in AS External LSAs if we are a stub or NSSA. */
/* Do not take in AS NSSA if this neighbor and we are not NSSA */
@@ -1821,21 +1825,24 @@
current = ospf_lsa_lookup_by_header (oi->area, lsa->data);
- /* If the LSA's LS age is equal to MaxAge, and there is currently
+ /* (4) If the LSA's LS age is equal to MaxAge, and there is currently
no instance of the LSA in the router's link state database,
and none of router's neighbors are in states Exchange or Loading,
- then take the following actions. */
+ then take the following actions: */
if (IS_LSA_MAXAGE (lsa) && !current &&
(ospf_nbr_count (oi, NSM_Exchange) +
ospf_nbr_count (oi, NSM_Loading)) == 0)
{
- /* Response Link State Acknowledgment. */
+ /* (4a) Response Link State Acknowledgment. */
ospf_ls_ack_send (nbr, lsa);
- /* Discard LSA. */
- zlog_info ("Link State Update[%s]: LS age is equal to MaxAge.",
- dump_lsa_key(lsa));
+ /* (4b) Discard LSA. */
+ if (IS_DEBUG_OSPF (lsa, LSA))
+ {
+ zlog_debug ("Link State Update[%s]: LS age is equal to MaxAge.",
+ dump_lsa_key(lsa));
+ }
DISCARD_LSA (lsa, 3);
}
@@ -1890,7 +1897,7 @@
#endif /* HAVE_OPAQUE_LSA */
/* It might be happen that received LSA is self-originated network LSA, but
- * router ID is cahnged. So, we should check if LSA is a network-LSA whose
+ * router ID is changed. So, we should check if LSA is a network-LSA whose
* Link State ID is one of the router's own IP interface addresses but whose
* Advertising Router is not equal to the router's own Router ID
* According to RFC 2328 12.4.2 and 13.4 this LSA should be flushed.
@@ -1929,7 +1936,9 @@
/* (5) Find the instance of this LSA that is currently contained
in the router's link state database. If there is no
database copy, or the received LSA is more recent than
- the database copy the following steps must be performed. */
+ the database copy the following steps must be performed.
+ (The sub steps from RFC 2328 section 13 step (5) will be performed in
+ ospf_flood() ) */
if (current == NULL ||
(ret = ospf_lsa_more_recent (current, lsa)) < 0)
diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c
index c3acba3..eb7829a 100644
--- a/ospfd/ospf_route.c
+++ b/ospfd/ospf_route.c
@@ -126,6 +126,31 @@
route_table_finish (rt);
}
+/* If a prefix exists in the new routing table, then return 1,
+ otherwise return 0. Since the ZEBRA-RIB does an implicit
+ withdraw, it is not necessary to send a delete, an add later
+ will act like an implicit delete. */
+static int
+ospf_route_exist_new_table (struct route_table *rt, struct prefix_ipv4 *prefix)
+{
+ struct route_node *rn;
+
+ assert (rt);
+ assert (prefix);
+
+ rn = route_node_lookup (rt, (struct prefix *) prefix);
+ if (!rn) {
+ return 0;
+ }
+ route_unlock_node (rn);
+
+ if (!rn->info) {
+ return 0;
+ }
+
+ return 1;
+}
+
/* If a prefix and a nexthop match any route in the routing table,
then return 1, otherwise return 0. */
int
@@ -223,13 +248,13 @@
{
if (or->type == OSPF_DESTINATION_NETWORK)
{
- if (! ospf_route_match_same (cmprt,
- (struct prefix_ipv4 *) &rn->p, or))
+ if (! ospf_route_exist_new_table (cmprt,
+ (struct prefix_ipv4 *) &rn->p))
ospf_zebra_delete ((struct prefix_ipv4 *) &rn->p, or);
}
else if (or->type == OSPF_DESTINATION_DISCARD)
- if (! ospf_route_match_same (cmprt,
- (struct prefix_ipv4 *) &rn->p, or))
+ if (! ospf_route_exist_new_table (cmprt,
+ (struct prefix_ipv4 *) &rn->p))
ospf_zebra_delete_discard ((struct prefix_ipv4 *) &rn->p);
}
}
diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c
index adf8158..d0ebce6 100644
--- a/ospfd/ospf_routemap.c
+++ b/ospfd/ospf_routemap.c
@@ -443,12 +443,16 @@
route_set_metric_compile (const char *arg)
{
u_int32_t *metric;
+ int32_t ret;
metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
- *metric = atoi (arg);
+ ret = atoi (arg);
- if (*metric >= 0)
- return metric;
+ if (ret >= 0)
+ {
+ *metric = (u_int32_t)ret;
+ return metric;
+ }
XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
return NULL;
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c
index 24e8105..587564a 100644
--- a/ospfd/ospf_te.c
+++ b/ospfd/ospf_te.c
@@ -205,7 +205,7 @@
{
static u_int32_t seqno = 0;
- if (LEGAL_TE_INSTANCE_RANGE (seqno + 1))
+ if (seqno < MAX_LEGAL_TE_INSTANCE_NUM )
seqno += 1;
else
seqno = 1; /* Avoid zero. */
diff --git a/ospfd/ospf_te.h b/ospfd/ospf_te.h
index e8511cd..863d8ba 100644
--- a/ospfd/ospf_te.h
+++ b/ospfd/ospf_te.h
@@ -41,7 +41,7 @@
*
*/
-#define LEGAL_TE_INSTANCE_RANGE(i) (0 <= (i) && (i) <= 0xffff)
+#define MAX_LEGAL_TE_INSTANCE_NUM (0xffff)
/*
* 24 16 8 0
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index 97c8e8d..2ba8188 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -1742,12 +1742,11 @@
struct ospf *ospf = vty->index;
struct ospf_area *area;
struct in_addr area_id;
- u_int32_t cost;
int format;
struct prefix_ipv4 p;
VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
- VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
+ VTY_CHECK_INTEGER_RANGE ("stub default cost", argv[1], 0, OSPF_LS_INFINITY);
area = ospf_area_lookup_by_area_id (ospf, area_id);
if (area == NULL)
@@ -1933,7 +1932,6 @@
struct ospf *ospf = vty->index;
struct ospf_area *area;
struct in_addr area_id;
- struct prefix_list *plist;
int format;
VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
@@ -1941,7 +1939,6 @@
if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
return CMD_SUCCESS;
- plist = prefix_list_lookup (AFI_IP, argv[1]);
if (strncmp (argv[2], "in", 2) == 0)
{
if (PREFIX_NAME_IN (area))
@@ -2322,7 +2319,7 @@
if (argc > 1)
ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
if (argc > 2)
- ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
+ ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
return CMD_SUCCESS;
}
@@ -2394,11 +2391,10 @@
{
struct ospf *ospf = vty->index;
struct in_addr nbr_addr;
- int ret;
VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
- ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
+ (void)ospf_nbr_nbma_unset (ospf, nbr_addr);
return CMD_SUCCESS;
}
@@ -4035,21 +4031,26 @@
static void
show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
{
- struct listnode *node;
+ struct route_node *rn;
struct ospf_lsa *lsa;
vty_out (vty, "%s MaxAge Link States:%s%s",
VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
- for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
+ for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
{
- vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
- vty_out (vty, "Link State ID: %s%s",
- inet_ntoa (lsa->data->id), VTY_NEWLINE);
- vty_out (vty, "Advertising Router: %s%s",
- inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
- vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
- vty_out (vty, "%s", VTY_NEWLINE);
+ struct ospf_lsa *lsa;
+
+ if ((lsa = rn->info) != NULL)
+ {
+ vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
+ vty_out (vty, "Link State ID: %s%s",
+ inet_ntoa (lsa->data->id), VTY_NEWLINE);
+ vty_out (vty, "Advertising Router: %s%s",
+ inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
+ vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
}
}
@@ -5403,7 +5404,7 @@
"Address of interface")
{
struct interface *ifp = vty->index;
- u_int32_t priority;
+ long priority;
struct route_node *rn;
struct in_addr addr;
int ret;
@@ -6037,7 +6038,7 @@
int source;
/* Get distribute source. */
- source = proto_redistnum(AFI_IP, argv[0]);
+ source = proto_redistnum(AFI_IP, argv[1]);
if (source < 0 || source == ZEBRA_ROUTE_OSPF)
return CMD_WARNING;
@@ -6056,7 +6057,7 @@
struct ospf *ospf = vty->index;
int source;
- source = proto_redistnum(AFI_IP, argv[0]);
+ source = proto_redistnum(AFI_IP, argv[1]);
if (source < 0 || source == ZEBRA_ROUTE_OSPF)
return CMD_WARNING;
@@ -7020,6 +7021,10 @@
if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
ospf_router_lsa_update_area (area);
}
+
+ /* Allows for areas configured later to get the property */
+ ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
+
return CMD_SUCCESS;
}
@@ -7047,6 +7052,7 @@
ospf_router_lsa_update_area (area);
}
}
+ ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
return CMD_SUCCESS;
}
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index f5f49f6..34a3b2a 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -133,8 +133,8 @@
if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
zlog_debug
- ("Zebra: interface delete %s index %d flags %lld metric %d mtu %d",
- ifp->name, ifp->ifindex, ifp->flags, ifp->metric, ifp->mtu);
+ ("Zebra: interface delete %s index %d flags %llx metric %d mtu %d",
+ ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu);
#ifdef HAVE_SNMP
ospf_snmp_if_delete (ifp);
@@ -1004,7 +1004,7 @@
/* Update distribute-list and set timer to apply access-list. */
void
-ospf_distribute_list_update (struct ospf *ospf, int type)
+ospf_distribute_list_update (struct ospf *ospf, uintptr_t type)
{
struct route_table *rt;
@@ -1217,7 +1217,6 @@
{
int ret;
struct prefix_ipv4 p;
- u_char distance;
struct route_node *rn;
struct ospf_distance *odistance;
@@ -1228,8 +1227,6 @@
return CMD_WARNING;
}
- distance = atoi (distance_str);
-
rn = route_node_lookup (ospf->distance_table, (struct prefix *) &p);
if (!rn)
{
diff --git a/ospfd/ospf_zebra.h b/ospfd/ospf_zebra.h
index fbb3444..148f652 100644
--- a/ospfd/ospf_zebra.h
+++ b/ospfd/ospf_zebra.h
@@ -54,7 +54,7 @@
int *);
extern int ospf_distribute_check_connected (struct ospf *,
struct external_info *);
-extern void ospf_distribute_list_update (struct ospf *, int);
+extern void ospf_distribute_list_update (struct ospf *, uintptr_t);
extern int ospf_is_type_redistributed (int);
extern void ospf_distance_reset (struct ospf *);
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index e840513..3e2b234 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -182,7 +182,8 @@
new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
-
+ new->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
+
/* Distribute parameter init. */
for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
{
@@ -200,7 +201,7 @@
/* MaxAge init. */
new->maxage_delay = OSFP_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
- new->maxage_lsa = list_new ();
+ new->maxage_lsa = route_table_init();
new->t_maxage_walker =
thread_add_timer (master, ospf_lsa_maxage_walker,
new, OSPF_LSA_MAXAGE_CHECK_INTERVAL);
@@ -222,7 +223,7 @@
}
new->maxsndbuflen = getsockopt_so_sendbuf (new->fd);
if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
- zlog_debug ("%s: starting with OSPF send buffer size %d",
+ zlog_debug ("%s: starting with OSPF send buffer size %u",
__func__, new->maxsndbuflen);
if ((new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE+1)) == NULL)
{
@@ -501,10 +502,18 @@
ospf_lsdb_delete_all (ospf->lsdb);
ospf_lsdb_free (ospf->lsdb);
- for (ALL_LIST_ELEMENTS (ospf->maxage_lsa, node, nnode, lsa))
- ospf_lsa_unlock (&lsa); /* maxage_lsa */
+ for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
+ {
+ struct ospf_lsa *lsa;
- list_delete (ospf->maxage_lsa);
+ if ((lsa = rn->info) != NULL)
+ {
+ ospf_lsa_unlock (&lsa);
+ rn->info = NULL;
+ }
+ route_unlock_node (rn);
+ }
+ route_table_finish (ospf->maxage_lsa);
if (ospf->old_table)
ospf_route_table_free (ospf->old_table);
@@ -676,6 +685,10 @@
area->format = format;
listnode_add_sort (ospf->areas, area);
ospf_check_abr_status (ospf);
+ if (ospf->stub_router_admin_set == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET)
+ {
+ SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
+ }
}
return area;
diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h
index bf825d1..fb57bf5 100644
--- a/ospfd/ospfd.h
+++ b/ospfd/ospfd.h
@@ -195,6 +195,9 @@
unsigned int stub_router_startup_time; /* seconds */
unsigned int stub_router_shutdown_time; /* seconds */
#define OSPF_STUB_ROUTER_UNCONFIGURED 0
+ u_char stub_router_admin_set;
+#define OSPF_STUB_ROUTER_ADMINISTRATIVE_SET 1
+#define OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET 0
#define OSPF_STUB_MAX_METRIC_SUMMARY_COST 0x00ff0000
@@ -245,7 +248,7 @@
/* Time stamps. */
struct timeval ts_spf; /* SPF calculation time stamp. */
- struct list *maxage_lsa; /* List of MaxAge LSA for deletion. */
+ struct route_table *maxage_lsa; /* List of MaxAge LSA for deletion. */
int redistribute; /* Num of redistributed protocols. */
/* Threads. */
@@ -270,7 +273,7 @@
struct thread *t_write;
struct thread *t_read;
int fd;
- int maxsndbuflen;
+ unsigned int maxsndbuflen;
struct stream *ibuf;
struct list *oi_write_q;