xfrm_{state, policy}: Allow to deleteall polices/states with marks
Using 'ip deleteall' with policies that have marks, fails unless you eplicitely specify the mark values. This is very uncomfortable when bulk-deleting policies and states. With this patch all relevant states and policies are wiped by 'ip deleteall' regardless of their mark values. Signed-off-by: Thomas Egerer <thomas.egerer@secunet.com>
This commit is contained in:
parent
5474d440b8
commit
0c7d651b38
|
|
@ -753,6 +753,15 @@ static int xfrm_policy_keep(const struct sockaddr_nl *who,
|
|||
xpid->dir = xpinfo->dir;
|
||||
xpid->index = xpinfo->index;
|
||||
|
||||
if (tb[XFRMA_MARK]) {
|
||||
int r = addattr_l(new_n, xb->size, XFRMA_MARK,
|
||||
(void *)RTA_DATA(tb[XFRMA_MARK]), tb[XFRMA_MARK]->rta_len);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "%s: XFRMA_MARK failed\n", __func__);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
xb->offset += new_n->nlmsg_len;
|
||||
xb->nlmsg_count++;
|
||||
|
||||
|
|
|
|||
|
|
@ -1080,6 +1080,7 @@ static int xfrm_state_keep(const struct sockaddr_nl *who,
|
|||
int len = n->nlmsg_len;
|
||||
struct nlmsghdr *new_n;
|
||||
struct xfrm_usersa_id *xsid;
|
||||
struct rtattr *tb[XFRMA_MAX+1];
|
||||
|
||||
if (n->nlmsg_type != XFRM_MSG_NEWSA) {
|
||||
fprintf(stderr, "Not a state: %08x %08x %08x\n",
|
||||
|
|
@ -1116,6 +1117,17 @@ static int xfrm_state_keep(const struct sockaddr_nl *who,
|
|||
addattr_l(new_n, xb->size, XFRMA_SRCADDR, &xsinfo->saddr,
|
||||
sizeof(xsid->daddr));
|
||||
|
||||
parse_rtattr(tb, XFRMA_MAX, XFRMS_RTA(xsinfo), len);
|
||||
|
||||
if (tb[XFRMA_MARK]) {
|
||||
int r = addattr_l(new_n, xb->size, XFRMA_MARK,
|
||||
(void *)RTA_DATA(tb[XFRMA_MARK]), tb[XFRMA_MARK]->rta_len);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "%s: XFRMA_MARK failed\n", __func__);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
xb->offset += new_n->nlmsg_len;
|
||||
xb->nlmsg_count++;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue