@@ -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