Create new test module VtsKernelConfig

Separates KernelProcFileApiTest.testCheckConfigs to a new test
module. VtsKernelConfig checks /proc/config.gz to validate all
required configs are set with respect to the android-base.cfg
file specific to the kernel version of device.

Test: make vts -j40 && vts-tradefed run commandAndExit vts
--module VtsKernelConfig -l INFO
Bug: 36113471

Change-Id: I27011b85821c4b1d047d8177c26e277cf0803c6f
(cherry picked from commit beb1de379b9ca53aeedb98ca9da871acf0d4df51)
diff --git a/api/proc/KernelProcFileApiTest.py b/api/proc/KernelProcFileApiTest.py
index 0cd57e6..c62cecd 100644
--- a/api/proc/KernelProcFileApiTest.py
+++ b/api/proc/KernelProcFileApiTest.py
@@ -15,11 +15,7 @@
 # limitations under the License.
 #
 
-import gzip
 import logging
-import os
-import shutil
-import tempfile
 
 from vts.runners.host import asserts
 from vts.runners.host import base_test
@@ -41,7 +37,6 @@
 from vts.testcases.kernel.api.proc import ProcVersionTest
 from vts.testcases.kernel.api.proc import ProcVmallocInfoTest
 from vts.testcases.kernel.api.proc import ProcZoneInfoTest
-from vts.testcases.kernel.api.proc import required_kernel_configs as configs
 
 from vts.utils.python.controllers import android_device
 from vts.utils.python.file import file_utils
@@ -71,42 +66,13 @@
 
 
 class KernelProcFileApiTest(base_test.BaseTestClass):
-    """Test cases which check content of proc files.
-
-    Attributes:
-        _temp_dir: The temporary directory to which /proc/config.gz is copied.
-    """
-
-    PROC_FILE_PATH = "/proc/config.gz"
+    """Test cases which check content of proc files."""
 
     def setUpClass(self):
         self.dut = self.registerController(android_device)[0]
         self.dut.shell.InvokeTerminal(
             "KernelApiTest")  # creates a remote shell instance.
         self.shell = self.dut.shell.KernelApiTest
-        self._temp_dir = tempfile.mkdtemp()
-
-    def checkPermissionsAndExistence(self, path, check_permission):
-        """Asserts that the specified path exists and has the correct permission.
-
-        Args:
-            path: string, path to validate existence and permissions
-            check_permission: function which takes unix permissions in octal
-                              format and returns True if the permissions are
-                              correct, False otherwise.
-        """
-        asserts.assertTrue(
-            file_utils.Exists(path, self.shell),
-            "%s: File does not exist." % path)
-        try:
-            permission = file_utils.GetPermission(path, self.shell)
-            asserts.assertTrue(
-                check_permission(permission),
-                "%s: File has invalid permissions (%s)" %
-                (path, permission))
-        except (ValueError, IOError) as e:
-            asserts.fail("Failed to assert permissions: %s" % str(e))
-
 
     def runProcFileTest(self, test_object):
         """Reads from the file and checks that it parses and the content is valid.
@@ -115,7 +81,8 @@
             test_object: inherits KernelProcFileTestBase, contains the test functions
         """
         filepath = test_object.get_path()
-        self.checkPermissionsAndExistence(filepath, test_object.get_permission_checker())
+        file_utils.assertPermissionsAndExistence(
+            self.shell, filepath, test_object.get_permission_checker())
 
         logging.info("Testing format of %s", filepath)
 
@@ -159,49 +126,6 @@
 
         return results[const.STDOUT][0]
 
