diff options
Diffstat (limited to 'lib/nexthop.c')
| -rw-r--r-- | lib/nexthop.c | 278 |
1 files changed, 131 insertions, 147 deletions
diff --git a/lib/nexthop.c b/lib/nexthop.c index 7b8ac95e83..147b2a1479 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -33,190 +33,174 @@ #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]; } -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) +void copy_nexthops(struct nexthop **tnh, struct nexthop *nh) { - struct nexthop *nexthop; - struct nexthop *nh1; - - for (nh1 = nh; nh1; nh1 = nh1->next) - { - nexthop = nexthop_new(); - nexthop->flags = nh->flags; - nexthop->type = nh->type; - nexthop->ifindex = nh->ifindex; - memcpy(&(nexthop->gate), &(nh->gate), sizeof(union g_addr)); - memcpy(&(nexthop->src), &(nh->src), sizeof(union g_addr)); - 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); - } + struct nexthop *nexthop; + struct nexthop *nh1; + + for (nh1 = nh; nh1; nh1 = nh1->next) { + nexthop = nexthop_new(); + nexthop->flags = nh->flags; + nexthop->type = nh->type; + nexthop->ifindex = nh->ifindex; + memcpy(&(nexthop->gate), &(nh->gate), sizeof(union g_addr)); + memcpy(&(nexthop->src), &(nh->src), sizeof(union g_addr)); + 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); + } } /* 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; } |
