Skip to content

Commit a9b9450

Browse files
committed
kernel-netlink: Update SA selector if it contains changed IP address(es)
1 parent 97c4551 commit a9b9450

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/libcharon/plugins/kernel_netlink/kernel_netlink_ipsec.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,6 +2257,7 @@ METHOD(kernel_ipsec_t, update_sa, status_t,
22572257
uint32_t replay_esn_len = 0;
22582258
kernel_ipsec_del_sa_t del = { 0 };
22592259
status_t status = FAILED;
2260+
traffic_selector_t *ts;
22602261
char markstr[32] = "";
22612262

22622263
/* if IPComp is used, we first update the IPComp SA */
@@ -2360,10 +2361,26 @@ METHOD(kernel_ipsec_t, update_sa, status_t,
23602361
if (!id->src->ip_equals(id->src, data->new_src))
23612362
{
23622363
host2xfrm(data->new_src, &sa->saddr);
2364+
2365+
ts = selector2ts(&sa->sel, TRUE);
2366+
if (ts && ts->is_host(ts, id->src))
2367+
{
2368+
ts->set_address(ts, data->new_src);
2369+
ts2subnet(ts, &sa->sel.saddr, &sa->sel.prefixlen_s);
2370+
}
2371+
DESTROY_IF(ts);
23632372
}
23642373
if (!id->dst->ip_equals(id->dst, data->new_dst))
23652374
{
23662375
host2xfrm(data->new_dst, &sa->id.daddr);
2376+
2377+
ts = selector2ts(&sa->sel, FALSE);
2378+
if (ts && ts->is_host(ts, id->dst))
2379+
{
2380+
ts->set_address(ts, data->new_dst);
2381+
ts2subnet(ts, &sa->sel.daddr, &sa->sel.prefixlen_d);
2382+
}
2383+
DESTROY_IF(ts);
23672384
}
23682385

23692386
rta = XFRM_RTA(out_hdr, struct xfrm_usersa_info);

0 commit comments

Comments
 (0)