summaryrefslogtreecommitdiff
path: root/lib/nexthop.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nexthop.c')
-rw-r--r--lib/nexthop.c337
1 files changed, 160 insertions, 177 deletions
diff --git a/lib/nexthop.c b/lib/nexthop.c
index e9ffea0a0e..9b0c2d73f4 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -32,216 +32,201 @@
#include "nexthop.h"
#include "mpls.h"
-DEFINE_MTYPE_STATIC(LIB, NEXTHOP, "Nexthop")
-DEFINE_MTYPE_STATIC(LIB, NH_LABEL, "Nexthop label")
+DEFINE_MTYPE_STATIC(LIB, NEXTHOP, "Nexthop")
+DEFINE_MTYPE_STATIC(LIB, NH_LABEL, "Nexthop label")
/* check if nexthops are same, non-recursive */
-int
-nexthop_same_no_recurse (struct nexthop *next1, struct nexthop *next2)
+int nexthop_same_no_recurse(struct nexthop *next1, struct nexthop *next2)
{
- if (next1->type != next2->type)
- return 0;
-
- switch (next1->type)
- {
- case NEXTHOP_TYPE_IPV4:
- case NEXTHOP_TYPE_IPV4_IFINDEX:
- if (! IPV4_ADDR_SAME (&next1->gate.ipv4, &next2->gate.ipv4))
- return 0;
- if (next1->ifindex && (next1->ifindex != next2->ifindex))
- return 0;
- break;
- case NEXTHOP_TYPE_IFINDEX:
- if (next1->ifindex != next2->ifindex)
- return 0;
- break;
- case NEXTHOP_TYPE_IPV6:
- if (! IPV6_ADDR_SAME (&next1->gate.ipv6, &next2->gate.ipv6))
- return 0;
- break;
- case NEXTHOP_TYPE_IPV6_IFINDEX:
- if (! IPV6_ADDR_SAME (&next1->gate.ipv6, &next2->gate.ipv6))
- return 0;
- if (next1->ifindex != next2->ifindex)
- return 0;
- break;
- default:
- /* do nothing */
- break;
- }
- return 1;
+ if (next1->type != next2->type)
+ return 0;
+
+ switch (next1->type) {
+ case NEXTHOP_TYPE_IPV4:
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ if (!IPV4_ADDR_SAME(&next1->gate.ipv4, &next2->gate.ipv4))
+ return 0;
+ if (next1->ifindex && (next1->ifindex != next2->ifindex))
+ return 0;
+ break;
+ case NEXTHOP_TYPE_IFINDEX:
+ if (next1->ifindex != next2->ifindex)
+ return 0;
+ break;
+ case NEXTHOP_TYPE_IPV6:
+ if (!IPV6_ADDR_SAME(&next1->gate.ipv6, &next2->gate.ipv6))
+ return 0;
+ break;
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ if (!IPV6_ADDR_SAME(&next1->gate.ipv6, &next2->gate.ipv6))
+ return 0;
+ if (next1->ifindex != next2->ifindex)
+ return 0;
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ return 1;
}
/*
* nexthop_type_to_str
*/
-const char *
-nexthop_type_to_str (enum nexthop_types_t nh_type)
+const char *nexthop_type_to_str(enum nexthop_types_t nh_type)
{
- static const char *desc[] = {
- "none",
- "Directly connected",
- "IPv4 nexthop",
- "IPv4 nexthop with ifindex",
- "IPv6 nexthop",
- "IPv6 nexthop with ifindex",
- "Null0 nexthop",
- };
-
- return desc[nh_type];
+ static const char *desc[] = {
+ "none", "Directly connected",
+ "IPv4 nexthop", "IPv4 nexthop with ifindex",
+ "IPv6 nexthop", "IPv6 nexthop with ifindex",
+ "Null0 nexthop",
+ };
+
+ return desc[nh_type];
}
/*
* Check if the labels match for the 2 nexthops specified.
*/
-int
-nexthop_labels_match (struct nexthop *nh1, struct nexthop *nh2)
+int nexthop_labels_match(struct nexthop *nh1, struct nexthop *nh2)
{
- struct nexthop_label *nhl1, *nhl2;
+ struct nexthop_label *nhl1, *nhl2;
- nhl1 = nh1->nh_label;
- nhl2 = nh2->nh_label;
- if ((nhl1 && !nhl2) || (!nhl1 && nhl2))
- return 0;
+ nhl1 = nh1->nh_label;
+ nhl2 = nh2->nh_label;
+ if ((nhl1 && !nhl2) || (!nhl1 && nhl2))
+ return 0;
- if (nhl1->num_labels != nhl2->num_labels)
- return 0;
+ if (nhl1->num_labels != nhl2->num_labels)
+ return 0;
- if (memcmp (nhl1->label, nhl2->label, nhl1->num_labels))
- return 0;
+ if (memcmp(nhl1->label, nhl2->label, nhl1->num_labels))
+ return 0;
- return 1;
+ return 1;
}
-struct nexthop *
-nexthop_new (void)
+struct nexthop *nexthop_new(void)
{
- return XCALLOC (MTYPE_NEXTHOP, sizeof (struct nexthop));
+ return XCALLOC(MTYPE_NEXTHOP, sizeof(struct nexthop));
}
/* Add nexthop to the end of a nexthop list. */
-void
-nexthop_add (struct nexthop **target, struct nexthop *nexthop)
+void nexthop_add(struct nexthop **target, struct nexthop *nexthop)
{
- struct nexthop *last;
-
- for (last = *target; last && last->next; last = last->next)
- ;
- if (last)
- last->next = nexthop;
- else
- *target = nexthop;
- nexthop->prev = last;
+ struct nexthop *last;
+
+ for (last = *target; last && last->next; last = last->next)
+ ;
+ if (last)
+ last->next = nexthop;
+ else
+ *target = nexthop;
+ nexthop->prev = last;
}
-void
-copy_nexthops (struct nexthop **tnh, struct nexthop *nh, struct nexthop *rparent)
+void copy_nexthops(struct nexthop **tnh, struct nexthop *nh,
+ struct nexthop *rparent)
{
- struct nexthop *nexthop;
- struct nexthop *nh1;
-
- for (nh1 = nh; nh1; nh1 = nh1->next)
- {
- nexthop = nexthop_new();
- nexthop->ifindex = nh->ifindex;
- nexthop->type = nh->type;
- nexthop->flags = nh->flags;
- memcpy(&nexthop->gate, &nh->gate, sizeof(nh->gate));
- memcpy(&nexthop->src, &nh->src, sizeof(nh->src));
- memcpy(&nexthop->rmap_src, &nh->rmap_src, sizeof(nh->rmap_src));
- nexthop->rparent = rparent;
- if (nh->nh_label)
- nexthop_add_labels (nexthop, nh->nh_label_type,
- nh->nh_label->num_labels, &nh->nh_label->label[0]);
- nexthop_add(tnh, nexthop);
-
- if (CHECK_FLAG(nh1->flags, NEXTHOP_FLAG_RECURSIVE))
- copy_nexthops(&nexthop->resolved, nh1->resolved, nexthop);
- }
+ struct nexthop *nexthop;
+ struct nexthop *nh1;
+
+ for (nh1 = nh; nh1; nh1 = nh1->next) {
+ nexthop = nexthop_new();
+ nexthop->ifindex = nh->ifindex;
+ nexthop->type = nh->type;
+ nexthop->flags = nh->flags;
+ memcpy(&nexthop->gate, &nh->gate, sizeof(nh->gate));
+ memcpy(&nexthop->src, &nh->src, sizeof(nh->src));
+ memcpy(&nexthop->rmap_src, &nh->rmap_src, sizeof(nh->rmap_src));
+ nexthop->rparent = rparent;
+ if (nh->nh_label)
+ nexthop_add_labels(nexthop, nh->nh_label_type,
+ nh->nh_label->num_labels,
+ &nh->nh_label->label[0]);
+ nexthop_add(tnh, nexthop);
+
+ if (CHECK_FLAG(nh1->flags, NEXTHOP_FLAG_RECURSIVE))
+ copy_nexthops(&nexthop->resolved, nh1->resolved,
+ nexthop);
+ }
}
/* Free nexthop. */
-void
-nexthop_free (struct nexthop *nexthop)
+void nexthop_free(struct nexthop *nexthop)
{
- nexthop_del_labels (nexthop);
- if (nexthop->resolved)
- nexthops_free(nexthop->resolved);
- XFREE (MTYPE_NEXTHOP, nexthop);
+ nexthop_del_labels(nexthop);
+ if (nexthop->resolved)
+ nexthops_free(nexthop->resolved);
+ XFREE(MTYPE_NEXTHOP, nexthop);
}
/* Frees a list of nexthops */
-void
-nexthops_free (struct nexthop *nexthop)
+void nexthops_free(struct nexthop *nexthop)
{
- struct nexthop *nh, *next;
+ struct nexthop *nh, *next;
- for (nh = nexthop; nh; nh = next)
- {
- next = nh->next;
- nexthop_free (nh);
- }
+ for (nh = nexthop; nh; nh = next) {
+ next = nh->next;
+ nexthop_free(nh);
+ }
}
/* Update nexthop with label information. */
-void
-nexthop_add_labels (struct nexthop *nexthop, enum lsp_types_t type,
- u_int8_t num_labels, mpls_label_t *label)
+void nexthop_add_labels(struct nexthop *nexthop, enum lsp_types_t type,
+ u_int8_t num_labels, mpls_label_t *label)
{
- struct nexthop_label *nh_label;
- int i;
-
- nexthop->nh_label_type = type;
- nh_label = XCALLOC (MTYPE_NH_LABEL, sizeof (struct nexthop_label) +
- num_labels * sizeof (mpls_label_t));
- nh_label->num_labels = num_labels;
- for (i = 0; i < num_labels; i++)
- nh_label->label[i] = *(label + i);
- nexthop->nh_label = nh_label;
+ struct nexthop_label *nh_label;
+ int i;
+
+ nexthop->nh_label_type = type;
+ nh_label = XCALLOC(MTYPE_NH_LABEL,
+ sizeof(struct nexthop_label)
+ + num_labels * sizeof(mpls_label_t));
+ nh_label->num_labels = num_labels;
+ for (i = 0; i < num_labels; i++)
+ nh_label->label[i] = *(label + i);
+ nexthop->nh_label = nh_label;
}
/* Free label information of nexthop, if present. */
-void
-nexthop_del_labels (struct nexthop *nexthop)
+void nexthop_del_labels(struct nexthop *nexthop)
{
- if (nexthop->nh_label)
- {
- XFREE (MTYPE_NH_LABEL, nexthop->nh_label);
- nexthop->nh_label_type = ZEBRA_LSP_NONE;
- }
+ if (nexthop->nh_label) {
+ XFREE(MTYPE_NH_LABEL, nexthop->nh_label);
+ nexthop->nh_label_type = ZEBRA_LSP_NONE;
+ }
}
-const char *
-nexthop2str (struct nexthop *nexthop, char *str, int size)
+const char *nexthop2str(struct nexthop *nexthop, char *str, int size)
{
- switch (nexthop->type)
- {
- case NEXTHOP_TYPE_IFINDEX:
- snprintf (str, size, "if %u", nexthop->ifindex);
- break;
- case NEXTHOP_TYPE_IPV4:
- snprintf (str, size, "%s", inet_ntoa (nexthop->gate.ipv4));
- break;
- case NEXTHOP_TYPE_IPV4_IFINDEX:
- snprintf (str, size, "%s if %u",
- inet_ntoa (nexthop->gate.ipv4), nexthop->ifindex);
- break;
- case NEXTHOP_TYPE_IPV6:
- snprintf (str, size, "%s", inet6_ntoa (nexthop->gate.ipv6));
- break;
- case NEXTHOP_TYPE_IPV6_IFINDEX:
- snprintf (str, size, "%s if %u",
- inet6_ntoa (nexthop->gate.ipv6), nexthop->ifindex);
- break;
- case NEXTHOP_TYPE_BLACKHOLE:
- snprintf (str, size, "blackhole");
- break;
- default:
- snprintf (str, size, "unknown");
- break;
- }
-
- return str;
+ switch (nexthop->type) {
+ case NEXTHOP_TYPE_IFINDEX:
+ snprintf(str, size, "if %u", nexthop->ifindex);
+ break;
+ case NEXTHOP_TYPE_IPV4:
+ snprintf(str, size, "%s", inet_ntoa(nexthop->gate.ipv4));
+ break;
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ snprintf(str, size, "%s if %u", inet_ntoa(nexthop->gate.ipv4),
+ nexthop->ifindex);
+ break;
+ case NEXTHOP_TYPE_IPV6:
+ snprintf(str, size, "%s", inet6_ntoa(nexthop->gate.ipv6));
+ break;
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ snprintf(str, size, "%s if %u", inet6_ntoa(nexthop->gate.ipv6),
+ nexthop->ifindex);
+ break;
+ case NEXTHOP_TYPE_BLACKHOLE:
+ snprintf(str, size, "blackhole");
+ break;
+ default:
+ snprintf(str, size, "unknown");
+ break;
+ }
+
+ return str;
}
/*
@@ -259,29 +244,27 @@ nexthop2str (struct nexthop *nexthop, char *str, int size)
* left branch is 'resolved' and right branch is 'next':
* https://en.wikipedia.org/wiki/Tree_traversal#/media/File:Sorted_binary_tree_preorder.svg
*/
-struct nexthop *
-nexthop_next(struct nexthop *nexthop)
+struct nexthop *nexthop_next(struct nexthop *nexthop)
{
- if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
- return nexthop->resolved;
+ if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
+ return nexthop->resolved;
- if (nexthop->next)
- return nexthop->next;
+ if (nexthop->next)
+ return nexthop->next;
- for (struct nexthop *par = nexthop->rparent; par; par = par->rparent)
- if (par->next)
- return par->next;
+ for (struct nexthop *par = nexthop->rparent; par; par = par->rparent)
+ if (par->next)
+ return par->next;
- return NULL;
+ return NULL;
}
-unsigned int
-nexthop_level(struct nexthop *nexthop)
+unsigned int nexthop_level(struct nexthop *nexthop)
{
- unsigned int rv = 0;
+ unsigned int rv = 0;
- for (struct nexthop *par = nexthop->rparent; par; par = par->rparent)
- rv++;
+ for (struct nexthop *par = nexthop->rparent; par; par = par->rparent)
+ rv++;
- return rv;
+ return rv;
}