summaryrefslogtreecommitdiffstats
path: root/lib/nexthop.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-03-10 21:12:52 +0100
committerDonald Sharp <sharpd@cumulusnetworks.com>2018-03-14 13:32:39 +0100
commit31919191561fa9b978f8c3cf713e30ed6fb20889 (patch)
tree59c41374f64717c5301f8dc1087892886e892494 /lib/nexthop.c
parentMerge pull request #1880 from pguibert6WIND/enforce_vrf_netns_enable (diff)
downloadfrr-31919191561fa9b978f8c3cf713e30ed6fb20889.tar.xz
frr-31919191561fa9b978f8c3cf713e30ed6fb20889.zip
lib: Add nexthop-group cli
Add a nexthop-group cli: nexthop-group NAME nexthop A nexthop B nexthop C ! This will allow interested parties to hook into the cli for nexthops. Users can add callback functions for add/delete of a nexthop group as well as add/delete of each individual nexthop. Future work( PBR and static routes ) will take advantage of this. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib/nexthop.c')
-rw-r--r--lib/nexthop.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/nexthop.c b/lib/nexthop.c
index cee34e85c..fb7ccc169 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -163,6 +163,57 @@ void nexthops_free(struct nexthop *nexthop)
}
}
+bool nexthop_same(const struct nexthop *nh1, const struct nexthop *nh2)
+{
+ if (nh1 && !nh2)
+ return false;
+
+ if (!nh1 && nh2)
+ return false;
+
+ if (nh1 == nh2)
+ return true;
+
+ if (nh1->vrf_id != nh2->vrf_id)
+ return false;
+
+ if (nh1->type != nh2->type)
+ return false;
+
+ switch (nh1->type) {
+ case NEXTHOP_TYPE_IFINDEX:
+ if (nh1->ifindex != nh2->ifindex)
+ return false;
+ break;
+ case NEXTHOP_TYPE_IPV4:
+ if (nh1->gate.ipv4.s_addr != nh2->gate.ipv4.s_addr)
+ return false;
+ break;
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ if (nh1->gate.ipv4.s_addr != nh2->gate.ipv4.s_addr)
+ return false;
+ if (nh1->ifindex != nh2->ifindex)
+ return false;
+ break;
+ case NEXTHOP_TYPE_IPV6:
+ if (memcmp(&nh1->gate.ipv6, &nh2->gate.ipv6, 16))
+ return false;
+ break;
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ if (memcmp(&nh1->gate.ipv6, &nh2->gate.ipv6, 16))
+ return false;
+ if (nh1->ifindex != nh2->ifindex)
+ return false;
+ break;
+ case NEXTHOP_TYPE_BLACKHOLE:
+ if (nh1->bh_type != nh2->bh_type)
+ return false;
+ break;
+ }
+
+ return true;
+}
+
/* 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)