@@ -238,29 +238,38 @@ static int address_copy(Address *dest, const Address *src) {
238238 return 0 ;
239239}
240240
241- static int address_establish (Address * address , Link * link ) {
242- bool masq ;
241+ static int address_set_masquerade (Address * address , bool add ) {
242+ union in_addr_union masked ;
243243 int r ;
244244
245245 assert (address );
246- assert (link );
246+ assert (address -> link );
247247
248- masq = link -> network &&
249- link -> network -> ip_masquerade &&
250- address -> family == AF_INET &&
251- address -> scope < RT_SCOPE_LINK ;
248+ if (!address -> link -> network )
249+ return 0 ;
252250
253- /* Add firewall entry if this is requested */
254- if (address -> ip_masquerade_done != masq ) {
255- union in_addr_union masked = address -> in_addr ;
256- in_addr_mask (address -> family , & masked , address -> prefixlen );
251+ if (!address -> link -> network -> ip_masquerade )
252+ return 0 ;
257253
258- r = fw_add_masquerade (masq , AF_INET , 0 , & masked , address -> prefixlen , NULL , NULL , 0 );
259- if (r < 0 )
260- return r ;
254+ if (address -> family != AF_INET )
255+ return 0 ;
261256
262- address -> ip_masquerade_done = masq ;
263- }
257+ if (address -> scope >= RT_SCOPE_LINK )
258+ return 0 ;
259+
260+ if (address -> ip_masquerade_done == add )
261+ return 0 ;
262+
263+ masked = address -> in_addr ;
264+ r = in_addr_mask (address -> family , & masked , address -> prefixlen );
265+ if (r < 0 )
266+ return r ;
267+
268+ r = fw_add_masquerade (add , AF_INET , 0 , & masked , address -> prefixlen , NULL , NULL , 0 );
269+ if (r < 0 )
270+ return r ;
271+
272+ address -> ip_masquerade_done = add ;
264273
265274 return 0 ;
266275}
@@ -334,27 +343,6 @@ static int address_add(Link *link, int family, const union in_addr_union *in_add
334343 return 0 ;
335344}
336345
337- static int address_release (Address * address ) {
338- int r ;
339-
340- assert (address );
341- assert (address -> link );
342-
343- /* Remove masquerading firewall entry if it was added */
344- if (address -> ip_masquerade_done ) {
345- union in_addr_union masked = address -> in_addr ;
346- in_addr_mask (address -> family , & masked , address -> prefixlen );
347-
348- r = fw_add_masquerade (false, AF_INET , 0 , & masked , address -> prefixlen , NULL , NULL , 0 );
349- if (r < 0 )
350- return r ;
351-
352- address -> ip_masquerade_done = false;
353- }
354-
355- return 0 ;
356- }
357-
358346static int address_update (
359347 Address * address ,
360348 unsigned char flags ,
@@ -410,7 +398,7 @@ static int address_drop(Address *address) {
410398 ready = address_is_ready (address );
411399 link = address -> link ;
412400
413- r = address_release (address );
401+ r = address_set_masquerade (address , false );
414402 if (r < 0 )
415403 log_link_warning_errno (link , r , "Failed to disable IP masquerading, ignoring: %m" );
416404
@@ -886,27 +874,26 @@ int address_configure(
886874 if (r < 0 )
887875 return log_link_error_errno (link , r , "Could not append IFA_CACHEINFO attribute: %m" );
888876
889- r = address_establish (address , link );
877+ if (address -> family == AF_INET6 && !in_addr_is_null (address -> family , & address -> in_addr_peer ))
878+ r = address_add (link , address -> family , & address -> in_addr_peer , address -> prefixlen , & a );
879+ else
880+ r = address_add (link , address -> family , & address -> in_addr , address -> prefixlen , & a );
881+ if (r < 0 )
882+ return log_link_error_errno (link , r , "Could not add address: %m" );
883+
884+ a -> scope = address -> scope ;
885+ r = address_set_masquerade (a , true);
890886 if (r < 0 )
891887 log_link_warning_errno (link , r , "Could not enable IP masquerading, ignoring: %m" );
892888
893889 r = netlink_call_async (link -> manager -> rtnl , NULL , req , callback , link_netlink_destroy_callback , link );
894890 if (r < 0 ) {
895- address_release ( address );
891+ ( void ) address_set_masquerade ( a , false );
896892 return log_link_error_errno (link , r , "Could not send rtnetlink message: %m" );
897893 }
898894
899895 link_ref (link );
900896
901- if (address -> family == AF_INET6 && !in_addr_is_null (address -> family , & address -> in_addr_peer ))
902- r = address_add (link , address -> family , & address -> in_addr_peer , address -> prefixlen , & a );
903- else
904- r = address_add (link , address -> family , & address -> in_addr , address -> prefixlen , & a );
905- if (r < 0 ) {
906- address_release (address );
907- return log_link_error_errno (link , r , "Could not add address: %m" );
908- }
909-
910897 if (FLAGS_SET (address -> duplicate_address_detection , ADDRESS_FAMILY_IPV4 )) {
911898 r = ipv4_dad_configure (a );
912899 if (r < 0 )
0 commit comments