summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-03-20 21:35:04 +0100
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-09-11 17:35:02 +0200
commitf4d2d9ba0a5ce5007c32d762535d8c6b48541e7e (patch)
tree7d27c85d813c0fb73d77f68045b83ee1ce0c12da
parentf26becb27ad64f10fb60e56ab60a0f4507436ef6 (diff)
zebra: Extend `rt_netlink.c` to parse SRv6 flavors
Extend the `parse_encap_seg6local` function to parse SRv6 flavors information contained in the Netlink message. Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
-rw-r--r--zebra/rt_netlink.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index a51d7b849b..3ea7252ca1 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -407,6 +407,36 @@ static int parse_encap_mpls(struct rtattr *tb, mpls_label_t *labels)
return num_labels;
}
+/**
+ * @parse_encap_seg6local_flavors() - Parses encapsulated SRv6 flavors
+ * attributes
+ * @tb: Pointer to rtattr to look for nested items in.
+ * @flv: Pointer to store SRv6 flavors info in.
+ *
+ * Return: 0 on success, non-zero on error
+ */
+static int parse_encap_seg6local_flavors(struct rtattr *tb,
+ struct seg6local_flavors_info *flv)
+{
+ struct rtattr *tb_encap[SEG6_LOCAL_FLV_MAX + 1] = {};
+
+ netlink_parse_rtattr_nested(tb_encap, SEG6_LOCAL_FLV_MAX, tb);
+
+ if (tb_encap[SEG6_LOCAL_FLV_OPERATION])
+ flv->flv_ops = *(uint32_t *)RTA_DATA(
+ tb_encap[SEG6_LOCAL_FLV_OPERATION]);
+
+ if (tb_encap[SEG6_LOCAL_FLV_LCBLOCK_BITS])
+ flv->lcblock_len = *(uint8_t *)RTA_DATA(
+ tb_encap[SEG6_LOCAL_FLV_LCBLOCK_BITS]);
+
+ if (tb_encap[SEG6_LOCAL_FLV_LCNODE_FN_BITS])
+ flv->lcnode_func_len = *(uint8_t *)RTA_DATA(
+ tb_encap[SEG6_LOCAL_FLV_LCNODE_FN_BITS]);
+
+ return 0;
+}
+
static enum seg6local_action_t
parse_encap_seg6local(struct rtattr *tb,
struct seg6local_context *ctx)
@@ -434,6 +464,11 @@ parse_encap_seg6local(struct rtattr *tb,
ctx->table =
*(uint32_t *)RTA_DATA(tb_encap[SEG6_LOCAL_VRFTABLE]);
+ if (tb_encap[SEG6_LOCAL_FLAVORS]) {
+ parse_encap_seg6local_flavors(tb_encap[SEG6_LOCAL_FLAVORS],
+ &ctx->flv);
+ }
+
return act;
}