From: Eyal Birger Date: Thu, 9 Jul 2020 06:29:48 +0000 (+0300) Subject: ip xfrm: policy: support policies with IF_ID in get/delete/deleteall X-Git-Tag: v5.8.0~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f33a871b8094ae0f6e6293804e1cc6edbba0e108;p=thirdparty%2Fiproute2.git ip xfrm: policy: support policies with IF_ID in get/delete/deleteall The XFRMA_IF_ID attribute is set in policies for them to be associated with an XFRM interface (4.19+). Add support for getting/deleting policies with this attribute. For supporting 'deleteall' the XFRMA_IF_ID attribute needs to be explicitly copied. Signed-off-by: Eyal Birger Signed-off-by: Stephen Hemminger --- diff --git a/ip/xfrm_policy.c b/ip/xfrm_policy.c index d3c706d32..7cc00e7c2 100644 --- a/ip/xfrm_policy.c +++ b/ip/xfrm_policy.c @@ -59,6 +59,7 @@ static void usage(void) " [ if_id IF_ID ] [ LIMIT-LIST ] [ TMPL-LIST ]\n" "Usage: ip xfrm policy { delete | get } { SELECTOR | index INDEX } dir DIR\n" " [ ctx CTX ] [ mark MARK [ mask MASK ] ] [ ptype PTYPE ]\n" + " [ if_id IF_ID ]\n" "Usage: ip xfrm policy { deleteall | list } [ nosock ] [ SELECTOR ] [ dir DIR ]\n" " [ index INDEX ] [ ptype PTYPE ] [ action ACTION ] [ priority PRIORITY ]\n" " [ flag FLAG-LIST ]\n" @@ -582,6 +583,8 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, struct xfrm_user_sec_ctx sctx; char str[CTX_BUF_SIZE]; } ctx = {}; + bool is_if_id_set = false; + __u32 if_id = 0; while (argc > 0) { if (strcmp(*argv, "dir") == 0) { @@ -619,7 +622,11 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, NEXT_ARG(); xfrm_policy_ptype_parse(&upt.type, &argc, &argv); - + } else if (strcmp(*argv, "if_id") == 0) { + NEXT_ARG(); + if (get_u32(&if_id, *argv, 0)) + invarg("IF_ID value is invalid", *argv); + is_if_id_set = true; } else { if (selp) invarg("unknown", *argv); @@ -669,6 +676,9 @@ static int xfrm_policy_get_or_delete(int argc, char **argv, int delete, (void *)&ctx, ctx.sctx.len); } + if (is_if_id_set) + addattr32(&req.n, sizeof(req.buf), XFRMA_IF_ID, if_id); + if (rtnl_talk(&rth, &req.n, answer) < 0) exit(2); @@ -767,6 +777,11 @@ static int xfrm_policy_keep(struct nlmsghdr *n, void *arg) } } + if (tb[XFRMA_IF_ID]) { + addattr32(new_n, xb->size, XFRMA_IF_ID, + rta_getattr_u32(tb[XFRMA_IF_ID])); + } + xb->offset += new_n->nlmsg_len; xb->nlmsg_count++; diff --git a/man/man8/ip-xfrm.8 b/man/man8/ip-xfrm.8 index d717205da..aa28db499 100644 --- a/man/man8/ip-xfrm.8 +++ b/man/man8/ip-xfrm.8 @@ -259,6 +259,8 @@ ip-xfrm \- transform configuration .IR MASK " ] ]" .RB "[ " ptype .IR PTYPE " ]" +.RB "[ " if_id +.IR IF-ID " ]" .ti -8 .BR ip " [ " -4 " | " -6 " ] " "xfrm policy" " { " deleteall " | " list " }"