summaryrefslogtreecommitdiffstats
path: root/isisd
diff options
context:
space:
mode:
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-06-03 08:41:50 +0200
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-09-11 22:11:47 +0200
commit7db1a9047553ab11a10c15350d0fa8f1688476ec (patch)
tree7524f25d4b3a7105a80f2fb0528f295c6f54d1d2 /isisd
parentisisd: Add data structure for SRv6 Adjacency SIDs (diff)
downloadfrr-7db1a9047553ab11a10c15350d0fa8f1688476ec.tar.xz
frr-7db1a9047553ab11a10c15350d0fa8f1688476ec.zip
isisd: Add functions to install/remove adj SIDs
Add two functions to install/remove Adjacency SIDs into the data plane through zebra. Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to '')
-rw-r--r--isisd/isis_zebra.c101
-rw-r--r--isisd/isis_zebra.h4
2 files changed, 105 insertions, 0 deletions
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index de31a2d19..2428ab95b 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -1011,6 +1011,107 @@ void isis_zebra_srv6_sid_uninstall(struct isis_area *area,
ifp->ifindex, action, NULL);
}
+void isis_zebra_srv6_adj_sid_install(struct srv6_adjacency *sra)
+{
+ enum seg6local_action_t action = ZEBRA_SEG6_LOCAL_ACTION_UNSPEC;
+ struct seg6local_context ctx = {};
+ uint16_t prefixlen = IPV6_MAX_BITLEN;
+ struct interface *ifp;
+ struct isis_circuit *circuit = sra->adj->circuit;
+ struct isis_area *area = circuit->area;
+
+ if (!sra)
+ return;
+
+ sr_debug("ISIS-SRv6 (%s): setting adjacency SID %pI6", area->area_tag,
+ &sra->sid);
+
+ switch (sra->behavior) {
+ case SRV6_ENDPOINT_BEHAVIOR_END_X:
+ action = ZEBRA_SEG6_LOCAL_ACTION_END_X;
+ prefixlen = IPV6_MAX_BITLEN;
+ ctx.nh6 = sra->nexthop;
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_X_NEXT_CSID:
+ action = ZEBRA_SEG6_LOCAL_ACTION_END_X;
+ prefixlen = sra->locator->block_bits_length +
+ sra->locator->node_bits_length +
+ sra->locator->function_bits_length;
+ ctx.nh6 = sra->nexthop;
+ SET_SRV6_FLV_OP(ctx.flv.flv_ops,
+ ZEBRA_SEG6_LOCAL_FLV_OP_NEXT_CSID);
+ ctx.flv.lcblock_len = sra->locator->block_bits_length;
+ ctx.flv.lcnode_func_len = sra->locator->node_bits_length;
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_RESERVED:
+ case SRV6_ENDPOINT_BEHAVIOR_END:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46:
+ case SRV6_ENDPOINT_BEHAVIOR_END_NEXT_CSID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_OPAQUE:
+ default:
+ zlog_err(
+ "ISIS-SRv6 (%s): unsupported SRv6 endpoint behavior %u",
+ area->area_tag, sra->behavior);
+ return;
+ }
+
+ ifp = sra->adj->circuit->interface;
+
+ isis_zebra_send_localsid(ZEBRA_ROUTE_ADD, &sra->sid, prefixlen,
+ ifp->ifindex, action, &ctx);
+}
+
+void isis_zebra_srv6_adj_sid_uninstall(struct srv6_adjacency *sra)
+{
+ enum seg6local_action_t action = ZEBRA_SEG6_LOCAL_ACTION_UNSPEC;
+ struct interface *ifp;
+ uint16_t prefixlen = IPV6_MAX_BITLEN;
+ struct isis_circuit *circuit = sra->adj->circuit;
+ struct isis_area *area = circuit->area;
+
+ if (!sra)
+ return;
+
+ switch (sra->behavior) {
+ case SRV6_ENDPOINT_BEHAVIOR_END_X:
+ prefixlen = IPV6_MAX_BITLEN;
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_END_X_NEXT_CSID:
+ prefixlen = sra->locator->block_bits_length +
+ sra->locator->node_bits_length +
+ sra->locator->function_bits_length;
+ break;
+ case SRV6_ENDPOINT_BEHAVIOR_RESERVED:
+ case SRV6_ENDPOINT_BEHAVIOR_END:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46:
+ case SRV6_ENDPOINT_BEHAVIOR_END_NEXT_CSID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID:
+ case SRV6_ENDPOINT_BEHAVIOR_OPAQUE:
+ default:
+ zlog_err(
+ "ISIS-SRv6 (%s): unsupported SRv6 endpoint behavior %u",
+ area->area_tag, sra->behavior);
+ return;
+ }
+
+ ifp = sra->adj->circuit->interface;
+
+ sr_debug("ISIS-SRv6 (%s): delete End.X SID %pI6", area->area_tag,
+ &sra->sid);
+
+ isis_zebra_send_localsid(ZEBRA_ROUTE_DELETE, &sra->sid, prefixlen,
+ ifp->ifindex, action, NULL);
+}
+
/**
* Callback to process an SRv6 locator chunk received from SRv6 Manager (zebra).
*
diff --git a/isisd/isis_zebra.h b/isisd/isis_zebra.h
index af7827445..f1684b7c2 100644
--- a/isisd/isis_zebra.h
+++ b/isisd/isis_zebra.h
@@ -61,6 +61,10 @@ extern void isis_zebra_srv6_sid_install(struct isis_area *area,
struct isis_srv6_sid *sid);
extern void isis_zebra_srv6_sid_uninstall(struct isis_area *area,
struct isis_srv6_sid *sid);
+
+void isis_zebra_srv6_adj_sid_install(struct srv6_adjacency *sra);
+void isis_zebra_srv6_adj_sid_uninstall(struct srv6_adjacency *sra);
+
extern int isis_zebra_srv6_manager_get_locator_chunk(const char *name);
extern int isis_zebra_srv6_manager_release_locator_chunk(const char *name);