[nmh][network-manager] Create factory config target.

This allows having product dependent factory configuration.

Change-Id: Ieb4d9fae7d146eb930bcb2bc867a1517f6293cfb
diff --git a/products/router.gni b/products/router.gni
index dc54b70..4cc800e 100644
--- a/products/router.gni
+++ b/products/router.gni
@@ -37,6 +37,7 @@
   "//garnet/packages/tools:boringssl",
   "//src/connectivity/management/network_manager",
   "//src/connectivity/management/network_manager:network_manager_sysmgr_config",
+  "//src/connectivity/management/network_manager:router_config",
   "//src/connectivity/management/network_manager_cli",
   "//src/connectivity/network/dhcp:dhcpd",
   "//src/connectivity/network/mdns/bundles:utils",
diff --git a/src/connectivity/management/network_manager/BUILD.gn b/src/connectivity/management/network_manager/BUILD.gn
index d9c0d36..dbd113c 100644
--- a/src/connectivity/management/network_manager/BUILD.gn
+++ b/src/connectivity/management/network_manager/BUILD.gn
@@ -58,21 +58,26 @@
     },
   ]
 
-  # TODO(cgibson): Need to figure out an appropriate delivery mechanism
-  # for configuration file data. Since we are only running on Toulouse, we
-  # can do this for now.
   resources = [
     {
-      path = rebase_path("data/toulouse.json")
-      dest = "factory_config.json"
-    },
-    {
       path = rebase_path("data/device_schema.json")
       dest = "device_schema.json"
     },
   ]
 }
 
+config_data("network_manager_config") {
+  for_pkg = "network_manager"
+  sources = [ rebase_path("config/network_manager_default.json") ]
+  outputs = [ "factory_config.json" ]
+}
+
+config_data("router_config") {
+  for_pkg = "network_manager"
+  sources = [ rebase_path("config/toulouse.json") ]
+  outputs = [ "factory_config.json" ]
+}
+
 test_package("network_manager_tests") {
   deps = [
     ":bin_test",
@@ -108,9 +113,13 @@
       dest = "device_schema.json"
     },
     {
-      path = rebase_path("data/toulouse.json")
+      path = rebase_path("config/toulouse.json")
       dest = "toulouse_factory_config.json"
     },
+    {
+      path = rebase_path("config/network_manager_default.json")
+      dest = "default_factory_config.json"
+    },
   ]
 }
 
