systemd: Backport foreignroutingpolicy from 249.

Also install the modprobe.d support files to allow systemd-networkd to
configure bond and dummy interfaces.

This will allow the GMEC team to drop it's own systemd fork.

BUG=b/180686339
TEST=networkd.conf supporst new directives and systemd.conf exists in
/etc/modprobe.d
RELEASE_NOTE=none

Change-Id: I02ec4fa22e5aba2b0ca5a90faca9a8eeb76d7912
Reviewed-on: https://cos-review.googlesource.com/c/cos/overlays/board-overlays/+/21850
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Roy Yang <royyang@google.com>
Reviewed-by: Meena Shanmugam <meenashanmugam@google.com>
diff --git a/project-lakitu/sys-apps/systemd/files/249-foreignroutingpolicy.patch b/project-lakitu/sys-apps/systemd/files/249-foreignroutingpolicy.patch
new file mode 100644
index 0000000..f1b3ea8
--- /dev/null
+++ b/project-lakitu/sys-apps/systemd/files/249-foreignroutingpolicy.patch
@@ -0,0 +1,115 @@
+commit d94dfe7053d49fa62c4bfc07b7f3fc2227c10aff
+Author: Yu Watanabe <watanabe.yu+github@gmail.com>
+Date:   Sun Apr 11 21:33:51 2021 +0900
+
+    network: introduce ManageForeignRoutingPolicyRules= boolean setting in networkd.conf
+    
+    The commit 0b81225e5791f660506f7db0ab88078cf296b771 makes that networkd
+    remove all foreign rules except those with "proto kernel".
+    
+    But, in some situation, people may want to manage routing policy rules
+    with other tools, e.g. 'ip' command. To support such the situation,
+    this introduce ManageForeignRoutingPolicyRules= boolean setting.
+    
+    Closes #19106.
+
+diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml
+index dcce2095ed..23422c6c94 100644
+--- a/man/networkd.conf.xml
++++ b/man/networkd.conf.xml
+@@ -62,6 +62,15 @@
+         If <varname>SpeedMeter=no</varname>, the value is ignored. Defaults to 10sec.</para></listitem>
+       </varlistentry>
+ 
++      <varlistentry>
++        <term><varname>ManageForeignRoutingPolicyRules=</varname></term>
++        <listitem><para>A boolean. When true, <command>systemd-networkd</command> will remove rules
++        that are not configured in .network files (except for rules with protocol
++        <literal>kernel</literal>). When false, it will not remove any foreign rules, keeping them even
++        if they are not configured in a .network file. Defaults to yes.
++        </para></listitem>
++      </varlistentry>
++
+       <varlistentry>
+         <term><varname>ManageForeignRoutes=</varname></term>
+         <listitem><para>A boolean. When true, <command>systemd-networkd</command> will store any routes
+diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf
+index b2a2f55790..74d509896a 100644
+--- a/src/network/networkd-gperf.gperf
++++ b/src/network/networkd-gperf.gperf
+@@ -20,9 +20,10 @@ struct ConfigPerfItem;
+ %struct-type
+ %includes
+ %%
+-Network.SpeedMeter,            config_parse_bool,                      0,          offsetof(Manager, use_speed_meter)
+-Network.SpeedMeterIntervalSec, config_parse_sec,                       0,          offsetof(Manager, speed_meter_interval_usec)
+-Network.ManageForeignRoutes,   config_parse_bool,                      0,          offsetof(Manager, manage_foreign_routes)
+-Network.RouteTable,            config_parse_route_table_names,         0,          0
+-DHCP.DUIDType,                 config_parse_duid_type,                 0,          offsetof(Manager, duid)
+-DHCP.DUIDRawData,              config_parse_duid_rawdata,              0,          offsetof(Manager, duid)
++Network.SpeedMeter,                      config_parse_bool,                      0,          offsetof(Manager, use_speed_meter)
++Network.SpeedMeterIntervalSec,           config_parse_sec,                       0,          offsetof(Manager, speed_meter_interval_usec)
++Network.ManageForeignRoutingPolicyRules, config_parse_bool,                      0,          offsetof(Manager, manage_foreign_rules)
++Network.ManageForeignRoutes,             config_parse_bool,                      0,          offsetof(Manager, manage_foreign_routes)
++Network.RouteTable,                      config_parse_route_table_names,         0,          0
++DHCP.DUIDType,                           config_parse_duid_type,                 0,          offsetof(Manager, duid)
++DHCP.DUIDRawData,                        config_parse_duid_rawdata,              0,          offsetof(Manager, duid)
+diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
+index a8db2cc44b..20957ecd89 100644
+--- a/src/network/networkd-manager.c
++++ b/src/network/networkd-manager.c
+@@ -380,6 +380,7 @@ int manager_new(Manager **ret) {
+         *m = (Manager) {
+                 .speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
+                 .manage_foreign_routes = true,
++                .manage_foreign_rules = true,
+                 .ethtool_fd = -1,
+         };
+ 
+@@ -655,6 +656,9 @@ static int manager_enumerate_rules(Manager *m) {
+         assert(m);
+         assert(m->rtnl);
+ 
++        if (!m->manage_foreign_rules)
++                return 0;
++
+         r = sd_rtnl_message_new_routing_policy_rule(m->rtnl, &req, RTM_GETRULE, 0);
+         if (r < 0)
+                 return r;
+diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h
+index 7f630fccc7..0fae7a5c2e 100644
+--- a/src/network/networkd-manager.h
++++ b/src/network/networkd-manager.h
+@@ -32,6 +32,7 @@ struct Manager {
+         bool dirty;
+         bool restarting;
+         bool manage_foreign_routes;
++        bool manage_foreign_rules;
+ 
+         Set *dirty_links;
+ 
+diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c
+index a7fddfd58f..03bdd4e640 100644
+--- a/src/network/networkd-routing-policy-rule.c
++++ b/src/network/networkd-routing-policy-rule.c
+@@ -977,6 +977,8 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
+         case RTM_NEWRULE:
+                 if (rule)
+                         log_routing_policy_rule_debug(tmp, tmp->family, "Received remembered", NULL, m);
++                else if (!m->manage_foreign_routes)
++                        log_routing_policy_rule_debug(tmp, tmp->family, "Ignoring received foreign", NULL, m);
+                 else {
+                         log_routing_policy_rule_debug(tmp, tmp->family, "Remembering foreign", NULL, m);
+                         r = routing_policy_rule_consume_foreign(m, TAKE_PTR(tmp));
+diff --git a/src/network/networkd.conf b/src/network/networkd.conf
+index 0eac327314..4e4e8b8d07 100644
+--- a/src/network/networkd.conf
++++ b/src/network/networkd.conf
+@@ -15,6 +15,7 @@
+ [Network]
+ #SpeedMeter=no
+ #SpeedMeterIntervalSec=10sec
++#ManageForeignRoutingPolicyRules=yes
+ #ManageForeignRoutes=yes
+ #RouteTable=
+ 
diff --git a/project-lakitu/sys-apps/systemd/systemd-248.6-r1.ebuild b/project-lakitu/sys-apps/systemd/systemd-248.6-r2.ebuild
similarity index 100%
rename from project-lakitu/sys-apps/systemd/systemd-248.6-r1.ebuild
rename to project-lakitu/sys-apps/systemd/systemd-248.6-r2.ebuild
diff --git a/project-lakitu/sys-apps/systemd/systemd-248.6.ebuild b/project-lakitu/sys-apps/systemd/systemd-248.6.ebuild
index ad859ff..7a60570 100644
--- a/project-lakitu/sys-apps/systemd/systemd-248.6.ebuild
+++ b/project-lakitu/sys-apps/systemd/systemd-248.6.ebuild
@@ -263,6 +263,8 @@
 			# Remove this patch once stackdriver logging agent is
 			# upgraded with latest systemd version.
 			"${FILESDIR}"/248-systemd-journald-support-old-format.patch
+			# Can remove once we upgrade to v249+
+			"${FILESDIR}"/249-foreignroutingpolicy.patch
 	)
 
 	#if ! use vanilla; then
@@ -433,6 +435,10 @@
 		dosym /dev/null /etc/systemd/network/99-default.link
 	fi
 
+	# Install modprobe.d files.
+	insinto /etc/modprobe.d
+	doins modprobe.d/systemd.conf
+
 	# Enable accounting for all supported controllers (CPU, Memory and Block)
 	sed -i 's/#DefaultCPUAccounting=no/DefaultCPUAccounting=yes/' "${ED}"/etc/systemd/system.conf
 	sed -i 's/#DefaultBlockIOAccounting=no/DefaultBlockIOAccounting=yes/' "${ED}"/etc/systemd/system.conf