-    def testCheckConfigs(self):
-        """Ensures all options from android-base.cfg are enabled."""
-
-        logging.info("Testing existence of %s", self.PROC_FILE_PATH)
-        self.checkPermissionsAndExistence(
-            self.PROC_FILE_PATH, file_utils.IsReadOnly)
-
-        self.dut.adb.pull("%s %s" % (self.PROC_FILE_PATH, self._temp_dir))
-        logging.info("Adb pull %s to %s", self.PROC_FILE_PATH, self._temp_dir)
-
-        localpath = os.path.join(self._temp_dir, "config.gz")
-        with gzip.open(localpath, 'rb') as f:
-            device_config_lines = [line.rstrip("\n") for line in f.readlines()]
-
-        device_configs = dict()
-        for line in device_config_lines:
-            if line == "" or line.startswith("#"):
-                continue
-            config_name, config_state = line.split("=", 1)
-            device_configs[config_name] = config_state
-
-        should_be_enabled = []
-        should_not_be_set = []
-        for config_name, config_state in configs.CONFIGS.iteritems():
-            if (config_state == "y" and
-                (config_name not in device_configs or
-                 device_configs[config_name] not in ("y", "m"))):
-                should_be_enabled.append(config_name)
-            elif config_state == "n" and config_name in device_configs:
-                should_not_be_set.append(config_name + "=" +
-                                         device_configs[config_name])
-
-        asserts.assertTrue(
-            len(should_be_enabled) == 0 and len(should_not_be_set) == 0,
-            ("The following kernel configs should be enabled: [%s].\n"
-             "The following kernel configs should not be set: [%s]") %
-            (", ".join(should_be_enabled), ", ".join(should_not_be_set)))
-
-    def tearDownClass(self):
-        """Deletes the temporary directory."""
-        logging.info("Delete %s", self._temp_dir)
-        shutil.rmtree(self._temp_dir)
-
 
 if __name__ == "__main__":
     test_runner.main()
