summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2023-11-19 09:38:26 +0100
committerPhilippe Guibert <philippe.guibert@6wind.com>2024-04-23 14:27:01 +0200
commit196f0d69fa26065943088eeb25e12103817cd96f (patch)
tree3e704da946c0140fd535abf2260d01ced756b7ba /lib
parentMerge pull request #15815 from donaldsharp/blackhole_reinstall (diff)
downloadfrr-196f0d69fa26065943088eeb25e12103817cd96f.tar.xz
frr-196f0d69fa26065943088eeb25e12103817cd96f.zip
isisd, lib: add link state support for srv6 adjacencies
Add support for endx_lan and endx adjacency. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/link_state.c118
-rw-r--r--lib/link_state.h14
2 files changed, 131 insertions, 1 deletions
diff --git a/lib/link_state.c b/lib/link_state.c
index 25373bdb2..321707493 100644
--- a/lib/link_state.c
+++ b/lib/link_state.c
@@ -320,6 +320,23 @@ int ls_attributes_same(struct ls_attributes *l1, struct ls_attributes *l2)
&l2->adj_sid[i].neighbor.addr)))
return 0;
}
+ for (int i = 0; i < ADJ_SRV6_MAX; i++) {
+ if (!CHECK_FLAG(l1->flags, (LS_ATTR_ADJ_SRV6SID << i)))
+ continue;
+ if (memcmp(&l1->adj_srv6_sid[i].sid, &l2->adj_srv6_sid[i].sid,
+ sizeof(struct in6_addr)) ||
+ (l1->adj_srv6_sid[i].flags != l2->adj_srv6_sid[i].flags) ||
+ (l1->adj_srv6_sid[i].weight != l2->adj_srv6_sid[i].weight) ||
+ (l1->adj_srv6_sid[i].endpoint_behavior !=
+ l2->adj_srv6_sid[i].endpoint_behavior))
+ return 0;
+ if (((l1->adv.origin == ISIS_L1) ||
+ (l1->adv.origin == ISIS_L2)) &&
+ (memcmp(&l1->adj_srv6_sid[i].neighbor.sysid,
+ &l2->adj_srv6_sid[i].neighbor.sysid,
+ ISO_SYS_ID_LEN) != 0))
+ return 0;
+ }
if (CHECK_FLAG(l1->flags, LS_ATTR_SRLG)
&& ((l1->srlg_len != l2->srlg_len)
|| memcmp(l1->srlgs, l2->srlgs,
@@ -1298,6 +1315,26 @@ static struct ls_attributes *ls_parse_attributes(struct stream *s)
STREAM_GET(attr->adj_sid[ADJ_BCK_IPV6].neighbor.sysid, s,
ISO_SYS_ID_LEN);
}
+ if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SRV6SID)) {
+ STREAM_GET(&attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].sid, s,
+ sizeof(struct in6_addr));
+ STREAM_GETC(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].flags);
+ STREAM_GETC(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].weight);
+ STREAM_GETW(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6]
+ .endpoint_behavior);
+ STREAM_GET(attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].neighbor.sysid,
+ s, ISO_SYS_ID_LEN);
+ }
+ if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SRV6SID)) {
+ STREAM_GET(&attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].sid, s,
+ sizeof(struct in6_addr));
+ STREAM_GETC(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].flags);
+ STREAM_GETC(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].weight);
+ STREAM_GETW(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6]
+ .endpoint_behavior);
+ STREAM_GET(attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].neighbor.sysid,
+ s, ISO_SYS_ID_LEN);
+ }
if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) {
STREAM_GETC(s, len);
attr->srlgs = XCALLOC(MTYPE_LS_DB, len*sizeof(uint32_t));
@@ -1532,6 +1569,28 @@ static int ls_format_attributes(struct stream *s, struct ls_attributes *attr)
stream_put(s, attr->adj_sid[ADJ_BCK_IPV6].neighbor.sysid,
ISO_SYS_ID_LEN);
}
+ if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SRV6SID)) {
+ stream_put(s, &attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].sid,
+ sizeof(struct in6_addr));
+ stream_putc(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].flags);
+ stream_putc(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].weight);
+ stream_putw(s, attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6]
+ .endpoint_behavior);
+ stream_put(s,
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].neighbor.sysid,
+ ISO_SYS_ID_LEN);
+ }
+ if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SRV6SID)) {
+ stream_put(s, &attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].sid,
+ sizeof(struct in6_addr));
+ stream_putc(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].flags);
+ stream_putc(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].weight);
+ stream_putw(s, attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6]
+ .endpoint_behavior);
+ stream_put(s,
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].neighbor.sysid,
+ ISO_SYS_ID_LEN);
+ }
if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) {
stream_putc(s, attr->srlg_len);
for (len = 0; len < attr->srlg_len; len++)
@@ -2351,6 +2410,24 @@ static void ls_show_edge_vty(struct ls_edge *edge, struct vty *vty,
attr->adj_sid[ADJ_BCK_IPV6].flags,
attr->adj_sid[ADJ_BCK_IPV6].weight);
}
+ if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SRV6SID)) {
+ sbuf_push(&sbuf, 4, "IPv6 Adjacency-SRV6-SID: %pI6",
+ &attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].sid);
+ sbuf_push(&sbuf, 0,
+ "\tFlags: 0x%x\tWeight: 0x%x\tbehavior: 0x%x\n",
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].flags,
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].weight,
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].endpoint_behavior);
+ }
+ if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SRV6SID)) {
+ sbuf_push(&sbuf, 4, "IPv6 Bck. Adjacency-SRV6-SID: %pI6",
+ &attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].sid);
+ sbuf_push(&sbuf, 0,
+ "\tFlags: 0x%x\tWeight: 0x%x\tbehavior: 0x%x\n",
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].flags,
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].weight,
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].endpoint_behavior);
+ }
if (CHECK_FLAG(attr->flags, LS_ATTR_SRLG)) {
sbuf_push(&sbuf, 4, "SRLGs: %d", attr->srlg_len);
for (int i = 1; i < attr->srlg_len; i++) {
@@ -2372,7 +2449,7 @@ static void ls_show_edge_json(struct ls_edge *edge, struct json_object *json)
struct ls_attributes *attr;
struct json_object *jte, *jbw, *jobj, *jsr = NULL, *jsrlg, *js_ext_ag,
*js_ext_ag_arr_word,
- *js_ext_ag_arr_bit;
+ *js_ext_ag_arr_bit, *jsrv6 = NULL;
char buf[INET6_BUFSIZ];
char buf_ag[strlen("0xffffffff") + 1];
uint32_t bitmap;
@@ -2557,6 +2634,45 @@ static void ls_show_edge_json(struct ls_edge *edge, struct json_object *json)
attr->adj_sid[ADJ_BCK_IPV6].weight);
json_object_array_add(jsr, jobj);
}
+ if (CHECK_FLAG(attr->flags, LS_ATTR_ADJ_SRV6SID)) {
+ jsrv6 = json_object_new_array();
+ json_object_object_add(json, "segment-routing-ipv6", jsrv6);
+ jobj = json_object_new_object();
+ snprintfrr(buf, INET6_BUFSIZ, "%pI6",
+ &attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].sid);
+ json_object_string_add(jobj, "adj-sid", buf);
+ snprintfrr(buf, 6, "0x%x",
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].flags);
+ json_object_string_add(jobj, "flags", buf);
+ json_object_int_add(jobj, "weight",
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6].weight);
+ snprintfrr(buf, 6, "0x%x",
+ attr->adj_srv6_sid[ADJ_SRV6_PRI_IPV6]
+ .endpoint_behavior);
+ json_object_string_add(jobj, "endpoint-behavior", buf);
+ json_object_array_add(jsr, jobj);
+ }
+ if (CHECK_FLAG(attr->flags, LS_ATTR_BCK_ADJ_SRV6SID)) {
+ if (!jsrv6) {
+ jsrv6 = json_object_new_array();
+ json_object_object_add(json, "segment-routing-ipv6",
+ jsrv6);
+ }
+ jobj = json_object_new_object();
+ snprintfrr(buf, INET6_BUFSIZ, "%pI6",
+ &attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].sid);
+ json_object_string_add(jobj, "adj-sid", buf);
+ snprintfrr(buf, 6, "0x%x",
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].flags);
+ json_object_string_add(jobj, "flags", buf);
+ json_object_int_add(jobj, "weight",
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6].weight);
+ snprintfrr(buf, 6, "0x%x",
+ attr->adj_srv6_sid[ADJ_SRV6_BCK_IPV6]
+ .endpoint_behavior);
+ json_object_string_add(jobj, "endpoint-behavior", buf);
+ json_object_array_add(jsr, jobj);
+ }
}
void ls_show_edge(struct ls_edge *edge, struct vty *vty,
diff --git a/lib/link_state.h b/lib/link_state.h
index d3a0ce39d..aaf97a28b 100644
--- a/lib/link_state.h
+++ b/lib/link_state.h
@@ -161,6 +161,8 @@ struct ls_node {
#define LS_ATTR_BCK_ADJ_SID6 0x08000000
#define LS_ATTR_SRLG 0x10000000
#define LS_ATTR_EXT_ADM_GRP 0x20000000
+#define LS_ATTR_ADJ_SRV6SID 0x40000000
+#define LS_ATTR_BCK_ADJ_SRV6SID 0x80000000
/* Link State Attributes */
struct ls_attributes {
@@ -209,6 +211,18 @@ struct ls_attributes {
uint8_t sysid[ISO_SYS_ID_LEN]; /* or Sys-ID for ISIS */
} neighbor;
} adj_sid[4]; /* IPv4/IPv6 & Primary/Backup (LAN)-Adj. SID */
+#define ADJ_SRV6_PRI_IPV6 0
+#define ADJ_SRV6_BCK_IPV6 1
+#define ADJ_SRV6_MAX 2
+ struct ls_srv6_adjacency { /* Adjacency SID for IS-IS */
+ struct in6_addr sid; /* SID as IPv6 address */
+ uint8_t flags; /* Flags */
+ uint8_t weight; /* Administrative weight */
+ uint16_t endpoint_behavior; /* Endpoint Behavior */
+ union {
+ uint8_t sysid[ISO_SYS_ID_LEN]; /* Sys-ID for ISIS */
+ } neighbor;
+ } adj_srv6_sid[2];
uint32_t *srlgs; /* List of Shared Risk Link Group */
uint8_t srlg_len; /* number of SRLG in the list */
};