network: make Route.Type= support local, broadcast, anycast, multicast, nat, and...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 7 Jul 2019 00:40:17 +0000 (09:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Jul 2019 00:39:43 +0000 (09:39 +0900)
Closes #12975.

man/systemd.network.xml
src/network/networkd-route.c
src/network/networkd-route.h

index 612450d..70abb14 100644 (file)
         <varlistentry>
           <term><varname>Type=</varname></term>
           <listitem>
-            <para>Specifies the type for the route. If <literal>unicast</literal>, a regular route is defined, i.e. a
+            <para>Specifies the type for the route. Takes one of <literal>unicast</literal>,
+            <literal>local</literal>, <literal>broadcast</literal>, <literal>anycast</literal>,
+            <literal>multicast</literal>, <literal>blackhole</literal>, <literal>unreachable</literal>,
+            <literal>prohibit</literal>, <literal>throw</literal>, <literal>nat</literal>, and
+            <literal>xresolve</literal>. If <literal>unicast</literal>, a regular route is defined, i.e. a
             route indicating the path to take to a destination network address. If <literal>blackhole</literal>, packets
             to the defined route are discarded silently. If <literal>unreachable</literal>, packets to the defined route
             are discarded and the ICMP message "Host Unreachable" is generated. If <literal>prohibit</literal>, packets
index 618d250..f13214c 100644 (file)
@@ -719,6 +719,8 @@ int network_add_ipv4ll_route(Network *network) {
         n->family = AF_INET;
         n->dst_prefixlen = 16;
         n->scope = RT_SCOPE_LINK;
+        n->scope_set = true;
+        n->table_set = true;
         n->priority = IPV4LL_ROUTE_METRIC;
         n->protocol = RTPROT_STATIC;
 
@@ -752,10 +754,16 @@ int network_add_default_route_on_device(Network *network) {
 
 static const char * const route_type_table[__RTN_MAX] = {
         [RTN_UNICAST]     = "unicast",
+        [RTN_LOCAL]       = "local",
+        [RTN_BROADCAST]   = "broadcast",
+        [RTN_ANYCAST]     = "anycast",
+        [RTN_MULTICAST]   = "multicast",
         [RTN_BLACKHOLE]   = "blackhole",
         [RTN_UNREACHABLE] = "unreachable",
         [RTN_PROHIBIT]    = "prohibit",
         [RTN_THROW]       = "throw",
+        [RTN_NAT]         = "nat",
+        [RTN_XRESOLVE]    = "xresolve",
 };
 
 assert_cc(__RTN_MAX <= UCHAR_MAX);
@@ -971,6 +979,7 @@ int config_parse_route_scope(
                 return 0;
         }
 
+        n->scope_set = true;
         TAKE_PTR(n);
         return 0;
 }
@@ -1008,6 +1017,7 @@ int config_parse_route_table(
                 return 0;
         }
 
+        n->table_set = true;
         TAKE_PTR(n);
         return 0;
 }
@@ -1371,6 +1381,18 @@ int route_section_verify(Route *route, Network *network) {
                                          route->section->filename, route->section->line);
         }
 
+        if (route->family != AF_INET6) {
+                if (!route->table_set && IN_SET(route->type, RTN_LOCAL, RTN_BROADCAST, RTN_ANYCAST, RTN_NAT))
+                        route->table = RT_TABLE_LOCAL;
+
+                if (!route->scope_set) {
+                        if (IN_SET(route->type, RTN_LOCAL, RTN_NAT))
+                                route->scope = RT_SCOPE_HOST;
+                        else if (IN_SET(route->type, RTN_BROADCAST, RTN_ANYCAST))
+                                route->scope = RT_SCOPE_LINK;
+                }
+        }
+
         if (network->n_static_addresses == 0 &&
             in_addr_is_null(route->family, &route->gw) == 0 &&
             route->gateway_onlink < 0) {
index e7bd61e..2f0d052 100644 (file)
@@ -23,11 +23,13 @@ struct Route {
         unsigned char dst_prefixlen;
         unsigned char src_prefixlen;
         unsigned char scope;
+        bool scope_set;
         unsigned char protocol;  /* RTPROT_* */
         unsigned char type; /* RTN_* */
         unsigned char tos;
         uint32_t priority; /* note that ip(8) calls this 'metric' */
         uint32_t table;
+        bool table_set;
         uint32_t mtu;
         uint32_t initcwnd;
         uint32_t initrwnd;