diff --git a/api/proc/required_kernel_configs.py b/api/proc/required_kernel_configs.py
deleted file mode 100644
index c99e6e7..0000000
--- a/api/proc/required_kernel_configs.py
+++ /dev/null
@@ -1,264 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Required kernel configuration options for Treble.
-
-    TODO(jaeshin): Uncomment configs that are temporarily commented out
-    (# marlin) to ensure the testCheckConfigs test passes, once the marlin
-    kernel is updated.
-    TODO(jaeshin): Consolidate new config requirements with android-base.cfg
-
-    Kernel configuration requirements are specified in android-base.cfg
-
-    Key: config_name
-    Value: config_state
-        "y": enabled, represents both "y" and "m" options
-        "n": should not be set
-"""
-
-CONFIGS = {
-    # Loadable Kernel Modules
-    # "CONFIG_MODULES": "y", # marlin
-    # "CONFIG_MODULE_UNLOAD": "y", # marlin
-    # "CONFIG_MODVERSIONS": "y", # marlin
-    # "CONFIG_MODULE_SIG": "y", # marlin
-    # "CONFIG_MODULE_SIG_FORCE": "y", # marlin
-
-    # Device Tree Support
-    "CONFIG_OF": "y",
-    # "CONFIG_OF_*": "y",
-    # "CONFIG_PROC_DEVICETREE": "y", # for kernels prior to 3.15
-
-    # procfs
-    "CONFIG_PROC_FS": "y",
-    "CONFIG_PROC_SYSCTL": "y",
-    "CONFIG_PROC_PAGE_MONITOR": "y",
-    "CONFIG_PROC_PID_CPUSET": "y",
-    "CONFIG_IKCONFIG": "y",
-    "CONFIG_IKCONFIG_PROC": "y",
-
-    # sysfs
-    "CONFIG_SYSFS": "y",
-    "CONFIG_SYSFS_DEPRECATED": "n",
-
-    # debugfs
-    # "CONFIG_DEBUG_FS": "n", # marlin
-
-    # selinuxfs
-    # "CONFIG_SECURITY_SELINUX": "y", # duplicated below in android-base.cfg
-
-    # cgroups
-    # "CONFIG_CGROUPS": "y", # duplicated below in android-base.cfg
-    "CONFIG_CGROUP_DEBUG": "n",
-
-    # memory
-    # "CONFIG_MEMCG": "y", # marlin
-
-    # cpu
-    # "CONFIG_CGROUP_SCHED": "y", # duplicated below in android-base.cfg
-    # "CONFIG_RT_GROUP_SCHED": "y", # duplicated below in android-base.cfg
-    # "CONFIG_FAIR_GROUP_SCHED": "y",  # optional
-
-    # cpuacct
-    # "CONFIG_CGROUP_CPUACCT": "y", # duplicated below in android-base.cfg
-
-    # cpuset
-    "CONFIG_CPUSETS": "y",
-    # "CONFIG_PROC_PID_CPUSET": "y", # nice to have
-
-    # schedtune
-    "CONFIG_SCHED_TUNE": "y",
-
-    # pstore fs (PENDING confirmation from kernel team)
-    # "CONFIG_PSTORE": "y",
-    # "CONFIG_PSTORE_*": "y", # differs depending on your hardware, enable the ones present
-
-    # functionfs
-    # "CONFIG_USB_FUNCTIONFS": "y", # marlin
-    # "CONFIG_USB_*": "y", # possibly a few more
-
-    # android-base.cfg configs from
-    # https://android.googlesource.com/kernel/common/+/android-4.4/android/configs/android-base.cfg
-    "CONFIG_DEVKMEM": "n",
-    "CONFIG_DEVMEM": "n",
-    "CONFIG_INET_LRO": "n",
-    "CONFIG_OABI_COMPAT": "n",
-    "CONFIG_SYSVIPC": "n",
-    "CONFIG_ANDROID": "y",
-    "CONFIG_ANDROID_BINDER_IPC": "y",
-    "CONFIG_ANDROID_LOW_MEMORY_KILLER": "y",
-    "CONFIG_ARMV8_DEPRECATED": "y",
-    "CONFIG_ASHMEM": "y",
-    "CONFIG_AUDIT": "y",
-    "CONFIG_BLK_DEV_DM": "y",
-    "CONFIG_BLK_DEV_INITRD": "y",
-    "CONFIG_CGROUPS": "y",
-    "CONFIG_CGROUP_CPUACCT": "y",
-    "CONFIG_CGROUP_FREEZER": "y",
-    "CONFIG_CGROUP_SCHED": "y",
-    # "CONFIG_CP15_BARRIER_EMULATION": "y", # marlin
-    "CONFIG_DM_CRYPT": "y",
-    "CONFIG_DM_VERITY": "y",
-    "CONFIG_DM_VERITY_FEC": "y",
-    "CONFIG_EMBEDDED": "y",
-    "CONFIG_FB": "y",
-    "CONFIG_HARDENED_USERCOPY": "y",
-    "CONFIG_HIGH_RES_TIMERS": "y",
-    "CONFIG_INET6_AH": "y",
-    "CONFIG_INET6_ESP": "y",
-    "CONFIG_INET6_IPCOMP": "y",
-    "CONFIG_INET": "y",
-    "CONFIG_INET_DIAG_DESTROY": "y",
-    "CONFIG_INET_ESP": "y",
-    "CONFIG_INET_XFRM_MODE_TUNNEL": "y",
-    "CONFIG_IP6_NF_FILTER": "y",
-    "CONFIG_IP6_NF_IPTABLES": "y",
-    "CONFIG_IP6_NF_MANGLE": "y",
-    "CONFIG_IP6_NF_RAW": "y",
-    "CONFIG_IP6_NF_TARGET_REJECT": "y",
-    "CONFIG_IPV6": "y",
-    "CONFIG_IPV6_MIP6": "y",
-    "CONFIG_IPV6_MULTIPLE_TABLES": "y",
-    "CONFIG_IPV6_OPTIMISTIC_DAD": "y",
-    # "CONFIG_IPV6_PRIVACY": "y", # marlin
-    "CONFIG_IPV6_ROUTER_PREF": "y",
-    "CONFIG_IPV6_ROUTE_INFO": "y",
-    "CONFIG_IP_ADVANCED_ROUTER": "y",
-    # "CONFIG_IP_MULTICAST": "y", # marlin
-    "CONFIG_IP_MULTIPLE_TABLES": "y",
-    "CONFIG_IP_NF_ARPFILTER": "y",
-    "CONFIG_IP_NF_ARPTABLES": "y",
-    "CONFIG_IP_NF_ARP_MANGLE": "y",
-    "CONFIG_IP_NF_FILTER": "y",
-    "CONFIG_IP_NF_IPTABLES": "y",
-    "CONFIG_IP_NF_MANGLE": "y",
-    "CONFIG_IP_NF_MATCH_AH": "y",
-    "CONFIG_IP_NF_MATCH_ECN": "y",
-    "CONFIG_IP_NF_MATCH_TTL": "y",
-    "CONFIG_IP_NF_NAT": "y",
-    "CONFIG_IP_NF_RAW": "y",
-    "CONFIG_IP_NF_SECURITY": "y",
-    "CONFIG_IP_NF_TARGET_MASQUERADE": "y",
-    "CONFIG_IP_NF_TARGET_NETMAP": "y",
-    "CONFIG_IP_NF_TARGET_REDIRECT": "y",
-    "CONFIG_IP_NF_TARGET_REJECT": "y",
-    "CONFIG_NET": "y",
-    "CONFIG_NETDEVICES": "y",
-    "CONFIG_NETFILTER": "y",
-    # "CONFIG_NETFILTER_TPROXY": "y", # marlin
-    "CONFIG_NETFILTER_XT_MATCH_COMMENT": "y",
-    "CONFIG_NETFILTER_XT_MATCH_CONNLIMIT": "y",
-    "CONFIG_NETFILTER_XT_MATCH_CONNMARK": "y",
-    "CONFIG_NETFILTER_XT_MATCH_CONNTRACK": "y",
-    "CONFIG_NETFILTER_XT_MATCH_HASHLIMIT": "y",
-    "CONFIG_NETFILTER_XT_MATCH_HELPER": "y",
-    "CONFIG_NETFILTER_XT_MATCH_IPRANGE": "y",
-    "CONFIG_NETFILTER_XT_MATCH_LENGTH": "y",
-    "CONFIG_NETFILTER_XT_MATCH_LIMIT": "y",
-    "CONFIG_NETFILTER_XT_MATCH_MAC": "y",
-    "CONFIG_NETFILTER_XT_MATCH_MARK": "y",
-    "CONFIG_NETFILTER_XT_MATCH_PKTTYPE": "y",
-    "CONFIG_NETFILTER_XT_MATCH_POLICY": "y",
-    "CONFIG_NETFILTER_XT_MATCH_QTAGUID": "y",
-    "CONFIG_NETFILTER_XT_MATCH_QUOTA2": "y",
-    # "CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG": "y", # marlin
-    "CONFIG_NETFILTER_XT_MATCH_QUOTA": "y",
-    "CONFIG_NETFILTER_XT_MATCH_SOCKET": "y",
-    "CONFIG_NETFILTER_XT_MATCH_STATE": "y",
-    "CONFIG_NETFILTER_XT_MATCH_STATISTIC": "y",
-    "CONFIG_NETFILTER_XT_MATCH_STRING": "y",
-    "CONFIG_NETFILTER_XT_MATCH_TIME": "y",
-    "CONFIG_NETFILTER_XT_MATCH_U32": "y",
-    "CONFIG_NETFILTER_XT_TARGET_CLASSIFY": "y",
-    "CONFIG_NETFILTER_XT_TARGET_CONNMARK": "y",
-    "CONFIG_NETFILTER_XT_TARGET_CONNSECMARK": "y",
-    "CONFIG_NETFILTER_XT_TARGET_IDLETIMER": "y",
-    "CONFIG_NETFILTER_XT_TARGET_MARK": "y",
-    "CONFIG_NETFILTER_XT_TARGET_NFLOG": "y",
-    "CONFIG_NETFILTER_XT_TARGET_NFQUEUE": "y",
-    "CONFIG_NETFILTER_XT_TARGET_SECMARK": "y",
-    "CONFIG_NETFILTER_XT_TARGET_TCPMSS": "y",
-    "CONFIG_NETFILTER_XT_TARGET_TPROXY": "y",
-    "CONFIG_NETFILTER_XT_TARGET_TRACE": "y",
-    "CONFIG_NET_CLS_ACT": "y",
-    "CONFIG_NET_CLS_U32": "y",
-    "CONFIG_NET_EMATCH": "y",
-    "CONFIG_NET_EMATCH_U32": "y",
-    "CONFIG_NET_KEY": "y",
-    "CONFIG_NET_SCHED": "y",
-    "CONFIG_NET_SCH_HTB": "y",
-    "CONFIG_NF_CONNTRACK": "y",
-    "CONFIG_NF_CONNTRACK_AMANDA": "y",
-    "CONFIG_NF_CONNTRACK_EVENTS": "y",
-    "CONFIG_NF_CONNTRACK_FTP": "y",
-    "CONFIG_NF_CONNTRACK_H323": "y",
-    "CONFIG_NF_CONNTRACK_IPV4": "y",
-    "CONFIG_NF_CONNTRACK_IPV6": "y",
-    "CONFIG_NF_CONNTRACK_IRC": "y",
-    "CONFIG_NF_CONNTRACK_NETBIOS_NS": "y",
-    "CONFIG_NF_CONNTRACK_PPTP": "y",
-    "CONFIG_NF_CONNTRACK_SANE": "y",
-    "CONFIG_NF_CONNTRACK_SECMARK": "y",
-    "CONFIG_NF_CONNTRACK_TFTP": "y",
-    "CONFIG_NF_CT_NETLINK": "y",
-    "CONFIG_NF_CT_PROTO_DCCP": "y",
-    "CONFIG_NF_CT_PROTO_SCTP": "y",
-    "CONFIG_NF_CT_PROTO_UDPLITE": "y",
-    "CONFIG_NF_NAT": "y",
-    "CONFIG_NO_HZ": "y",
-    "CONFIG_PACKET": "y",
-    "CONFIG_PM_AUTOSLEEP": "y",
-    "CONFIG_PM_WAKELOCKS": "y",
-    "CONFIG_PPP": "y",
-    "CONFIG_PPPOLAC": "y",
-    "CONFIG_PPPOPNS": "y",
-    "CONFIG_PPP_BSDCOMP": "y",
-    "CONFIG_PPP_DEFLATE": "y",
-    "CONFIG_PPP_MPPE": "y",
-    "CONFIG_PREEMPT": "y",
-    "CONFIG_PROFILING": "y",
-    "CONFIG_QFMT_V2": "y",
-    "CONFIG_QUOTA": "y",
-    "CONFIG_QUOTA_NETLINK_INTERFACE": "y",
-    "CONFIG_QUOTA_TREE": "y",
-    "CONFIG_QUOTACTL": "y",
-    # "CONFIG_RANDOMIZE_BASE": "y", # marlin
-    "CONFIG_RTC_CLASS": "y",
-    "CONFIG_RT_GROUP_SCHED": "y",
-    "CONFIG_SECCOMP": "y",
-    "CONFIG_SECURITY": "y",
-    "CONFIG_SECURITY_NETWORK": "y",
-    "CONFIG_SECURITY_PERF_EVENTS_RESTRICT": "y",
-    "CONFIG_SECURITY_SELINUX": "y",
-    # "CONFIG_SETEND_EMULATION": "y", # marlin
-    "CONFIG_STAGING": "y",
-    "CONFIG_SWP_EMULATION": "y",
-    "CONFIG_SYNC": "y",
-    "CONFIG_TUN": "y",
-    # "CONFIG_UID_CPUTIME": "y", # marlin
-    "CONFIG_UNIX": "y",
-    "CONFIG_USB_GADGET": "y",
-    # "CONFIG_USB_CONFIGFS": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_FS": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_MTP": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_PTP": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_ACC": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_AUDIO_SRC": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_UEVENT": "y", # marlin
-    # "CONFIG_USB_CONFIGFS_F_MIDI": "y", # marlin
-    # "CONFIG_USB_OTG_WAKELOCK": "y", # marlin
-    "CONFIG_XFRM_USER": "y",
-}
diff --git a/config/Android.mk b/config/Android.mk
new file mode 100644
index 0000000..f9c3bbb
--- /dev/null
+++ b/config/Android.mk
@@ -0,0 +1,22 @@
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := VtsKernelConfig
+include test/vts/tools/build/Android.host_config.mk
\ No newline at end of file
diff --git a/config/AndroidTest.xml b/config/AndroidTest.xml
new file mode 100644
index 0000000..29d7c7e
--- /dev/null
+++ b/config/AndroidTest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<configuration description="Config for VTS KernelConfigTest">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HostDrivenTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="VtsKernelConfig" />
+        <option name="test-case-path" value="vts/testcases/kernel/config/VtsKernelConfigTest" />
+    </test>
+</configuration>
diff --git a/config/VtsKernelConfigTest.py b/config/VtsKernelConfigTest.py
new file mode 100644
index 0000000..ef70390
--- /dev/null
+++ b/config/VtsKernelConfigTest.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import gzip
+import logging
+import os
+import re
+import shutil
+import tempfile
+
+from vts.runners.host import asserts
+from vts.runners.host import base_test
+from vts.runners.host import const
+from vts.runners.host import keys
+from vts.runners.host import test_runner
+from vts.utils.python.controllers import android_device
+from vts.utils.python.file import file_utils
+
+
+class VtsKernelConfigTest(base_test.BaseTestClass):
+    """Test case which check config options in /proc/config.gz.
+
+    Attributes:
+        _temp_dir: The temporary directory to which /proc/config.gz is copied.
+    """
+
+    PROC_FILE_PATH = "/proc/config.gz"
+    KERNEL_CONFIG_FILE_PATH = "vts/testcases/kernel/config/data"
+    SUPPORTED_KERNEL_VERSIONS = ["3.18", "4.4", "4.9"]
+
+    def setUpClass(self):
+        required_params = [
+            keys.ConfigKeys.IKEY_DATA_FILE_PATH
+        ]
+        self.getUserParams(required_params)
+        self.dut = self.registerController(android_device)[0]
+        self.dut.shell.InvokeTerminal(
+            "KernelConfigTest")  # creates a remote shell instance.
+        self.shell = self.dut.shell.KernelConfigTest
+        self._temp_dir = tempfile.mkdtemp()
+
+    def checkKernelVersion(self):
+        """Validate the kernel version of DUT is a valid O kernel version.
+
+        Returns:
+            string, kernel version of device
+        """
+        cmd = "uname -a"
+        results = self.shell.Execute(cmd)
+        logging.info("Shell command '%s' results: %s", cmd, results)
+
+        match = re.search(r"\d+\.\d+", results[const.STDOUT][0])
+        if match is None:
+            asserts.fail("Failed to detect kernel version of device.")
+        else:
+            kernel_version = match.group(0)
+        logging.info("Detected kernel version: %s", kernel_version)
+
+        asserts.assertTrue(kernel_version in self.SUPPORTED_KERNEL_VERSIONS,
+                           "Detected kernel version '%s' is not one of %s"
+                           % (kernel_version, self.SUPPORTED_KERNEL_VERSIONS))
+
+        return kernel_version
+
+    def parseConfigFileToDict(self, file):
+        """Parse kernel config file to a dictionary.
+
+        Args:
+            file: file object, android-base.cfg or unzipped /proc/config.gz
+
+        Returns:
+            dict: {config_name: config_state}
+        """
+        config_lines = [line.rstrip("\n") for line in file.readlines()]
+        configs = dict()
+
+        for line in config_lines:
+            if line.startswith("#") and line.endswith("is not set"):
+                match = re.search(r"CONFIG_\S+", line)
+                if match is None:
+                    asserts.fail("Failed to parse config file")
+                else:
+                    config_name = match.group(0)
+                config_state = "n"
+            elif line.startswith("CONFIG_"):
+                config_name, config_state = line.split("=", 1)
+                if config_state.startswith(("'", '"')):
+                    config_state = config_state[1:-1]
+            else:
+                continue
+            configs[config_name] = config_state
+
+        return configs
+
+    def testKernelConfigs(self):
+        """Ensures all configs conform to android-base.cfg requirements.
+
+        Detects kernel version of device and validates against appropriate
+        Common Android Kernel android-base.cfg.
+        """
+        logging.info("Testing existence of %s" % self.PROC_FILE_PATH)
+        file_utils.assertPermissionsAndExistence(
+            self.shell, self.PROC_FILE_PATH, file_utils.IsReadOnly)
+
+        logging.info("Validating kernel version of device.")
+        kernel_version = self.checkKernelVersion()
+
+        config_file_path = os.path.join(self.data_file_path,
+            self.KERNEL_CONFIG_FILE_PATH, "android-" + kernel_version,
+            "android-base.cfg")
+        with open(config_file_path, 'r') as config_file:
+            configs = self.parseConfigFileToDict(config_file)
+
+        self.dut.adb.pull("%s %s" % (self.PROC_FILE_PATH, self._temp_dir))
+        logging.info("Adb pull %s to %s", self.PROC_FILE_PATH, self._temp_dir)
+
+        localpath = os.path.join(self._temp_dir, "config.gz")
+        with gzip.open(localpath, "rb") as device_config_file:
+            device_configs = self.parseConfigFileToDict(device_config_file)
+
+        should_be_enabled = []
+        should_not_be_set = []
+        incorrect_config_state = []
+        for config_name, config_state in configs.iteritems():
+            if (config_state == "y" and
+                (config_name not in device_configs or
+                 device_configs[config_name] not in ("y", "m"))):
+                should_be_enabled.append(config_name)
+            elif (config_state == "n" and (config_name in device_configs) and
+                  device_configs[config_name] != "n"):
+                should_not_be_set.append(config_name + "=" +
+                                         device_configs[config_name])
+            elif (config_name in device_configs and
+                  device_configs[config_name] != config_state):
+                incorrect_config_state.append(config_name + "=" +
+                                              device_configs[config_name])
+
+        asserts.assertTrue(
+            len(should_be_enabled) == 0 and len(should_not_be_set) == 0 and
+            len(incorrect_config_state) == 0,
+            ("The following kernel configs should be enabled: [%s]\n"
+             "The following kernel configs should not be set: [%s]\n"
+             "THe following kernel configs have incorrect state: [%s]") %
+            (", ".join(should_be_enabled), ", ".join(should_not_be_set),
+             ", ".join(incorrect_config_state)))
+
+    def tearDownClass(self):
+        """Deletes the temporary directory."""
+        logging.info("Delete %s", self._temp_dir)
+        shutil.rmtree(self._temp_dir)
+
+
+if __name__ == "__main__":
+    test_runner.main()
diff --git a/config/__init__.py b/config/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/config/__init__.py
diff --git a/config/data/android-3.18/android-base.cfg b/config/data/android-3.18/android-base.cfg
new file mode 100644
index 0000000..4e305c7
--- /dev/null
+++ b/config/data/android-3.18/android-base.cfg
@@ -0,0 +1,170 @@
+#  KEEP ALPHABETICALLY SORTED
+# CONFIG_DEVKMEM is not set
+# CONFIG_DEVMEM is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_MODULES is not set
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_USELIB is not set
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_DEVICES=binder,hwbinder,vndbinder
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_LOW_MEMORY_KILLER=y
+CONFIG_ARMV8_DEPRECATED=y
+CONFIG_ASHMEM=y
+CONFIG_AUDIT=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CP15_BARRIER_EMULATION=y
+CONFIG_DEFAULT_SECURITY_SELINUX=y
+CONFIG_EMBEDDED=y
+CONFIG_FB=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_DIAG_DESTROY=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_INET=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_INET_ESP=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IPV6=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_NETFILTER=y
+CONFIG_NETFILTER_TPROXY=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_QTAGUID=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_KEY=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_CT_PROTO_DCCP=y
+CONFIG_NF_CT_PROTO_SCTP=y
+CONFIG_NF_CT_PROTO_UDPLITE=y
+CONFIG_NF_NAT=y
+CONFIG_NO_HZ=y
+CONFIG_PACKET=y
+CONFIG_PM_AUTOSLEEP=y
+CONFIG_PM_WAKELOCKS=y
+CONFIG_PPP=y
+CONFIG_PPPOLAC=y
+CONFIG_PPPOPNS=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_MPPE=y
+CONFIG_PREEMPT=y
+CONFIG_QFMT_V2=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_QUOTA_TREE=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_RTC_CLASS=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_SECCOMP=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SETEND_EMULATION=y
+CONFIG_STAGING=y
+CONFIG_SWITCH=y
+CONFIG_SWP_EMULATION=y
+CONFIG_SYNC=y
+CONFIG_TUN=y
+CONFIG_UID_SYS_STATS=y
+CONFIG_UNIX=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_G_ANDROID=y
+CONFIG_USB_OTG_WAKELOCK=y
+CONFIG_XFRM_USER=y
\ No newline at end of file
diff --git a/config/data/android-4.4/android-base.cfg b/config/data/android-4.4/android-base.cfg
new file mode 100644
index 0000000..2d08ea1
--- /dev/null
+++ b/config/data/android-4.4/android-base.cfg
@@ -0,0 +1,177 @@
+#  KEEP ALPHABETICALLY SORTED
+# CONFIG_DEVKMEM is not set
+# CONFIG_DEVMEM is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_MODULES is not set
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_USELIB is not set
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_DEVICES=binder,hwbinder,vndbinder
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_LOW_MEMORY_KILLER=y
+CONFIG_ARMV8_DEPRECATED=y
+CONFIG_ASHMEM=y
+CONFIG_AUDIT=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CP15_BARRIER_EMULATION=y
+CONFIG_DEFAULT_SECURITY_SELINUX=y
+CONFIG_EMBEDDED=y
+CONFIG_FB=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_DIAG_DESTROY=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_INET=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_INET_ESP=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IPV6=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_NETFILTER=y
+CONFIG_NETFILTER_TPROXY=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_QTAGUID=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_KEY=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_CT_PROTO_DCCP=y
+CONFIG_NF_CT_PROTO_SCTP=y
+CONFIG_NF_CT_PROTO_UDPLITE=y
+CONFIG_NF_NAT=y
+CONFIG_NO_HZ=y
+CONFIG_PACKET=y
+CONFIG_PM_AUTOSLEEP=y
+CONFIG_PM_WAKELOCKS=y
+CONFIG_PPP=y
+CONFIG_PPPOLAC=y
+CONFIG_PPPOPNS=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_MPPE=y
+CONFIG_PREEMPT=y
+CONFIG_PROFILING=y
+CONFIG_QFMT_V2=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_QUOTA_TREE=y
+CONFIG_RANDOMIZE_BASE=y
+CONFIG_RTC_CLASS=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_SECCOMP=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SETEND_EMULATION=y
+CONFIG_STAGING=y
+CONFIG_SWP_EMULATION=y
+CONFIG_SYNC=y
+CONFIG_TUN=y
+CONFIG_UID_SYS_STATS=y
+CONFIG_UNIX=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_F_ACC=y
+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_USB_CONFIGFS_F_MTP=y
+CONFIG_USB_CONFIGFS_F_PTP=y
+CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_OTG_WAKELOCK=y
+CONFIG_XFRM_USER=y
\ No newline at end of file
diff --git a/config/data/android-4.9/android-base.cfg b/config/data/android-4.9/android-base.cfg
new file mode 100644
index 0000000..2d08ea1
--- /dev/null
+++ b/config/data/android-4.9/android-base.cfg
@@ -0,0 +1,177 @@
+#  KEEP ALPHABETICALLY SORTED
+# CONFIG_DEVKMEM is not set
+# CONFIG_DEVMEM is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_MODULES is not set
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_USELIB is not set
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_DEVICES=binder,hwbinder,vndbinder
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_LOW_MEMORY_KILLER=y
+CONFIG_ARMV8_DEPRECATED=y
+CONFIG_ASHMEM=y
+CONFIG_AUDIT=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CP15_BARRIER_EMULATION=y
+CONFIG_DEFAULT_SECURITY_SELINUX=y
+CONFIG_EMBEDDED=y
+CONFIG_FB=y
+CONFIG_HARDENED_USERCOPY=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INET6_AH=y
+CONFIG_INET6_DIAG_DESTROY=y
+CONFIG_INET6_ESP=y
+CONFIG_INET6_IPCOMP=y
+CONFIG_INET=y
+CONFIG_INET_DIAG_DESTROY=y
+CONFIG_INET_ESP=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_IP6_NF_FILTER=y
+CONFIG_IP6_NF_IPTABLES=y
+CONFIG_IP6_NF_MANGLE=y
+CONFIG_IP6_NF_RAW=y
+CONFIG_IP6_NF_TARGET_REJECT=y
+CONFIG_IPV6=y
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_SECURITY=y
+CONFIG_IP_NF_TARGET_MASQUERADE=y
+CONFIG_IP_NF_TARGET_NETMAP=y
+CONFIG_IP_NF_TARGET_REDIRECT=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_NETFILTER=y
+CONFIG_NETFILTER_TPROXY=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_HELPER=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_LIMIT=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_QTAGUID=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG=y
+CONFIG_NETFILTER_XT_MATCH_QUOTA=y
+CONFIG_NETFILTER_XT_MATCH_SOCKET=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
+CONFIG_NETFILTER_XT_MATCH_STRING=y
+CONFIG_NETFILTER_XT_MATCH_TIME=y
+CONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
+CONFIG_NETFILTER_XT_TARGET_TPROXY=y
+CONFIG_NETFILTER_XT_TARGET_TRACE=y
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_CLS_U32=y
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_U32=y
+CONFIG_NET_KEY=y
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_HTB=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_AMANDA=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_FTP=y
+CONFIG_NF_CONNTRACK_H323=y
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_IPV6=y
+CONFIG_NF_CONNTRACK_IRC=y
+CONFIG_NF_CONNTRACK_NETBIOS_NS=y
+CONFIG_NF_CONNTRACK_PPTP=y
+CONFIG_NF_CONNTRACK_SANE=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_TFTP=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_CT_PROTO_DCCP=y
+CONFIG_NF_CT_PROTO_SCTP=y
+CONFIG_NF_CT_PROTO_UDPLITE=y
+CONFIG_NF_NAT=y
+CONFIG_NO_HZ=y
+CONFIG_PACKET=y
+CONFIG_PM_AUTOSLEEP=y
+CONFIG_PM_WAKELOCKS=y
+CONFIG_PPP=y
+CONFIG_PPPOLAC=y
+CONFIG_PPPOPNS=y
+CONFIG_PPP_BSDCOMP=y
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_MPPE=y
+CONFIG_PREEMPT=y
+CONFIG_PROFILING=y
+CONFIG_QFMT_V2=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_QUOTA_TREE=y
+CONFIG_RANDOMIZE_BASE=y
+CONFIG_RTC_CLASS=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_SECCOMP=y
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
+CONFIG_SECURITY_SELINUX=y
+CONFIG_SETEND_EMULATION=y
+CONFIG_STAGING=y
+CONFIG_SWP_EMULATION=y
+CONFIG_SYNC=y
+CONFIG_TUN=y
+CONFIG_UID_SYS_STATS=y
+CONFIG_UNIX=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_F_ACC=y
+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
+CONFIG_USB_CONFIGFS_F_FS=y
+CONFIG_USB_CONFIGFS_F_MIDI=y
+CONFIG_USB_CONFIGFS_F_MTP=y
+CONFIG_USB_CONFIGFS_F_PTP=y
+CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_OTG_WAKELOCK=y
+CONFIG_XFRM_USER=y
\ No newline at end of file