diff --git a/src/connectivity/management/network_manager/config/network_manager_default.json b/src/connectivity/management/network_manager/config/network_manager_default.json
new file mode 100644
index 0000000..6aa6c17
--- /dev/null
+++ b/src/connectivity/management/network_manager/config/network_manager_default.json
@@ -0,0 +1,156 @@
+{
+    "device": {
+        "interfaces": [
+            {
+                "interface": {
+                    "config": {
+                        "name": "wlan",
+                        "type": "IF_UPLINK"
+                    },
+                    "device_id": "wlanif-client",
+                    "oper_state": "UP",
+                    "subinterfaces": [
+                        {
+                            "admin_state": "UP",
+                            "ipv4": {
+                                "addresses": [
+                                    {
+                                        "dhcp_client": true
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "ethernet": {
+                        "config": {
+                            "auto_negotiate": true,
+                            "duplex_mode": "FULL",
+                            "enable_flow_control": true,
+                            "port_speed": "SPEED_1G"
+                        }
+                    }
+                }
+            },
+            {
+                "interface": {
+                    "config": {
+                        "name": "usb",
+                        "type": "IF_UPLINK"
+                    },
+                    "device_id": "cdc-eth-function",
+                    "oper_state": "UP",
+                    "subinterfaces": [
+                        {
+                            "admin_state": "UP",
+                            "ipv4": {
+                                "addresses": [
+                                    {
+                                        "dhcp_client": true
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "ethernet": {
+                        "config": {
+                            "auto_negotiate": true,
+                            "duplex_mode": "FULL",
+                            "enable_flow_control": true,
+                            "port_speed": "SPEED_1G"
+                        }
+                    }
+                }
+            },
+            {
+                "interface": {
+                    "config": {
+                        "name": "usb1",
+                        "type": "IF_UPLINK"
+                    },
+                    "device_id": "usb-cdc-ecm",
+                    "oper_state": "UP",
+                    "subinterfaces": [
+                        {
+                            "admin_state": "UP",
+                            "ipv4": {
+                                "addresses": [
+                                    {
+                                        "dhcp_client": true
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "ethernet": {
+                        "config": {
+                            "auto_negotiate": true,
+                            "duplex_mode": "FULL",
+                            "enable_flow_control": true,
+                            "port_speed": "SPEED_1G"
+                        }
+                    }
+                }
+            },
+            {
+                "interface": {
+                    "config": {
+                        "name": "usb2",
+                        "type": "IF_UPLINK"
+                    },
+                    "device_id": "ax88179",
+                    "oper_state": "UP",
+                    "subinterfaces": [
+                        {
+                            "admin_state": "UP",
+                            "ipv4": {
+                                "addresses": [
+                                    {
+                                        "dhcp_client": true
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "ethernet": {
+                        "config": {
+                            "auto_negotiate": true,
+                            "duplex_mode": "FULL",
+                            "enable_flow_control": true,
+                            "port_speed": "SPEED_1G"
+                        }
+                    }
+                }
+            },
+            {
+                "interface": {
+                    "config": {
+                        "name": "lo0",
+                        "type": "IF_LOOPBACK"
+                    },
+                    "oper_state": "UP",
+                    "subinterfaces": [
+                        {
+                            "admin_state": "UP",
+                            "ipv4": {
+                                "addresses": [
+                                    {
+                                        "ip": "127.0.0.1",
+                                        "prefix_length": 8
+                                    }
+                                ]
+                            },
+                            "ipv6": {
+                                "addresses": [
+                                    {
+                                        "ip": "::1",
+                                        "prefix_length": 128
+                                    }
+                                ]
+                            }
+                        }
+                    ]
+                }
+            }
+        ]
+    }
+}
diff --git a/src/connectivity/management/network_manager/data/toulouse.json b/src/connectivity/management/network_manager/config/toulouse.json
similarity index 100%
rename from src/connectivity/management/network_manager/data/toulouse.json
rename to src/connectivity/management/network_manager/config/toulouse.json
diff --git a/src/connectivity/management/network_manager/core/src/config.rs b/src/connectivity/management/network_manager/core/src/config.rs
index 2040ac8..d10e88c 100644
--- a/src/connectivity/management/network_manager/core/src/config.rs
+++ b/src/connectivity/management/network_manager/core/src/config.rs
@@ -1283,6 +1283,16 @@
     }
 
     #[test]
+    fn verify_default_factory_config() {
+        let config_path = "/pkg/data/default_factory_config.json";
+        let mut contents = String::new();
+        let mut f = File::open(config_path).unwrap();
+        f.read_to_string(&mut contents).unwrap();
+        let _deserialized_config: DeviceConfig = serde_json::from_str(&contents)
+            .expect(format!("Failed to deserialized {}", config_path).as_ref());
+    }
+
+    #[test]
     fn test_validate_interface_types() {
         let test_config = create_test_config_no_paths();
         let mut intf = create_test_interface();
diff --git a/src/connectivity/management/network_manager/core/src/lib.rs b/src/connectivity/management/network_manager/core/src/lib.rs
index 64b194f..7f680bc 100644
--- a/src/connectivity/management/network_manager/core/src/lib.rs
+++ b/src/connectivity/management/network_manager/core/src/lib.rs
@@ -128,7 +128,7 @@
             },
             config: config::Config::new(
                 "/data/user_config.json",
-                "/pkg/data/factory_config.json",
+                "/config/data/factory_config.json",
                 "/pkg/data/device_schema.json",
             ),
         }
diff --git a/src/connectivity/management/network_manager/meta/network_manager.cmx b/src/connectivity/management/network_manager/meta/network_manager.cmx
index a51f68d..2565cc9 100644
--- a/src/connectivity/management/network_manager/meta/network_manager.cmx
+++ b/src/connectivity/management/network_manager/meta/network_manager.cmx
@@ -7,6 +7,7 @@
             "class/ethernet"
         ],
         "features": [
+            "config-data",
             "isolated-persistent-storage"
         ],
         "services": [