@@ -538,3 +538,69 @@ int config_parse_nexthop_gateway(
538538 TAKE_PTR (n );
539539 return 0 ;
540540}
541+
542+ int config_parse_nexthop_family (
543+ const char * unit ,
544+ const char * filename ,
545+ unsigned line ,
546+ const char * section ,
547+ unsigned section_line ,
548+ const char * lvalue ,
549+ int ltype ,
550+ const char * rvalue ,
551+ void * data ,
552+ void * userdata ) {
553+
554+ _cleanup_ (nexthop_free_or_set_invalidp ) NextHop * n = NULL ;
555+ Network * network = userdata ;
556+ AddressFamily a ;
557+ int r ;
558+
559+ assert (filename );
560+ assert (section );
561+ assert (lvalue );
562+ assert (rvalue );
563+ assert (data );
564+
565+ r = nexthop_new_static (network , filename , section_line , & n );
566+ if (r < 0 )
567+ return log_oom ();
568+
569+ if (isempty (rvalue ) &&
570+ in_addr_is_null (n -> family , & n -> gw ) != 0 ) {
571+ /* Accept an empty string only when Gateway= is null or not specified. */
572+ n -> family = AF_UNSPEC ;
573+ TAKE_PTR (n );
574+ return 0 ;
575+ }
576+
577+ a = nexthop_address_family_from_string (rvalue );
578+ if (a < 0 ) {
579+ log_syntax (unit , LOG_WARNING , filename , line , 0 ,
580+ "Invalid %s='%s', ignoring assignment: %m" , lvalue , rvalue );
581+ return 0 ;
582+ }
583+
584+ if (in_addr_is_null (n -> family , & n -> gw ) == 0 &&
585+ ((a == ADDRESS_FAMILY_IPV4 && n -> family == AF_INET6 ) ||
586+ (a == ADDRESS_FAMILY_IPV6 && n -> family == AF_INET ))) {
587+ log_syntax (unit , LOG_WARNING , filename , line , 0 ,
588+ "Specified family '%s' conflicts with the family of the previously specified Gateway=, "
589+ "ignoring assignment." , rvalue );
590+ return 0 ;
591+ }
592+
593+ switch (a ) {
594+ case ADDRESS_FAMILY_IPV4 :
595+ n -> family = AF_INET ;
596+ break ;
597+ case ADDRESS_FAMILY_IPV6 :
598+ n -> family = AF_INET6 ;
599+ break ;
600+ default :
601+ assert_not_reached ("Invalid family." );
602+ }
603+
604+ TAKE_PTR (n );
605+ return 0 ;
606+ }
0 commit comments