u_char val[8] __attribute__ ((aligned (8)));
};
+/* helper to get type safety/avoid casts on calls
+ * (w/o this, functions accepting all prefix types need casts on the caller
+ * side, which strips type safety since the cast will accept any pointer
+ * type.)
+ */
+union prefix46ptr
+{
+ struct prefix *p;
+ struct prefix_ipv4 *p4;
+ struct prefix_ipv6 *p6;
+} __attribute__ ((transparent_union));
+
+union prefix46constptr
+{
+ const struct prefix *p;
+ const struct prefix_ipv4 *p4;
+ const struct prefix_ipv6 *p6;
+} __attribute__ ((transparent_union));
+
#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN 16
#endif /* INET_ADDRSTRLEN */
extern int nexthop_has_fib_child(struct nexthop *);
extern void rib_lookup_and_dump (struct prefix_ipv4 *);
extern void rib_lookup_and_pushup (struct prefix_ipv4 *);
-extern void rib_dump (const char *, const struct prefix *, const struct rib *);
+#define rib_dump(prefix ,rib) _rib_dump(__func__, prefix, rib)
+extern void _rib_dump (const char *,
+ union prefix46constptr, const struct rib *);
extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *);
#define ZEBRA_RIB_LOOKUP_ERROR -1
#define ZEBRA_RIB_FOUND_EXACT 0
{
zlog_debug ("%s: %s/%d: attention! gate not found for rib %p",
__func__, prefix_buf, p->prefixlen, rib);
- rib_dump (__func__, (struct prefix_ipv4 *)p, rib);
+ rib_dump (p, rib);
}
else
inet_ntop (AF_INET, &sin_gate.sin_addr, gate_buf, INET_ADDRSTRLEN);
* question are passed as 1st and 2nd arguments.
*/
-void rib_dump (const char * func, const struct prefix * p, const struct rib * rib)
+void _rib_dump (const char * func,
+ union prefix46constptr pp, const struct rib * rib)
{
+ const struct prefix *p = pp.p;
char straddr[INET6_ADDRSTRLEN];
struct nexthop *nexthop, *tnexthop;
int recursing;
(CHECK_FLAG (rib->status, RIB_ENTRY_REMOVED) ? "removed" : "NOT removed"),
(CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED) ? "selected" : "NOT selected")
);
- rib_dump (__func__, (struct prefix *) p, rib);
+ rib_dump (p, rib);
}
}
char buf[INET_ADDRSTRLEN];
inet_ntop (rn->p.family, &p->prefix, buf, INET_ADDRSTRLEN);
zlog_debug ("%s: freeing way for connected prefix %s/%d", __func__, buf, p->prefixlen);
- rib_dump (__func__, &rn->p, rib);
+ rib_dump (&rn->p, rib);
}
rib_uninstall (rn, rib);
}
{
zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
__func__, rn, rib);
- rib_dump (__func__, (struct prefix *) p, rib);
+ rib_dump (p, rib);
}
/* Free implicit route.*/
{
zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
__func__, rn, same);
- rib_dump (__func__, (struct prefix *) p, same);
+ rib_dump (p, same);
}
rib_delnode (rn, same);
}
{
zlog_debug ("%s: called rib_addnode (%p, %p) on new RIB entry",
__func__, rn, rib);
- rib_dump (__func__, (struct prefix *) p, rib);
+ rib_dump (p, rib);
}
/* Free implicit route.*/
{
zlog_debug ("%s: calling rib_delnode (%p, %p) on existing RIB entry",
__func__, rn, same);
- rib_dump (__func__, (struct prefix *) p, same);
+ rib_dump (p, same);
}
rib_delnode (rn, same);
}